สำหรับรายละเอียดเกี่ยวกับการก่อสร้างสภาพแวดล้อม Hadoop โปรดดูบทความนี้ //www.vevb.com/article/33649.htm
เรารู้อยู่แล้วว่า Hadoop สามารถเรียกผ่านบรรทัดคำสั่งผ่านรูปแบบของ Hadoop Jar *** เอาต์พุตอินพุตของ Jar ดังนั้นคุณจะห่อหุ้มมันลงในบริการและปล่อยให้ Java/Web เรียกมันได้อย่างไร? สิ่งนี้ช่วยให้ผู้ใช้สามารถอัปโหลดไฟล์ไปยัง Hadoop ได้อย่างสะดวกและดำเนินการเพื่อให้ได้ผลลัพธ์ ก่อนอื่น ***. jar คือการห่อหุ้มของคลาสงาน Hadoop เราสามารถเรียกใช้วิธีหลักของชั้นเรียนโดยไม่ต้องขวดและส่งพารามิเตอร์ที่จำเป็นไป อินพุตและเอาท์พุททำให้ไฟล์อัปโหลดโดยผู้ใช้ในระบบไฟล์ Hadoop โดยใช้ Javaapi ของ Hadoop จากนั้นใช้ Java API ของ Hadoop เพื่อรับไฟล์ผลลัพธ์จากระบบไฟล์
สร้างโครงการ Javaweb บทความนี้ใช้เฟรมเวิร์ก Spring, SpringMVC และ MyBatis แน่นอนว่านี่ไม่ใช่ประเด็นและสามารถทำได้แม้จะไม่ได้ใช้กรอบใด ๆ ก็ตาม
กรอบโครงการมีดังนี้:
แพ็คเกจขวดที่ใช้ในโครงการมีดังนี้:
ในไฟล์กำหนดค่าของฤดูใบไม้ผลิเพิ่ม
<bean id = "multipartresolver"> <property name = "defaultEncoding" value = "utf-8" /> <property name = "maxuploadsize" value = "10485760000" /> <property name = "MaxinMemorySize" value = "40960" />
อัปโหลดไฟล์สนับสนุนโครงการ
สร้าง login.jsp ใหม่คลิกเพื่อเข้าสู่ระบบและป้อนผู้ใช้/เข้าสู่ระบบ
กระบวนการเข้าสู่ระบบในผู้ใช้/เข้าสู่ระบบ หลังจากเข้าสู่ระบบสำเร็จ [สร้างโฟลเดอร์ผู้ใช้ในระบบไฟล์ Hadoop] จากนั้นข้ามไปที่ Console.jsp
แพ็คเกจ com.chenjie.controller; นำเข้า java.io.ioException; นำเข้า Javax.annotation.Resource; นำเข้า javax.servlet.http.httpservletrequest; นำเข้า Javax.servlet.http.httpservletResponse; นำเข้า org.apache.hadoop.conf.configuration; นำเข้า org.apache.hadoop.fs.filesystem; นำเข้า org.apache.hadoop.fs.path; นำเข้า org.springframework.stereotype.controller; นำเข้า org.springframework.web.bind.annotation.requestmapping; นำเข้า com.chenjie.pojo.jsonresult; นำเข้า com.chenjie.pojo.user; นำเข้า com.chenjie.service.userservice; นำเข้า com.chenjie.util.appconfig; นำเข้า com.google.gson.gson; /** * ตัวควบคุมคำขอผู้ใช้ * * @author chen * */@controller // ประกาศคลาสปัจจุบันเป็นคอนโทรลเลอร์ @requestmapping ("/ผู้ใช้") // ประกาศเส้นทางของคลาสสาธารณะคลาสสาธารณะ userController {@Resource (name = "userservice") ผู้ใช้ส่วนตัว @Param Request * @param Response * @throws ioexception */@requestmapping ("/login") // ประกาศเส้นทางของวิธีการในปัจจุบันสตริงสาธารณะเข้าสู่ระบบ (ผู้ใช้ผู้ใช้ httpservletrequest คำขอ httpservletResponse) การตอบสนองการตอบสนองของผู้ใช้ userservice.login (ผู้ใช้); // เรียกวิธีการเข้าสู่ระบบของ userservice request.getSession (). setAttribute ("ผู้ใช้", ผลลัพธ์); if (ผลลัพธ์! = null) {createHadoopfsfolder (ผลลัพธ์); กลับ "คอนโซล"; } return "เข้าสู่ระบบ"; } โมฆะสาธารณะ CreateHadoopfsFolder (ผู้ใช้ผู้ใช้) พ่น IOException {การกำหนดค่า conf = การกำหนดค่าใหม่ (); conf.addresource (เส้นทางใหม่ ("/opt/hadoop-1.2.1/conf/core-site.xml")); conf.addresource (เส้นทางใหม่ ("/opt/hadoop-1.2.1/conf/hdfs-site.xml")); ระบบไฟล์ filesystem = filesystem.get (conf); System.out.println (filesystem.geturi ()); ไฟล์พา ธ = พา ธ ใหม่ ("/ผู้ใช้/" + user.getu_username ()); if (filesystem.exists (ไฟล์)) {system.out.println ("ผู้ใช้ Haddop HDFS มีอยู่"); filesystem.delete (ไฟล์จริง); System.out.println ("Haddop HDFS ผู้ใช้ลบความสำเร็จ"); } filesystem.mkdirs (ไฟล์); System.out.println ("Haddop HDFS ผู้ใช้ foler creat success"); -console.jsp เพื่ออัปโหลดไฟล์และส่งงาน
การอัปโหลดไฟล์และการส่งงาน:
แพ็คเกจ com.chenjie.controller; นำเข้า Java.io.File; นำเข้า java.io.ioException; นำเข้า java.net.inetsocketaddress; นำเข้า Java.net.uri; นำเข้า java.util.arraylist; นำเข้า java.util.iterator; นำเข้า java.util.list; นำเข้า javax.servlet.http.httpservletrequest; นำเข้า Javax.servlet.http.httpservletResponse; นำเข้า org.apache.hadoop.conf.configuration; นำเข้า org.apache.hadoop.fs.fsdatainputstream; นำเข้า org.apache.hadoop.fs.filesystem; นำเข้า org.apache.hadoop.mapred.jobclient; นำเข้า org.apache.hadoop.mapred.jobconf; นำเข้า org.apache.hadoop.mapred.jobid; นำเข้า org.apache.hadoop.mapred.jobstatus; นำเข้า org.apache.hadoop.mapred.runningjob; นำเข้า org.springframework.steretype.controller; นำเข้า org.springframework.web.bind.annotation.requestmapping; นำเข้า org.springframework.web.multipart.multipartfile; นำเข้า org.springframework.web.multipart.multiparthttpservletrequest; นำเข้า org.springframework.web.multipart.Commons.CommonsMultipartResolver; นำเข้า com.chenjie.pojo.user; นำเข้า com.chenjie.util.utils; @Controller // ประกาศคลาสปัจจุบันเป็นคอนโทรลเลอร์ @RequestMapping ("/hadoop") // ประกาศเส้นทางของคลาสสาธารณะคลาสปัจจุบัน HadoopController {@requestmapping ("/upload") // declare เส้นทางของวิธีการปัจจุบัน // ไฟล์อัพโหลด fileList = (รายการ <String>) request.getSession () .getAttribute ("fileList"); // รับรายการไฟล์ที่อัปโหลดโดยผู้ใช้ถ้า (fileList == null) fileList = new ArrayList <String> (); // ถ้ารายการไฟล์ว่างเปล่า if (user == null) ส่งคืน "เข้าสู่ระบบ"; // หากผู้ใช้ไม่ได้ลงชื่อเข้าใช้ให้ข้ามไปที่หน้าเข้าสู่ระบบ pommonsmultipartresolver multipartresolver = ใหม่ CommonsMultipartResolver (request.getSession (). getServletContext (); {// หากคำขอเป็นคำขอไฟล์ MultiparthttpServletRequest MultireQuest = (MultiparthttpservletRequest) คำขอ; Iterator <string> iter = multirequest.getFilenames (); // รับชื่อไฟล์ iterator ในขณะที่ (iter.hasnext ()) {multipartfile file = multirequest.getFile ((String) iter.next ()); if (file! = null) {string filename = file.getoriginalfilename (); โฟลเดอร์ไฟล์ = ไฟล์ใหม่ ("/home/chenjie/cjhadooponline/" + user.getu_username ()); if (! folder.exists ()) {folder.mkdir (); // หากไฟล์ไม่มีอยู่ให้สร้างเครื่องในเซิร์ฟเวอร์} path String = "/home/chenjie/cjhadooponline/" + user.getu_username () + "/" + ไฟล์ไฟล์; ไฟล์ localfile = ไฟล์ใหม่ (พา ธ ); file.transferto (localfile); // คัดลอกไฟล์ที่อัปโหลดไปยังไดเรกทอรีท้องถิ่นของเซิร์ฟเวอร์ // filelist.add (พา ธ ); } handleuploadfiles (ผู้ใช้, filelist); // handle upload file}} request.getSession (). setAttribute ("fileList", fileList); // บันทึกรายการไฟล์ที่อัปโหลดในการส่งคืนเซสชัน "คอนโซล"; WordCount (คำขอ httpservletRequest, การตอบสนอง httpservletResponse) {system.out.println ("ป้อนคอนโทรลเลอร์ WordCount"); user user = (ผู้ใช้) request.getSession (). getAttribute ("ผู้ใช้"); System.out.println (ผู้ใช้); // ถ้า (user == null) // return "เข้าสู่ระบบ"; WordCount C = new wordCount (); // ใหม่คำสถิติคำศัพท์สตริงชื่อผู้ใช้ = user.getu_username (); String input = "hdfs: // chenjie-virtual-machine: 9000/user/" + ชื่อผู้ใช้ "/wordcountinput"; // ระบุโฟลเดอร์อินพุตของสตริงระบบ Hadoop ไฟล์ file/// chenjie-virtual-machine: 9000/username reslt = output + "/part-r-00000"; // ไฟล์เอาต์พุตเริ่มต้นลอง {thread.sleep (3*1000); C.Main (สตริงใหม่ [] {อินพุต, เอาต์พุต}); // เรียกคำว่าสถิติการกำหนดค่างาน conf = การกำหนดค่าใหม่ (); // สร้างการกำหนดค่า Hadoop ใหม่ conf.addresource (เส้นทางใหม่ ("/opt/hadoop-1.2.1/conf/core-site.xml")); PATH ("/opt/hadoop-1.2.1/conf/hdfs-site.xml")); // hadoop การกำหนดค่าและค้นหาระบบไฟล์ระบบไฟล์ระบบไฟล์ระบบไฟล์ = filesystem.get (conf); // คุณต้องกดไฟล์ระบบไฟล์ = ไฟล์ new (reslt); file.touri (); // รับพาวเวอร์ไฟล์เอาต์พุต System.out.println (URI); สตริงข้อมูล = null; ในขณะที่ ((data = stream.readline ())! = null) {//system.out.println(data); Response.getOutputStream (). println (data); // เขียนไฟล์ผลลัพธ์กลับไปยังหน้าเว็บของผู้ใช้} // inputStream ใน = filesystem.open (ไฟล์); // outputStream out = new fileOutputStream ("result.txt"); // ioutils.copybytes (ใน, ออก, 4096, จริง); Instream.close (); } catch (exception e) {system.err.println (e.getMessage ()); }} @RequestMapping ("/mapreducestates") // รับสถานะของโมฆะสาธารณะ mapReduce mapReduce (คำขอ httpservletrequest, การตอบสนอง httpservletResponse) {float [] ความคืบหน้า = ใหม่ลอย [2]; ลอง {การกำหนดค่า conf1 = การกำหนดค่าใหม่ (); conf1.set ("mapred.job.tracker", utils.jobtracker); Jobstatus Jobstatus = utils.getJobstatus (conf1); // ในขณะที่ (! jobstatus.isjobcomplete ()) {// progress = utils.getMapreduceProges (JobStatus); // response.getOutputStream (). println ("แผนที่:" + ความคืบหน้า [0] + "ลด:" + ความคืบหน้า [1]); // thread.sleep (1,000); //} jobConf jc = new JobConf (conf1); joblient joblient = new Joblient (JC); JobStatus [] JobSstatus = JobClient.getAllJobs (); // ด้วยวิธีนี้คุณจะได้รับอาร์เรย์ Jobstatus และคุณสามารถนำองค์ประกอบออกมาและตั้งชื่อ jobstatus jobstatus = JobSstatus [0]; jobid jobid = jobstatus.getJobid (); // รับ jobid ผ่าน Jobstatus RunningJob RunningJob = JobClient.getJob (Jobid); // รับวัตถุ RunningJob RunningJob.getJobState () ผ่าน jobid; // คุณสามารถรับสถานะงานมีห้ารัฐ ได้แก่ jobstatus.failed, jobstatus.Rilild, Jobstatus.prep, Jobstatus.running, Jobstatus. RunningJob.getJobname (); // คุณสามารถรับชื่องานได้ Jobstatus.getStartTime (); // คุณสามารถรับเวลาเริ่มต้นของงานซึ่งเป็นจำนวนมิลลิวินาที UTC Float Map = RunningJob.Mapprogress (); // คุณสามารถรับอัตราส่วนของขั้นตอนแผนที่ที่เสร็จสมบูรณ์ 0 ~ 1, System.out.println ("MAP =" + MAP); Float Rown = RunningJob.ReduceProgress (); // คุณสามารถรับอัตราส่วนของการลดขั้นตอนที่เสร็จสมบูรณ์ได้ System.out.println ("ลด ="+ลด); RunningJob.GetFailureInfo (); // สามารถรับข้อมูลความล้มเหลวได้ RunningJob.getCounters (); // คุณสามารถรับเคาน์เตอร์ที่เกี่ยวข้องกับงานได้ เนื้อหาของตัวนับนั้นเหมือนกับค่าของตัวนับที่เห็นในหน้าการตรวจสอบงาน } catch (ioexception e) {ความคืบหน้า [0] = 0; ความคืบหน้า [1] = 0; } request.getSession (). setAttribute ("แผนที่", ความคืบหน้า [0]); request.getSession (). setAttribute ("ลด", ความคืบหน้า [1]); } // กระบวนการอัพโหลดโมฆะสาธารณะที่จับสาธารณะ (ผู้ใช้ผู้ใช้รายการ <string> fileList) {ไฟล์โฟลเดอร์ = ไฟล์ใหม่ ("/home/chenjie/cjhadooponline/" + user.getu_username ()); if (! folder.exists ()) กลับ; if (folder.isdirectory ()) {file [] files = folder.listfiles (); สำหรับ (ไฟล์ไฟล์: ไฟล์) {system.out.println (file.getName ()); ลอง {putfiletohadoopfsfolder (ผู้ใช้, ไฟล์, fileList); // อัปโหลดไฟล์เดียวไปยังระบบไฟล์ hadoop} catch (ioexception e) {system.err.println (e.getMessage ()); }}}} // อัปโหลดไฟล์เดียวไปยังระบบไฟล์ hadoop เป็นโมฆะส่วนตัว putfiletohadoopfsfolder (ผู้ใช้ผู้ใช้ไฟล์ไฟล์รายการ <string> fileList) โยน iOException {การกำหนดค่า conf = การกำหนดค่าใหม่ (); conf.addresource (เส้นทางใหม่ ("/opt/hadoop-1.2.1/conf/core-site.xml")); conf.addresource (เส้นทางใหม่ ("/opt/hadoop-1.2.1/conf/hdfs-site.xml")); ระบบไฟล์ filesystem = filesystem.get (conf); System.out.println (filesystem.geturi ()); Path localfile = เส้นทางใหม่ (file.getabsolutepath ()); Path foler = เส้นทางใหม่ ("/user/" + user.getu_username () + "/wordCountInput"); if (! filesystem.exists (foler)) {filesystem.mkdirs (foler); } path hadoopfile = เส้นทางใหม่ ("/user/" + user.getu_username () + "/wordCountInput/" + file.getName ()); // ถ้า (filesystem.exists (hadoopfile)) {// system.out.println ("ไฟล์มีอยู่"); //} else {// filesystem.mkdirs (hadoopfile); //} filesystem.copyfromlocalfile (จริง, จริง, localfile, hadoopfile); filelist.add (hadoopfile.touri (). toString ()); -เริ่ม Hadoop:
ผลการทำงาน:
คุณสามารถเข้าสู่ระบบที่อยู่โครงการอัปโหลดไฟล์และรับผลลัพธ์ภายใต้แพลตฟอร์มใด ๆ
วิ่งได้สำเร็จ
ซอร์สโค้ด: https://github.com/tudoupaisimalingshu/cjhadooponline
ข้างต้นเป็นเนื้อหาทั้งหมดของบทความนี้ ฉันหวังว่ามันจะเป็นประโยชน์ต่อการเรียนรู้ของทุกคนและฉันหวังว่าทุกคนจะสนับสนุน wulin.com มากขึ้น