ฉันอ่านหนังสือที่เกี่ยวข้องกับ Hadoop ในช่วงไม่กี่วันที่ผ่านมา ฉันรู้สึกแบบนั้นเล็กน้อยดังนั้นฉันจึงเขียนผลิตภัณฑ์ที่เกี่ยวข้องกับสถิติโดยการเลียนแบบโปรแกรม WordCount
คำอธิบายข้อกำหนด:
ตามรายการขายของซูเปอร์มาร์เก็ตคำนวณระดับความสัมพันธ์ระหว่างสินค้า (นั่นคือนับจำนวนครั้งที่คุณซื้อสินค้า A และสินค้า B ในเวลาเดียวกัน)
รูปแบบข้อมูล:
รายการขายซุปเปอร์มาร์เก็ตนั้นง่ายขึ้นในรูปแบบต่อไปนี้: บรรทัดแสดงรายการและแต่ละผลิตภัณฑ์แบ่งออกเป็น "," ดังแสดงในรูปด้านล่าง:
การวิเคราะห์ข้อกำหนด:
ใช้ MapReduce ใน Hadoop เพื่อคำนวณข้อกำหนดนี้
ฟังก์ชั่นแผนที่ส่วนใหญ่จะแยกผลิตภัณฑ์ที่เกี่ยวข้องผลลัพธ์ผลลัพธ์คือคีย์คือผลิตภัณฑ์ A และค่าคือผลิตภัณฑ์ B. ผลลัพธ์แยกสำหรับผลลัพธ์แรกและสามผลลัพธ์แสดงในรูปด้านล่าง:
เพื่อที่จะนับผลิตภัณฑ์ที่ต้องการเชื่อมโยงกับสองสินค้า A และ B ความสัมพันธ์ระหว่างสินค้าโภคภัณฑ์ A และ B ผลลัพธ์สองผลลัพธ์คือ AB และ BA
ฟังก์ชั่นลดการจัดกลุ่มและนับผลิตภัณฑ์ที่เกี่ยวข้องกับผลิตภัณฑ์ A นั่นคือคำนวณจำนวนครั้งที่แต่ละผลิตภัณฑ์ปรากฏในค่าและผลลัพธ์ผลลัพธ์คือคีย์คือผลิตภัณฑ์ A | ผลิตภัณฑ์ B และค่าคือจำนวนครั้งที่ชุดค่าผสมนี้เกิดขึ้น สำหรับ 5 ระเบียนที่กล่าวถึงข้างต้นวิเคราะห์ค่าคีย์ของ R ในเอาต์พุตแผนที่:
ผ่านการประมวลผลของฟังก์ชันแผนที่บันทึกที่แสดงในรูปด้านล่างจะได้รับ:
ค่าเอาต์พุตค่าในการลดจะถูกจัดกลุ่มและนับและผลลัพธ์จะแสดงในรูปด้านล่าง
ใช้ผลิตภัณฑ์ AB เป็นคีย์รวมจำนวนผลิตภัณฑ์เป็นค่าเป็นเอาต์พุตและผลลัพธ์ผลลัพธ์จะแสดงในรูปด้านล่าง:
การวิเคราะห์กระบวนการดำเนินการตามข้อกำหนดได้สิ้นสุดลงแล้ว มาดูการใช้งานรหัสเฉพาะด้านล่าง
การใช้รหัส:
ฉันจะไม่ให้คำแนะนำรายละเอียดเกี่ยวกับรหัสโปรดดูความคิดเห็นในรหัสสำหรับรายละเอียด
แพ็คเกจ com; นำเข้า java.io.ioException; นำเข้า java.util.hashmap; นำเข้า java.util.map.entry; นำเข้า org.apache.hadoop.conf.configuration; นำเข้า org.apache.hadoop.conf.configured; นำเข้า org.apache.hadoop.fs.path; นำเข้า org.apache.hadoop.io.intwabitle; นำเข้า org.apache.hadoop.io.longwritable; นำเข้า org.apache.hadoop.io.Text; นำเข้า org.apache.hadoop.mapreduce.job; นำเข้า org.apache.hadoop.mapreduce.mapper; นำเข้า org.apache.hadoop.mapreduce.reducer; นำเข้า org.apache.hadoop.mapreduce.lib.input.fileinputformat; นำเข้า org.apache.hadoop.mapreduce.lib.output.fileoutputformat; นำเข้า org.apache.hadoop.mapreduce.lib.output.TextOutputFormat; นำเข้า org.apache.hadoop.util.tool; นำเข้า org.apache.hadoop.util.toolrunner; การทดสอบระดับสาธารณะขยายเครื่องมือดำเนินการที่กำหนดค่า { / ** * คลาสแผนที่ใช้ข้อมูลการประมวลผลข้อมูลล่วงหน้า * คีย์ผลลัพธ์ผลลัพธ์คือผลิตภัณฑ์ค่าและผลิตภัณฑ์ที่เกี่ยวข้อง b * @author lulei * / คลาสคงที่ mapt mapt ขยาย mapper <longwritable, text, text if (! (line == null || "" .equals (line)) {// แยกสตริงผลิตภัณฑ์ [] vs = line.split (","); // การรวมทั้งสองเพื่อสร้างบันทึกสำหรับ (int i = 0; i <(vs.length - 1); i ++) {ถ้า ("" vs.length; คีย์ผลลัพธ์คือผลิตภัณฑ์ A | B ซึ่งเป็นจำนวนการเชื่อมโยง* @author lulei*/คลาสคงที่ระดับสแตติกลดการลดลง <ข้อความ, ข้อความ, ข้อความ, intwritable> {จำนวน int ส่วนตัว; this.count = integer.parseint (countStr);} catch (Exception e) {this.count = 0; hashmap <string, integer> hashmap = new hashmap <string, integer> (); // ใช้แฮชเพื่อนับจำนวนผลิตภัณฑ์เวลา B สำหรับ (ค่าข้อความ: ค่า) {String valuestr = value.toString (); if (hashmap.containskey (valuestr)) {hashmap.put (valuestr, hashmap.get (valuestr) + 1); } else {hashmap.put (valuestr, 1); }} // เอาต์พุตผลลัพธ์สำหรับ (รายการ <สตริง, จำนวนเต็ม> รายการ: hashmap.entryset ()) {ถ้า (entry.getValue ()> = this.count) {// บริบทเอาต์พุตเท่านั้นเขียน (ข้อความใหม่ (keystr + "|" }}}} @Override public int run (string [] arg0) พ่นข้อยกเว้น {// todo วิธีการที่สร้างอัตโนมัติ stub การกำหนดค่า conf = getConf (); conf.set ("count", arg0 [2]); งาน = งานใหม่ (conf); Job.setJobname ("Jobtest"); Job.setOutputFormatClass (TextOutputFormat.class); Job.setOutputkeyclass (text.class); Job.setOutputValUeclass (text.class); Job.setMapperclass (mapt.class); Job.setReducerclass (REDUCET.CLASS); FileInputFormat.addInputPath (งาน, เส้นทางใหม่ (arg0 [0])); fileOutputFormat.setOutputPath (งาน, เส้นทางใหม่ (arg0 [1])); Job.waitforcompletion (จริง); ส่งคืนงานที่ไม่ประสบความสำเร็จ ()? 0: 1; } / ** * @param args * / โมฆะคงที่สาธารณะหลัก (สตริง [] args) {// วิธีการที่สร้างขึ้นอัตโนมัติ toDo stub stub ถ้า (args.length! = 3) {system.exit (-1); } ลอง {int res = toolrunner.run (การกำหนดค่าใหม่ (), การทดสอบใหม่ (), args); System.Exit (res); } catch (exception e) {// todo บล็อก catch block ที่สร้างอัตโนมัติ e.printstacktrace (); - อัปโหลดและเรียกใช้:
จัดทำโปรแกรมลงในไฟล์ JAR และอัปโหลดไปยังกลุ่มเครื่อง อัปโหลดข้อมูลทดสอบไปยังระบบไฟล์แบบกระจาย HDFS เช่นกัน
ภาพหน้าจอของคำสั่งที่ทำงานอยู่จะแสดงในรูปต่อไปนี้:
หลังจากการรันเสร็จสมบูรณ์ให้ตรวจสอบระบบไฟล์ HDFS ที่เกี่ยวข้องดังแสดงในรูปด้านล่าง:
นี่คือโปรแกรม MapReduce ที่สมบูรณ์ ฉันจะเรียนรู้เกี่ยวกับ hadoop ต่อไป ~ ขอบคุณสำหรับการอ่านฉันหวังว่ามันจะช่วยคุณได้ ขอบคุณสำหรับการสนับสนุนเว็บไซต์นี้!