Hadoop 환경 구성에 대한 자세한 내용은이 기사 //www.vevb.com/article/33649.htm을 참조하십시오.
우리는 Hadoop Jar ***의 형태를 통해 명령 줄을 통해 Hadoop을 호출 할 수 있다는 것을 이미 알고 있습니다. JAR 입력 출력은 어떻게 서비스에 캡슐화하고 Java/Web을 호출하게합니까? 이를 통해 사용자는 편리한 방식으로 파일을 Hadoop에 업로드하고 결과를 얻도록 처리 할 수 있습니다. 먼저, ***. Jar는 Hadoop 작업 클래스의 캡슐화입니다. 항아리없이 클래스의 주요 방법을 실행하고 필요한 매개 변수를 전달할 수 있습니다. 입력 및 출력은 Hadoop의 javaapi를 사용하여 사용자가 업로드 한 파일을 Hadoop 파일 시스템에 넣습니다. 그런 다음 Hadoop의 Java API를 사용하여 파일 시스템에서 결과 파일을 얻습니다.
Javaweb 프로젝트를 구축하십시오. 이 기사는 Spring, SpringMVC 및 MyBatis 프레임 워크를 사용합니다. 물론 이것은 요점이 아니며 프레임 워크를 사용하지 않아도 달성 할 수 있습니다.
프로젝트 프레임 워크는 다음과 같습니다.
프로젝트에 사용 된 JAR 패키지는 다음과 같습니다.
Spring의 구성 파일에서 추가하십시오
<bean id = "multipartresolver"> <property name = "defaultencoding"value = "utf-8" /> <property name = "maxuploadsize"value = "10485760000" /> <property name = "maxinmemorysize"value = "40960" /> < /bean>
프로젝트 지원 파일 업로드를 만듭니다.
새 로그인 생성 .jsp를 클릭하여 로그인하고 사용자/로그인을 입력하십시오.
프로세스 로그인 사용자/로그인. 성공적으로 로그인 한 후 [Hadoop 파일 시스템에서 사용자 폴더 작성] 다음 Console.jsp로 점프합니다.
패키지 com.chenjie.controller; import java.io.ioexception; import javax.annotation.resource; import javax.servlet.http.httpservletrequest; import javax.servlet.http.httpservletresponse; import org.apache.hadoop.conf.configuration; import org.apache.hadoop.fs.filesystem; import org.apache.hadoop.fs.path; org.springframework.stereotyp.controller import; org.springframework.web.bind.annotation.requestmapping; import com.chenjie.pojo.jsonresult; import com.chenjie.pojo.user; com.chenjie.service.userservice import; import com.chenjie.util.appconfig; import com.google.gson.gson; /** * 사용자 요청 컨트롤러 * * @author chen */@controller // 현재 클래스를 컨트롤러 @requestmapping ( "/user")로 선언합니다. // 현재 클래스의 경로를 선언합니다. 공개 클래스 usercontroller {@resource (name = "userervice") private userservice * @persion anuserorce * * @persour anuserorce/ * ausouram incastin/ * a useram usource (names * @persource) @param request * @param response * @throws ioexception */@requestmapping ( "/login") // 현재 메소드의 경로를 선언하여 공개 문자열 로그인 (user user, httpservletrequest request, httpservletrequest request, httpservletrepsonse responsk)을 선언합니다. json resignce intaster/json "); uservice.login (user); // uservice request.getSession (). setAttribute ( "user", result)의 로그인 메소드를 호출합니다. if (result! = null) {createHadoopfsfolder (result); "콘솔"을 반환합니다. } "로그인"리턴; } public void createHadoopfsfolder (사용자 사용자)는 ioException {configuration conf = new configuration (); conf.addresource (새 경로 ( "/opt/hadoop-1.2.1/conf/core-site.xml"); conf.addresource (새 경로 ( "/opt/hadoop-1.2.1/conf/hdfs-site.xml"); FileSystem filesystem = filesystem.get (conf); System.out.println (filesystem.geturi ()); Path File = new Path ( "/user/" + user.getu_username ()); if (filesystem.exists (file)) {System.out.println ( "Haddop HDFS 사용자 폴러가 존재합니다."); filesystem.delete (파일, true); System.out.println ( "Haddop HDFS 사용자 Foler Delete Success."); } filesystem.mkdirs (파일); System.out.println ( "Haddop HDFS 사용자 Foler Creat Success."); }}Console.jsp 파일을 업로드하고 작업을 제출하려면
파일 업로드 및 작업 제출 :
패키지 com.chenjie.controller; import java.io.file; import java.io.ioexception; import java.net.inetSocketAddress; import java.net.uri; java.util.arraylist 가져 오기; import java.util.iterator; Java.util.list 가져 오기; import javax.servlet.http.httpservletrequest; import javax.servlet.http.httpservletresponse; import org.apache.hadoop.conf.configuration; import org.apache.hadoop.fs.fsdatainputstream; import org.apache.hadoop.fs.filesystem; import org.apache.hadoop.mapred.jobclient; import org.apache.hadoop.mapred.jobconf; import org.apache.hadoop.mapred.jobid; import org.apache.hadoop.mapred.jobstatus; import org.apache.hadoop.mapred.runningjob; org.springframework.steretype.controller import; org.springframework.web.bind.annotation.requestmapping; org.springframework.web.multipart.multipartfile; org.springframework.web.multipart.multiparthttpservletrequest; org.springframework.web.multipart.commons.commonsmultipartresolver; import com.chenjie.pojo.user; import com.chenjie.util.utils; @Controller // 현재 클래스를 컨트롤러 @RequestMapping ( "/hadoop")으로 선언합니다. // 현재 클래스 클래스의 경로 hadoopController {@requestmapping ( "/upload")의 경로를 선언합니다. // 현재 메소드의 경로를 선언합니다. public string upload (httpservlequest request, httpservletrescende) httpservercence replessity). fileList = (list <string>) request.getSession () .getAttribute ( "filEList"); // 사용자가 업로드 한 파일 목록을 가져옵니다. (filElist == null) filElist = new arrayList <string> (); // 파일 목록이 비어 있으면 새 사용자 user = (사용자) request를 만듭니다. if (user == null) "로그인"; // 사용자가 로그인되지 않은 경우 로그인 페이지로 점프하면 CommonSmultipartresolver = new CommonSmultipartresolver (request.getSession (). {// 요청이 파일 요청 multiparthttpservletrequest multirequest = (multiparthttpservletrequest) 요청; iterator <string> iter = multirequest.getFilenames (); // 파일 이름 Iterator를 가져옵니다. if (file! = null) {String filename = file.getoriginalFilename (); file folder = 새 파일 ( "/home/chenjie/cjhadooponline/" + user.getu_username ()); if (! folder.exists ()) {folder.mkdir (); // 파일이 존재하지 않으면 서버에서 로컬로 생성} string path = "/home/chenjie/cjhadooponline/" + user.getu_username () + "/" + filename; 파일 로컬 파일 = 새 파일 (Path); file.transferto (localfile); // 업로드 된 파일을 서버의 로컬 디렉토리에 복사 // filleList.add (Path); } handleUploadFiles (user, filEList); // 파일 핸들}} request.getSession (). setAttribute ( "filElist", filleList); // 세션 return "console"에서 업로드 된 파일 목록을 저장합니다. "console"; return in console.jsp} @requestmapping ( "/wortcount") // call hadop for hadop hadop. WordCount (httpservletRequest 요청, httpservletResponse 응답) {system.out.println ( "컨트롤러 wordCount"); user user = (user) request.getSession (). getAttribute ( "user"); System.out.println (사용자); // if (user == null) // "로그인"을 반환합니다. WordCount C = new WordCount (); // 새 Word 통계 작업 문자열 username = user.getu_username (); 문자열 입력 = "hdfs : // chenjie-virtual-machine : 9000/user/" + username + "/wordCountInput"; // hadoop 파일 시스템의 입력 폴더를 지정하십시오 String output = "hdfs : // chenjie-virtual-machine : 9000/user 이름 +"/worthcount prit의 chenjie-virtual-machine : 9000/user + "; String reslt = output + "/part-r-00000"; // 기본 출력 파일 try {thread.sleep (3*1000); c.main (new String [] {input, output}); // 단어 통계 작업 구성 configuration configuration conf = new configuration (); // 새로운 Hadoop 구성 conf.addresource (새로운 경로 ( "/opt/hadoop-1.2.1/conft/core-site.xml"); // addoop velpluy conf. Aaddresuce (new) PATH ( "/opt/hadoop-1.2.1/conf/hdfs-site.xml")); // Hadoop 구성 및 파일 시스템 파일 시스템 파일 시스템 파일 시스템을 찾으십시오. 파일 시스템 .get (conf); // 파일 시스템 파일을 누르야합니다. 파일을 누르야합니다. = file.touri (); // 출력 파일 경로 System.out.println (uri); 문자열 data = null; while ((data = instream.readline ())! = null) {//system.out.println(data); response.getoutputStream (). println (data); // 결과 파일을 사용자의 웹 페이지로 다시 쓰기} // inputStream in = filesystem.open (file); // outputStream out = 새 FileOutputStream ( "result.txt"); // ioutils.copybytes (in, out, 4096, true); instream.close (); } catch (예외 e) {System.err.println (e.getMessage ()); }} @requestmapping ( "/mapreducestates") // mapreduce 상태 공개 void mapreduce (httpservletrequest request, httpservletResponse 응답) {float [] progress = new float [2]; try {configuration conf1 = new configuration (); conf1.set ( "mapred.job.tracker", utils.jobtracker); Jobstatus jobstatus = utils.getJobstatus (conf1); // while (! jobstatus.isjobcomplete ()) {// progress = utils.getMapreduceProges (jobstatus); // response.getOutputStream (). println ( "맵 :" + progress [0] + "row :" + progress [1]); // Thread.sleep (1000); //} jobConf jc = new jobConf (conf1); JobClient jobclient = 새로운 작업 클리어 (JC); jobstatus [] jobsstatus = jobClient.getAllJobs (); // 이렇게하면 JobStatus 배열을 얻고 요소를 꺼내서 JobStatus jobstatus = jobstatus [0]; jobid jobid = jobstatus.getJobid (); // jobstatus runningjob runningjob = jobClient.getJob (jobid)를 통해 jobid를 얻습니다. // jobid를 통해 runningjob.getJobstate ()를 runningjob.getJobstate ()를 얻을 수 있습니다. // 작업 상태를 얻을 수 있습니다. JobStatus.failed, jobstatus.kild, jobstatus.prep, jobstatus.running, jobstatus.succeeded work way way way way way want를 얻을 수 있습니다. RunningJob.getJobName (); // 작업 이름을 얻을 수 있습니다. jobstatus.getStartTime (); // 작업 시작 시간을 얻을 수 있습니다. 이는 UTC 밀리 초의 수입니다. float map = runningJob.mackrogress (); // 완성 된 맵 스테이지, 0 ~ 1, System.out.println의 비율을 얻을 수 있습니다 ( "map =" + map); float reted = runningjob.reduceprogress (); // 완성 된 감소 단계의 비율을 얻을 수 있습니다. System.out.println ( "reving ="+reting); RunningJob.getFailureInfo (); // 실패 정보를 얻을 수 있습니다. RunningJob.getCounters (); // 작업 관련 카운터를 얻을 수 있습니다. 카운터의 내용은 작업 모니터링 페이지에 표시된 카운터 값과 동일합니다. } catch (ioException e) {진행 [0] = 0; 진행 [1] = 0; } request.getSession (). setAttribute ( "map", progress [0]); request.getSession (). setAttribute ( "감소", 진행 [1]); } // 프로세스 파일 업로드 public void handleUploadFiles (사용자 사용자, list <string> filleList) {file folder = new File ( "/home/chenjie/cjhadooponline/" + user.getu_username ()); if (! folder.exists ()) reture; if (folder.isdirectory ()) {file [] files = folder.listfiles (); for (파일 : 파일) {system.out.println (file.getName ()); try {putfiletohadoopfsfolder (user, file, filelist); // 단일 파일을 Hadoop 파일 시스템에 업로드} catch (ioexception e) {system.err.println (e.getMessage ()); }}}} // 단일 파일을 hadoop 파일 시스템에 업로드 개인 void putfiletoHadoopfsfolder (사용자, 파일 파일, 목록 <string> filEList)는 ioException {configuration conf = new configuration (); conf.addresource (새 경로 ( "/opt/hadoop-1.2.1/conf/core-site.xml"); conf.addresource (새 경로 ( "/opt/hadoop-1.2.1/conf/hdfs-site.xml"); FileSystem filesystem = filesystem.get (conf); System.out.println (filesystem.geturi ()); 경로 localfile = 새로운 경로 (file.getabsolutepath ()); Path Foler = new Path ( "/user/" + user.getu_username () + "/wordCountInput"); if (! filesystem.exists (foler)) {filesystem.mkdirs (foler); } Path HadoopFile = new Path ( "/user/" + user.getu_username () + "/wordCountInput/" + file.getName ()); // if (filesystem.exists (hadoopfile)) {// system.out.println ( "파일 존재"); //} else {// filesystem.mkdirs (hadoopfile); //} filesystem.copyfromlocalfile (true, true, localfile, hadoopfile); fileList.add (hadoopfile.touri (). toString ()); }}Hadoop 시작 :
실행 결과 :
프로젝트 주소에 로그인하고 파일을 업로드하고 모든 플랫폼에서 결과를 얻을 수 있습니다.
성공적으로 실행하십시오.
소스 코드 : https://github.com/tudoupaisimalingshu/cjhadooponline
위는이 기사의 모든 내용입니다. 모든 사람의 학습에 도움이되기를 바랍니다. 모든 사람이 wulin.com을 더 지원하기를 바랍니다.