คุณสามารถใช้ตัวอย่างง่ายๆเพื่อแสดงให้เห็นว่า MapReduce คืออะไร:
เราต้องการนับจำนวนครั้งที่แต่ละคำจะปรากฏในไฟล์ขนาดใหญ่ เพราะไฟล์มีขนาดใหญ่เกินไป เราแบ่งไฟล์นี้ออกเป็นไฟล์ขนาดเล็กแล้วจัดเรียงหลายคนให้นับ กระบวนการนี้คือ "แผนที่" จากนั้นรวมตัวเลขที่นับโดยแต่ละคนและนี่คือ "ลด"
หากคุณทำตัวอย่างข้างต้นใน MapReduce คุณต้องสร้างงานงานซึ่งแบ่งไฟล์ออกเป็นบล็อกข้อมูลอิสระหลายบล็อกและกระจายในโหนดเครื่องต่าง ๆ จากนั้นประมวลผลในแบบขนานอย่างสมบูรณ์ผ่านงานแผนที่ที่กระจัดกระจายในโหนดที่แตกต่างกัน MapReduce จะรวบรวมสายเอาต์พุตของแผนที่จากนั้นส่งผลลัพธ์ผลลัพธ์เพื่อลดการประมวลผลขั้นตอนต่อไป
สำหรับกระบวนการดำเนินการเฉพาะของงานจะมีกระบวนการที่เรียกว่า "JobTracker" ที่รับผิดชอบในการประสานงานงานทั้งหมดในกระบวนการดำเนินการของ MapReduce กระบวนการ TaskTracker หลายกระบวนการใช้เพื่อเรียกใช้งานแผนที่แยกต่างหากและรายงานการดำเนินการของงานไปยัง JobTracker ได้ตลอดเวลา หาก TaskTracker รายงานงานหรือล้มเหลวในการรายงานงานของตัวเองเป็นเวลานาน JobTracker จะเริ่ม TaskTracker อีกคนหนึ่งเพื่อดำเนินการจัดทำแผนที่แยกต่างหากอีกครั้ง
(1) สร้างโครงการ Maven ที่เกี่ยวข้องภายใต้ Eclipse โดยอาศัยแพ็คเกจ JAR ดังต่อไปนี้ (คุณสามารถอ้างถึงการกำหนดค่า POM ของโครงการ Hadoop-Mapreduce-Examples ภายใต้แพ็คเกจซอร์สโค้ด Hadoop)
หมายเหตุ: ในการกำหนดค่าปลั๊กอิน maven maven-jar-plugin และระบุ mainclass
<การพึ่งพา> <predency> <roupId> Junit </groupId> <ratifactid> Junit </artifactid> <sersion> 4.11 </เวอร์ชัน> </serpendency> <predency> <roupid> org.apache.hadoop </groupid> <ratifactid> <roupId> org.apache.hadoop </groupId> <ratifactid> hadoop-common </artifactid> <sersion> 2.5.2 </เวอร์ชัน> </perentency> </pendencies> <uffect> <build> <Rarchive> <Manifest> <mainclass> com.xxx.demo.hadoop.wordcount.wordcount </mainclass> </manifest> </archive>
(2) ตามกลไกการดำเนินงานของ MapReduce งานจะต้องเขียนอย่างน้อยสามคลาสเพื่อให้เสร็จสิ้นสามสิ่ง: ตรรกะแผนที่ลดตรรกะและการกำหนดเวลางาน
รหัสของแผนที่สามารถสืบทอด org.apache.hadoop.mapreduce.mapper คลาส
Tokenizermapper ระดับสาธารณะแบบคงที่ขยาย Mapper <Object, Text, Text, Intwlitable> {ส่วนตัวสุดท้ายคงที่ one one = ใหม่ intwlitable (1); ข้อความข้อความส่วนตัว = ข้อความใหม่ (); // เนื่องจากตัวอย่างนี้ไม่ได้ใช้พารามิเตอร์คีย์ประเภทของคีย์จึงถูกระบุเป็นแผนที่โมฆะสาธารณะวัตถุ (คีย์วัตถุค่าข้อความบริบทบริบท) พ่น IOException, interruptedException {StringTokenizer ITR = StringTokenizer ใหม่ ในขณะที่ (itr.hasmoretokens ()) {word.set (itr.nexttoken ()); Context.write (Word, One); -ลดรหัสของสามารถสืบทอด org.apache.hadoop.mapreduce.Dreducer คลาส
คลาสสาธารณะ intsumreducer ขยายตัวลดลง <ข้อความ, intwlitable, text, intwlitable> {ผลการเขียนแบบส่วนตัว = ใหม่ intwlitable (); โมฆะสาธารณะลดลง (คีย์ข้อความ, การติดตั้งซ้ำ <intwlitable>, บริบทบริบท) โยน ioexception, interruptedException {int sum = 0; สำหรับ (intwlitable val: ค่า) {sum += val.get (); } result.set (ผลรวม); บริบทการเขียน (คีย์ผลลัพธ์); -เขียนวิธีหลักสำหรับการจัดตารางงาน
โมฆะคงที่สาธารณะหลัก (String [] args) โยนข้อยกเว้น {การกำหนดค่า conf = การกำหนดค่าใหม่ (); Job Job = Job.getInstance (conf, "count word"); Job.setJarbyClass (WordCount.class); Job.setMapperclass (tokenizermapper.class); Job.setCombinerclass (intsumreducer.class); Job.setReducerclass (intsumreducer.class); Job.setOutputkeyclass (text.class); job.setOutputValUeclass (intwritable.class); FileInputFormat.addInputPath (งาน, เส้นทางใหม่ (args [0])); fileOutputFormat.setOutputPath (งาน, เส้นทางใหม่ (args [1])); Job.waitforcompletion (จริง); //system.exit (job.waitforcompletion(true)? 0: 1); -ดำเนินการติดตั้ง MVN เพื่อพิมพ์โครงการลงในไฟล์ JAR และอัปโหลดไปยังสภาพแวดล้อมคลัสเตอร์ Linux ใช้คำสั่ง HDFS DFS -MKDIR เพื่อสร้างคำสั่งที่เกี่ยวข้องในระบบไฟล์ HDFS ใช้ HDFS DFS -put เพื่ออัปโหลดไฟล์ข้อมูลที่ต้องประมวลผลไปยังระบบ HDFS ตัวอย่าง: hdfs dfs -put $ {linux_path/ไฟล์ข้อมูล} $ {hdfs_path}
ดำเนินการคำสั่งในสภาพแวดล้อมคลัสเตอร์: hadoop jar $ {linux_path} /wordcount.jar $ {hdfs_input_path} $ {hdfs_output_path}
hdfs dfs -cat $ {hdfs_output_path}/ชื่อไฟล์เอาต์พุต
วิธีการข้างต้นทำงานในโหมดท้องถิ่นเมื่อสภาพแวดล้อมคลัสเตอร์ Hadoop ไม่ได้เริ่มต้น ในเวลานี้ทั้ง HDFs และเส้นด้ายไม่ได้ทำงาน ต่อไปนี้เป็นงานที่คุณต้องทำเมื่อดำเนินงาน MapReduce Job ในโหมด Distributed Pseudo ก่อนอื่นให้ตัดตอนขั้นตอนที่ระบุไว้ในเว็บไซต์อย่างเป็นทางการ:
กำหนดค่าชื่อโฮสต์
# vi /etc/sysconfig/network
ตัวอย่างเช่น:
Networking = yeshostName = mastervi /etc /hosts
กรอกเนื้อหาต่อไปนี้
127.0.0.1 localhost
กำหนดค่า SSH โดยไม่มีการสื่อสารผ่านรหัสผ่าน
ssh-keygen -t rsa
# cat?~/.ssh/id_rsa.pub?>>?~/.ssh/authorized_keys
กำหนดค่าไฟล์ core-site.xml (อยู่ที่ $ {hadoop_home}/etc/hadoop/
<การกำหนดค่า> <property> <name> fs.defaultfs </name> <dance> hdfs: // localhost: 9000 </alue> </porement> </การกำหนดค่า>
กำหนดค่าไฟล์ hdfs-site.xml
<การกำหนดค่า> <property> <name> dfs.replication </name> <dance> 1 </alue> </porement> </pormation>
คำสั่งต่อไปนี้สามารถเรียกใช้งาน MapReduce ในโหมดการแจกแจงแบบสแตนด์อโลน
1. ฟอร์มระบบไฟล์:
$ bin/hdfs namenode -format
2. เริ่มต้น Namenode Daemon และ Datanode Daemon:
$ sbin/start-dfs.sh
3. เอาต์พุตบันทึก Hadoop Daemon ถูกเขียนไปยังไดเรกทอรี $ hadoop_log_dir (ค่าเริ่มต้นถึง $ hadoop_home/logs)4.Browse เว็บอินเตอร์เฟสสำหรับ namenode; โดยค่าเริ่มต้นมีอยู่ที่:
Namenode - http: // localhost: 50070/
ทำให้ไดเรกทอรี HDFS จำเป็นต้องใช้งาน MapReduce Jobs:
$ bin /hdfs dfs -mkdir /ผู้ใช้
$ bin/hdfs dfs -mkdir/user/<ผู้ใช้>
5. คัดลอกไฟล์อินพุตลงในระบบไฟล์แบบกระจาย:
$ bin/hdfs dfs -put ฯลฯ อินพุต
6. นำตัวอย่างบางส่วนมาให้:
$ bin/hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.5.2.jar grep อินพุตอินพุต 'dfs [az.]+'
7. ตรวจสอบไฟล์เอาต์พุต:
คัดลอกไฟล์เอาต์พุตจากระบบไฟล์แบบกระจายไปยังระบบไฟล์ท้องถิ่นและตรวจสอบ:$ BIN/HDFS DFS -เอาต์พุตเอาต์พุต
$ cat output/*
หรือดูไฟล์เอาต์พุตในระบบไฟล์แบบกระจาย:
$ BIN/HDFS DFS -CAT เอาต์พุต/*
8. เมื่อเสร็จแล้วให้หยุด Daemons ด้วย:
$ sbin/stop-dfs.sh
ข้างต้นเป็นเนื้อหาทั้งหมดของรหัสอินสแตนซ์ WordCount ในบทความนี้ฉันหวังว่ามันจะเป็นประโยชน์กับทุกคน เพื่อนที่สนใจสามารถอ้างถึงหัวข้ออื่น ๆ ที่เกี่ยวข้องในเว็บไซต์นี้ต่อไป หากมีข้อบกพร่องใด ๆ โปรดฝากข้อความไว้เพื่อชี้ให้เห็น ขอบคุณเพื่อนที่ให้การสนับสนุนเว็บไซต์นี้!