ผู้เริ่มต้น Hadoop หลายคนอาจเหมือนกัน เนื่องจากมีทรัพยากรเครื่องไม่เพียงพอฉันจึงสามารถสร้างการกระจายแบบหลอกของ Hadoop ที่ติดตั้งในเครื่องเสมือนเท่านั้น จากนั้นฉันใช้ Eclipse หรือ Intellij Idea ใน Win7 เพื่อเขียนการทดสอบรหัส ดังนั้นคำถามคือวิธีส่งแผนที่/ลดงานไปจากระยะไกลไปยัง Hadoop ระยะไกลและการดีบักเบรกพอยต์ใน Win7
1. การเตรียม
1.1 ใน Win7 ค้นหาไดเรกทอรีและคลายการบีบอัด Hadoop-2.6.0 ในบทความนี้ d: /yangjm/code/study/hadoop/hadoop-2.6.0 (ต่อไปนี้แสดงโดย $ hadoop_home)
1.2 เพิ่มตัวแปรสภาพแวดล้อมหลายอย่างใน Win7
hadoop_home = d: /yangjm/code/study/hadoop/hadoop-2.6.0
hadoop_bin_path =%hadoop_home%/bin
hadoop_prefix = d: /yangjm/code/study/hadoop/hadoop-2.6.0
นอกจากนี้ตัวแปรพา ธ จะถูกผนวกเข้ามาในตอนท้าย %hadoop_home%/bin
2. Eclipse Remote Debugging
1.1 ดาวน์โหลดปลั๊กอิน hadoop-eclipse-plugin
Hadoop-Eclipse-Plugin เป็นปลั๊กอิน Hadoop ที่ใช้เป็นพิเศษสำหรับ eclipse ซึ่งสามารถดูไดเรกทอรีและเนื้อหาไฟล์ของ HDFs โดยตรงในสภาพแวดล้อม IDE ซอร์สโค้ดของมันโฮสต์บน GitHub และที่อยู่เว็บไซต์อย่างเป็นทางการคือ https://github.com/winghc/hadoop2x-eclipse-plugin
หากคุณสนใจคุณสามารถดาวน์โหลดซอร์สโค้ดและรวบรวมด้วยตัวเอง Baidu จะใช้บทความมากมาย แต่ถ้าคุณเพิ่งใช้ https://github.com/winghc/hadoop2x-eclipse-plugin/tree/master/release%20 มีการรวบรวมเวอร์ชันต่างๆที่นี่ เพียงแค่ใช้โดยตรง คัดลอก hadoop-eclipse-plugin-2.6.0.jar ไปยังไดเรกทอรี Eclipse/Plugins จากนั้นรีสตาร์ท Eclipse ทุกอย่างเสร็จแล้ว
1.2 ดาวน์โหลดแพ็คเกจปลั๊กอิน Hadoop2.6 สำหรับแพลตฟอร์ม Windows64-bit (hadoop.dll, winutils.exe)
ภายใต้ Hadoop-common-project/hadoop-common/src/main/winutils ในซอร์สโค้ด Hadoop2.6.0 มีโครงการ vs.net การรวบรวมโครงการนี้สามารถรับไฟล์และไฟล์เอาต์พุตนี้ได้
hadoop.dll และ winutils.exe มีประโยชน์มากที่สุด คัดลอก winutils.exe ไปยังไดเรกทอรี $ hadoop_home/bin และคัดลอกไดเรกทอรี %windir %/system32 (ส่วนใหญ่เพื่อป้องกันไม่ให้ปลั๊กอินรายงานข้อผิดพลาดที่อธิบายไม่ได้เช่นการอ้างอิงวัตถุเปล่า)
หมายเหตุ: หากคุณไม่ต้องการคอมไพล์คุณสามารถดาวน์โหลดไฟล์ที่รวบรวมได้โดยตรง hadoop2.6 (x64) v0.2.rar
1.3 การกำหนดค่าปลั๊กอิน hadoop-eclipse-plugin
เริ่ม Eclipse, Windows-> แสดง view-> อื่น ๆ
Window-> Preferences-> Hadoop Map/ลดการระบุไดเรกทอรีรากของ Hadoop บน Win7 (เช่น: $ hadoop_home)
จากนั้นในแผงแผนที่/ลดตำแหน่งสถานที่ให้คลิกไอคอน Baby Elephant
เพิ่มตำแหน่ง
อินเทอร์เฟซนี้มีความสำคัญมาก ฉันจะอธิบายพารามิเตอร์หลายตัว:
ชื่อตำแหน่ง เป็นเพียงชื่อเพียงแค่เรียกมันว่า
แผนที่/ลด (v2) โฮสต์หลัก ที่นี่คือที่อยู่ IP ที่สอดคล้องกับ Hadoop Master ในเครื่องเสมือน พอร์ตด้านล่างสอดคล้องกับพอร์ตที่ระบุโดยแอตทริบิวต์ dfs.datanode.ipc.address ใน hdfs-site.xml
พอร์ตหลัก DFS: พอร์ตที่นี่สอดคล้องกับพอร์ตที่ระบุโดย fs.defaultfs ใน core-site.xml
ชื่อผู้ใช้สุดท้ายควรเหมือนกับชื่อผู้ใช้ที่รัน Hadoop ในเครื่องเสมือน ฉันติดตั้งและวิ่ง Hadoop 2.6.0 กับ Hadoop ดังนั้นเติม Hadoop ที่นี่ หากคุณติดตั้งด้วยรูทให้เปลี่ยนเป็นรูทตามนั้น
หลังจากระบุพารามิเตอร์เหล่านี้ให้คลิกเสร็จสิ้นและคราสเพื่อทราบวิธีการเชื่อมต่อกับ Hadoop หากทุกอย่างเป็นไปด้วยดีคุณสามารถเห็นไดเรกทอรีและไฟล์ใน HDFS ในแผง Project Explorer
คุณสามารถคลิกขวาที่ไฟล์และเลือกลบเพื่อลอง โดยปกติแล้วครั้งแรกจะไม่ประสบความสำเร็จและจะมีหลายสิ่งหลายอย่าง แนวคิดทั่วไปคือมีสิทธิ์ไม่เพียงพอ เหตุผลก็คือผู้ใช้ Win7 เข้าสู่ระบบปัจจุบันไม่ได้เป็นผู้ใช้ที่รันอยู่ของ Hadoop ในเครื่องเสมือน มีวิธีแก้ปัญหามากมาย ตัวอย่างเช่นคุณสามารถสร้างผู้ใช้ Hadoop Administrator ใหม่บน Win7 จากนั้นเปลี่ยนเป็น Hadoop เพื่อเข้าสู่ระบบ Win7 จากนั้นใช้ Eclipse เพื่อพัฒนา อย่างไรก็ตามนี่เป็นวิธีที่น่ารำคาญเกินไปวิธีที่ง่ายที่สุด:
เพิ่มใน hdfs-site.xml
<property> <name> dfs.permissions </name> <dance> false </value> </porement>
จากนั้นในเครื่องเสมือนให้เรียกใช้ Hadoop dfsadmin -safemode ออกไป
เพื่อความปลอดภัยอีก hadoop fs -chmod 777 /
กล่าวโดยย่อคือการปิดการตรวจจับความปลอดภัยของ Hadoop อย่างสมบูรณ์ (ไม่จำเป็นต้องใช้สิ่งเหล่านี้ในขั้นตอนการเรียนรู้อย่าทำสิ่งนี้เมื่อมีการผลิตอย่างเป็นทางการ) ในที่สุดก็เริ่มต้น Hadoop จากนั้นไปที่ Eclipse และทำซ้ำการดำเนินการไฟล์ลบตอนนี้
1.4 การสร้างโครงการตัวอย่าง woldcount
สร้างโครงการใหม่และเลือกแผนที่/ลดโครงการ
เพียงแค่วางถัดไปบน wodcount.java รหัสมีดังนี้:
แพ็คเกจ yjmyzz; นำเข้า java.io.ioexception; นำเข้า java.util.stringTokenizer; นำเข้า org.apache.hadoop.conf.configuration; นำเข้า org.apache.hadoop.fs.path; นำเข้า org.apache.hadoop.io.intwable; org.apache.hadoop.mapreduce.mapper; นำเข้า org.apache.hadoop.mapreduce.reducer; นำเข้า org.apache.hadoop.mapreduce.lib.input.fileinputformat; นำเข้า org.apache.hadoop.mapreduce org.apache.hadoop.util.enericoptionsparser; คลาสสาธารณะ WordCount {คลาสคงที่สาธารณะ Tokenizermapper ขยาย Mapper <วัตถุ, ข้อความ, ข้อความ, intwritable> {ส่วนตัวสุดท้ายคงที่ one one = ใหม่ intwlable (1); ข้อความข้อความส่วนตัว = ข้อความใหม่ (); แผนที่โมฆะสาธารณะ (คีย์วัตถุ, ค่าข้อความ, บริบทบริบท) พ่น IOException, interruptedException {StringTokenizer ITR = ใหม่ StringTokenizer (value.toString ()); ในขณะที่ (itr.hasmoretokens ()) {word.set (itr.nexttoken ()); Context.write (Word, One); }}} คลาสสแตติกสาธารณะ intsumreducer ขยายตัวลด <ข้อความ, intwlitable, ข้อความ, intwlitable> {ผล private intwlitable = new intwabitle (); โมฆะสาธารณะลดลง (คีย์ข้อความ, การติดตั้งซ้ำ <intwlitable>, บริบทบริบท) โยน ioexception, interruptedException {int sum = 0; สำหรับ (intwlitable val: ค่า) {sum += val.get (); } result.set (ผลรวม); บริบทการเขียน (คีย์ผลลัพธ์); }} โมฆะคงที่สาธารณะหลัก (สตริง [] args) พ่นข้อยกเว้น {การกำหนดค่า conf = การกำหนดค่าใหม่ (); String [] otherArgs = new genericoptionsparser (conf, args) .getRemainingArgs (); if (otherargs.length <2) {system.err.println ("การใช้งาน: WordCount <in> [<in> ... ] <Out>"); System.Exit (2); } งาน 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); สำหรับ (int i = 0; i <otherargs.length - 1; ++ i) {fileinputformat.addinputpath (งาน, เส้นทางใหม่ (อื่น ๆ [i])); } fileOutputFormat.setOutputPath (งาน, เส้นทางใหม่ (อื่น ๆ artargs [otherargs.length - 1])); System.Exit (job.waitforcompletion (จริง)? 0: 1); -จากนั้นใส่ log4j.properties เนื้อหามีดังนี้: (เพื่อความสะดวกในการทำงานให้ตรวจสอบผลลัพธ์ต่างๆ)
log4j.rootlogger = ข้อมูล stdout#log4j.logger.org.springframework = ข้อมูล#log4j.logger.org.apache.activemq = ข้อมูล#log4j.logger.org.apache Activemq.spring = เตือน#log4j.logger.org.apache.activemq.store.journal = info#log4j.logger.org.apache.activemq.or.or g.active.journal = infolog4j.appender.stdout = org.apache.log4j.consoleAppenderlog4j.appender.stdout.layout = org.apache.log4j.patternlayoutlog4j.appender.stdout.layout %-5.5p | %-16.16T | %-32.32C {1} | %-32.32C %4L | %m%nโครงสร้างไดเรกทอรีสุดท้ายมีดังนี้:
จากนั้นคุณสามารถเรียกใช้ได้แน่นอนว่ามันจะไม่ประสบความสำเร็จเพราะไม่มีการป้อนพารามิเตอร์สำหรับ WordCount โปรดดูรูปต่อไปนี้:
1.5 ตั้งค่าพารามิเตอร์การทำงาน
เนื่องจาก WordCount คือการป้อนไฟล์เพื่อนับคำแล้วเอาต์พุตไปยังโฟลเดอร์อื่นดังนั้นให้พารามิเตอร์สองพารามิเตอร์โปรดดูรูปด้านบนป้อนในอาร์กิวเมนต์ของโปรแกรม
hdfs: //172.28.20.xxx: 9000/jimmy/input/readme.txt
hdfs: //172.28.20.xxx: 9000/jimmy/output/
โปรดดูสิ่งนี้เพื่อเปลี่ยน (ส่วนใหญ่แทนที่ IP ด้วย IP ในเครื่องเสมือนของคุณ) โปรดทราบว่าหากไฟล์ input/readm.txt ไม่มีโปรดอัปโหลดด้วยตนเองก่อนแล้ว/เอาต์พุต/ต้องไม่มีอยู่ มิฉะนั้นหากโปรแกรมทำงานจนจบและพบว่ามีการรายงานไดเรกทอรีเป้าหมายจะมีการรายงานข้อผิดพลาด หลังจากนี้คุณสามารถตั้งค่าเบรกพอยต์ในตำแหน่งที่เหมาะสมและในที่สุดคุณก็สามารถดีบักได้:
3. Intellij Idea Remote Debugging Hadoop
3.1 สร้างโครงการ Maven WordCount
ไฟล์ POM มีดังนี้:
<? xml version = "1.0" การเข้ารหัส = "utf-8"?> <project xmlns = "http://maven.apache.org/pom/4.0.0" xmlns: xsi = "http://www.w3.org/2001/ XSI: schemalocation = "http://maven.apache.org/pom/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" <ArtIfactId> MapReduce-HellowOrld </artifactid> <sersion> 1.0-snapshot </เวอร์ชัน> <การพึ่งพา> <การพึ่งพา> <GroupId> org.apache.hadoop </groupId> <ArtIfactId> Hadoop-common </artifactid> <ArtIfactId> hadoop-mapreduce-client-jobclient </artifactid> <cersion> 2.6.0 </เวอร์ชัน> </การพึ่งพา> <การพึ่งพาอาศัย> <loupid> Commons-cli </groupid> <TinalName> $ {project.artifactId} </minname> </uffer> </project>โครงสร้างโครงการมีดังนี้:
คลิกขวาที่โครงการ -> การตั้งค่าโมดูลเปิดหรือกด F12 เพื่อเปิดคุณสมบัติโมดูล
การเพิ่มการอ้างอิง libary การพึ่งพา
จากนั้นนำเข้าแพ็คเกจที่เกี่ยวข้องทั้งหมดภายใต้ $ hadoop_home
Libary ที่นำเข้าสามารถตั้งชื่อได้เช่น Hadoop2.6
3.2 ตั้งค่าพารามิเตอร์การทำงาน
หมายเหตุสองสถานที่ :
1 คือโปรแกรมโปรแกรมซึ่งคล้ายกับ Eclipes ระบุไฟล์อินพุตและโฟลเดอร์เอาต์พุต
2 คือไดเรกทอรีการทำงานนั่นคือไดเรกทอรีการทำงานที่ระบุเป็นไดเรกทอรีที่ $ hadoop_home ตั้งอยู่
จากนั้นคุณสามารถดีบัก
สิ่งเดียวที่ไม่มีความสุขภายใต้ Intellij คือไม่มีปลั๊กอิน Hadoop คล้ายกับคราส ทุกครั้งที่คุณเรียกใช้ WordCount คุณสามารถลบไดเรกทอรีเอาต์พุตด้วยตนเองบนบรรทัดคำสั่งแล้วแก้ไขข้อบกพร่อง ในการแก้ปัญหานี้คุณสามารถปรับปรุงรหัส WordCount และลบไดเรกทอรีเอาต์พุตก่อนที่จะทำงานดูรหัสต่อไปนี้:
แพ็คเกจ yjmyzz; นำเข้า java.io.ioexception; นำเข้า java.util.stringTokenizer; นำเข้า org.apache.hadoop.conf.configuration; นำเข้า org.apache.hadoop.fs.filesystem; นำเข้า org.apache.hadoop.fs.path; org.apache.hadoop.mapreduce.job; นำเข้า org.apache.hadoop.mapreduce.mapper; นำเข้า org.apache.hadoop.mapreduce.reducer; นำเข้า org.apache.hadoop.mapreduce.lib.input.libput.lib.lib.input.lib.lib.input.lib.lib.input.lib.lib.input.lib.lib.lib.lib.lib.lib.input.lib.lib.lib.lib.lib.lib.lib.lib.lib.lib.lib.lib.lib.lib.lib.lib.lib.lib.lib.lib.lib.lib.lib.lib.lib.lib.lib.lib.lib.lib.lib org.apache.hadoop.util.enericoptionsparser; คลาสสาธารณะ WordCount {คลาสคงที่สาธารณะ Tokenizermapper ขยาย Mapper <วัตถุ, ข้อความ, ข้อความ, intwritable> {ส่วนตัวสุดท้ายคงที่ one one = ใหม่ intwlable (1); ข้อความข้อความส่วนตัว = ข้อความใหม่ (); แผนที่โมฆะสาธารณะ (คีย์วัตถุ, ค่าข้อความ, บริบทบริบท) พ่น IOException, interruptedException {StringTokenizer ITR = ใหม่ StringTokenizer (value.toString ()); ในขณะที่ (itr.hasmoretokens ()) {word.set (itr.nexttoken ()); Context.write (Word, One); }}} คลาสสแตติกสาธารณะ intsumreducer ขยายตัวลด <ข้อความ, intwlitable, ข้อความ, intwlitable> {ผล private intwlitable = new intwabitle (); โมฆะสาธารณะลดลง (คีย์ข้อความ, การติดตั้งซ้ำ <intwlitable>, บริบทบริบท) โยน ioexception, interruptedException {int sum = 0; สำหรับ (intwlitable val: ค่า) {sum += val.get (); } result.set (ผลรวม); บริบทการเขียน (คีย์ผลลัพธ์); }} / ** * ลบไดเรกทอรีที่ระบุ * * @param conf * @param dirpath * @throws ioexception * / โมฆะส่วนตัวคงที่ deletedir (การกำหนดค่า conf, สตริง dirpath) โยน ioexception {filesystem fs = filesystem.get (conf); PATH TargetPath = เส้นทางใหม่ (DIRPATH); ถ้า (fs.exists (targetath)) {boolean delresult = fs.delete (targetath, true); if (delresult) {system.out.println (TargetPath + "ถูกลบไปอย่างประสบความสำเร็จ"); } else {system.out.println (TargetPath + "การลบล้มเหลว"); }}} โมฆะคงที่สาธารณะหลัก (สตริง [] args) พ่นข้อยกเว้น {การกำหนดค่า conf = การกำหนดค่าใหม่ (); String [] otherArgs = new genericoptionsparser (conf, args) .getRemainingArgs (); if (otherargs.length <2) {system.err.println ("การใช้งาน: WordCount <in> [<in> ... ] <Out>"); System.Exit (2); } // ลบไดเรกทอรีเอาท์พุท First DELETEDIR (Conf, OtherArgs [otherargs.length - 1]); 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); สำหรับ (int i = 0; i <otherargs.length - 1; ++ i) {fileinputformat.addinputpath (งาน, เส้นทางใหม่ (อื่น ๆ [i])); } fileOutputFormat.setOutputPath (งาน, เส้นทางใหม่ (อื่น ๆ artargs [otherargs.length - 1])); System.Exit (job.waitforcompletion (จริง)? 0: 1); - แต่นี่ไม่เพียงพอ เมื่อทำงานในสภาพแวดล้อม IDE, IDE จำเป็นต้องรู้ว่าอินสแตนซ์ HDFS ใดที่จะเชื่อมต่อกับ (เป็นเหมือนในการพัฒนา DB คุณต้องระบุแหล่งข้อมูลในการกำหนดค่า XML) คัดลอก core-site.xml ภายใต้ $ hadoop_home/etc/hadoop ไปยังไดเรกทอรีทรัพยากร
เนื้อหามีดังนี้:
<? xml version = "1.0" การเข้ารหัส = "utf-8"?> <? xml-stylesheet type = "text/xsl" href = "configuration.xsl"
เพียงแทนที่ IP ด้านบนด้วย IP ในเครื่องเสมือน