많은 Hadoop 초보자는 아마도 동일합니다. 기계 자원이 충분하지 않기 때문에 가상 머신에 설치된 Hadoop의 의사 분포 만 만들 수 있습니다. 그런 다음 Win7에서 Eclipse 또는 Intellij 아이디어를 사용하여 코드 테스트를 작성합니다. 따라서 문제는 Win7의 원격 Hadoop 및 브레이크 포인트 디버깅에 작업을 원격으로 제출하는 방법입니다.
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 원격 디버깅
1.1 Hadoop-Eclipse-Plugin 플러그인 다운로드
Hadoop-Eclipse-Plugin은 ECLIPSE에 특별히 사용되는 Hadoop 플러그인으로, IDE 환경에서 직접 HDF의 디렉토리 및 파일 컨텐츠를 볼 수 있습니다. 소스 코드는 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 Windows64-Bit 플랫폼 용 Hadoop2.6 플러그인 패키지 다운로드 (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 디렉토리로 복사하고 hadoop.dll을 %Windir %/system32 디렉토리로 복사하십시오 (주로 플러그인이 빈 개체 참조와 같은 다양한 설명 할 수없는 오류를보고하는 것을 방지).
참고 : 컴파일을 원하지 않으면 컴파일 된 파일 Hadoop2.6 (x64) v0.2.rar를 직접 다운로드 할 수 있습니다.
1.3 Hadoop-Eclipse-Plugin 플러그인 구성
Eclipse, Windows-> Show View-> Other를 시작하십시오
Window-> preferences-> Hadoop Map/Reduce Win7에서 Hadoop의 루트 디렉토리를 지정합니다 (예 : $ hadoop_home)
그런 다음 Map/Reducations 패널에서 Baby Elephant 아이콘을 클릭하십시오.
위치를 추가하십시오
이 인터페이스는 매우 중요합니다. 몇 가지 매개 변수를 설명하겠습니다.
위치 이름 은 이름 일뿐입니다
Map/Reduce (v2) 마스터 호스트 는 가상 머신의 Hadoop 마스터에 해당하는 IP 주소입니다. 아래 포트는 hdfs-site.xml의 dfs.datanode.ipc.address 속성으로 지정된 포트에 해당합니다.
DFS 마스터 포트 : 여기의 포트는 Core-Site.xml의 fs.defaultfs로 지정된 포트에 해당합니다.
마지막 사용자 이름은 가상 시스템에서 Hadoop을 실행하는 사용자 이름과 동일해야합니다. Hadoop과 함께 Hadoop 2.6.0을 설치하고 실행 했으므로 Hadoop을 여기에 작성하십시오. 루트로 설치 한 경우 그에 따라 루트로 변경하십시오.
이 매개 변수를 지정한 후 마감 및 Eclipse를 클릭하여 Hadoop에 연결하는 방법을 알 수 있습니다. 모든 것이 잘 진행되면 Project Explorer 패널의 HDF에서 디렉토리와 파일을 볼 수 있습니다.
파일을 마우스 오른쪽 버튼으로 클릭하고 삭제를 선택하여 시도 할 수 있습니다. 일반적으로 처음에는 실패하며 많은 것들이있을 것입니다. 일반적인 아이디어는 권한이 충분하지 않다는 것입니다. 그 이유는 현재 Win7 로그인 사용자가 가상 컴퓨터에서 Hadoop의 실행중인 사용자가 아니기 때문입니다. 많은 해결책이 있습니다. 예를 들어 Win7에서 새 Hadoop 관리자 사용자를 작성한 다음 Hadoop으로 전환하여 Win7에 로그인 한 다음 Eclipse를 사용하여 개발할 수 있습니다. 그러나 이것은 너무 짜증나고 가장 쉬운 방법입니다.
hdfs-site.xml에 추가되었습니다
<property> <name> dfs.permissions </name> <value> false </value> </property>
그런 다음 가상 머신에서 Hadoop dfsadmin -safemode 휴가를 실행하십시오.
안전하려면 또 다른 Hadoop FS -Chmod 777 /
요컨대, Hadoop의 보안 감지를 완전히 끄는 것입니다 (학습 단계에서는이 문제가 필요하지 않습니다. 공식적으로 생성 될 때이를 수행하지 마십시오), 마지막으로 Hadoop을 다시 시작한 다음 Eclipse로 이동하여 지금 당장 파일 삭제 작업을 반복하는 것이 좋습니다.
1.4 WoldCount 샘플 프로젝트 생성
새 프로젝트를 만들고지도/감소 프로젝트를 선택하십시오
Wodcount.java에 다음을두면 코드는 다음과 같습니다.
yjmyzz; import java.io.ioexception; import java.util.stringtokenizer; import org.apache.hadoop.conf.configuration; import org.apache.hadoop.fs.path; import org.apache.hadoop.io.intwritable; import org.apache.hadoop.io.text. org org.apache.hadoop.mapreduce.mapper; import org.apache.hadoop.mapreduce.retucer; import org.apache.hadoop.hadoop.mapreduce.lib.input.fileinputformat; import org.apache.hadoop.mapreduce.lib.output.fileoutputformat; import org.apache.hadoop.util.genericoptionsparser; public class wordcount {public static class tokenizermapper <객체, 텍스트, 텍스트, intwritable> {private final static intwaritable one = new Intrwable (1); 개인 텍스트 단어 = 새 텍스트 (); public void map (객체 키, 텍스트 값, 컨텍스트 컨텍스트)는 ioexception, InterruptedException {stringTokenizer itr = new StringTokenizer (value.toString ()); while (itr.hasmoretokens ()) {word.set (itr.nextToken ()); context.write (Word, One); }}} public static class intsumreducer 확장 <텍스트, intwritable, text, intwritable> {private intwritable result = new intwritable (); public void 감소 (텍스트 키, 반복 가능한 <intwritable> 값, 컨텍스트 컨텍스트)는 ioexception, InterruptedException {int sum = 0; for (intwritable val : values) {sum += val.get (); } result.set (sum); context.write (키, 결과); }} public static void main (string [] args)은 예외 {configuration conf = new configuration (); String [] OtherArgs = New GenericoptionsParser (conf, args) .getRemainingArgs (); if (otherArgs.length <2) {System.err.println ( "usage : wordCount <in> [<in> ...] <ount>"); System.exit (2); } job job = job.getInstance (conf, "Word count"); job.setJarbyClass (WordCount.class); job.setMapperClass (tokenizerMapper.class); job.setcombinerclass (intsumpeducer.class); job.setReducerClass (intsumpreducer.class); job.setOutputKeyClass (text.class); job.setOutputValueClass (intwritable.class); for (int i = 0; i <otherArgs.length -1; ++ i) {fileInputFormat.AddInputPath (job, new Path (OtherArgs [i])); } fileoutputformat.setOutputPath (job, new Path (OtherArgs [OtherArgs.length -1])); System.Exit (job.waitforCompletion (true)? 0 : 1); }}그런 다음 log4j.properties를 넣으십시오. 내용은 다음과 같습니다. (실행의 편의를 위해 다양한 출력을 확인하십시오)
log4j.rootlogger = info, stdout#log4j.logger.org.springframework = info#log4j.logger.org.apache.activemq = info#log4j.logger.org.apache.activemq.spring = warn#log4j.org.org.apache.activemq.store.journal = info#logger.org.org.org.org.org.org.org.org g.activeio.journal = infololog4j.appender.stdout = org.apache.log4j.consoleappenderlog4j.appender.stdout.layout = org.apache.log4j.patternlayoutlog4j.appender.stdout.layout.conversionpattern =%d} | %-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로 바꾸십시오). 입력/readm.txt 파일이 없으면 먼저 수동으로 업로드 한 다음/출력/존재하지 않아야합니다. 그렇지 않으면, 프로그램이 끝까지 실행되고 대상 디렉토리가 존재한다는 것을 알게되면 오류 가보고됩니다. 그런 다음 적절한 위치에서 중단 점을 설정할 수 있으며 마침내 디버깅 할 수 있습니다.
3. Intellij 아이디어 원격 디버깅 Hadoop
3.1 Maven WordCount 프로젝트를 만듭니다
POM 파일은 다음과 같습니다.
<? xml version = "1.0"encoding = "utf-8"?> <project xmlns = "http://maven.apache.org/pom/4.0.0"xmlns : xsi = "http://www.w3.org/2001/xmlschema-instance" xsi : schemalocation = "http://maven.apache.org/pom/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modeversion> 4.0.0 </modelversion> <groupid> yjmyzz </groupid> <artifactid> mapreduce-helloworld <버전> 1.0-snapshot </version> <pectionies> <pectionency> <groupid> org.apache.hadoop </groupid> <artifactid> hadoop-common </artifactid> <버전> 2.6.0 </version> </fexendence> <pectionement> <groupid> org.apache.hadoop> <Artifactid> hadoop-mapreduce-client-jobclient </artifactid> <bersion> 2.6.0 </version> </fectionency> <prection> <groupid> commons-cli </groupid> <artifactid> Commons-cli </artifactid> <버전> 1.2 </dectomentency> <빌드> <FinalName> $ {project.artifactID} </finalName> </build> </project>프로젝트 구조는 다음과 같습니다.
프로젝트를 마우스 오른쪽 버튼으로 클릭 -> 모듈 설정 열기 또는 F12를 눌러 모듈 속성을 엽니 다.
의존성 Libary 참조 추가
그런 다음 $ hadoop_home에서 해당 패키지를 모두 가져옵니다
수입 된 libary는 hadoop2.6과 같은 이름을 지을 수 있습니다
3.2 작동 매개 변수를 설정합니다
두 곳에서 참고 :
1은 프로그램 체제이며 이클립과 유사한 입력 파일 및 출력 폴더를 지정합니다.
2는 작업 디렉토리, 즉 $ hadoop_home이있는 디렉토리로 지정된 작업 디렉토리입니다.
그런 다음 디버그 할 수 있습니다
Intellij에서 불행한 유일한 것은 Eclipse와 유사한 Hadoop 플러그인이 없다는 것입니다. WordCount를 실행할 때마다 명령 줄에서 출력 디렉토리 만 수동으로 삭제 한 다음 디버그 할 수 있습니다. 이 문제를 해결하려면 WordCount 코드를 개선하고 실행하기 전에 출력 디렉토리를 삭제할 수 있습니다. 다음 코드를 참조하십시오.
yjmyzz; import java.io.ioexception; import java.util.stringtokenizer; import org.apache.hadoop.conf.configuration; import org.apache.hadoop.fs.filesystem; import org.apache.hadoop.fs. path; import org.apache.hadoop.io.intwritable; org.hadoot org.apache.hadoop.mapreduce.job; import org.apache.hadoop.mapreduce.mapper; import org.apache.hadoop.mapreduce.retucer; import org.apache.hadoop.mapreduce.lib.input.fileinputformat; import org.apache.hadoop.mapreduce.lib.lib.lib.output org.apache.hadoop.util.genericoptionsparser; public class wordcount {public static class tokenizermapper <객체, 텍스트, 텍스트, intwritable> {private final static intwaritable one = new Intrwable (1); 개인 텍스트 단어 = 새 텍스트 (); public void map (객체 키, 텍스트 값, 컨텍스트 컨텍스트)는 ioexception, InterruptedException {stringTokenizer itr = new StringTokenizer (value.toString ()); while (itr.hasmoretokens ()) {word.set (itr.nextToken ()); context.write (Word, One); }}} public static class intsumreducer 확장 <텍스트, intwritable, text, intwritable> {private intwritable result = new intwritable (); public void 감소 (텍스트 키, 반복 가능한 <intwritable> 값, 컨텍스트 컨텍스트)는 ioexception, InterruptedException {int sum = 0; for (intwritable val : values) {sum += val.get (); } result.set (sum); context.write (키, 결과); }} / ** * 지정된 디렉토리 삭제 * * @param conf * @param dirpath * @throws ioexception * / private static void deletedir (configuration conf, string dirpath) ioexception {filesystem fs = filesystem.get (conf); 경로 대상 경로 = 새로운 경로 (Dirpath); if (fs.exists (targetPath)) {boolean delresult = fs.delete (targetpath, true); if (delresult) {System.out.println (TargetPath + "가 성공적으로 삭제되었습니다"); } else {System.out.println (대상 경로 + "삭제 실패"); }}} public static void main (String [] args)은 예외 {configuration conf = new configuration (); String [] OtherArgs = New GenericoptionsParser (conf, args) .getRemainingArgs (); if (otherArgs.length <2) {System.err.println ( "usage : wordCount <in> [<in> ...] <ount>"); System.exit (2); } // 출력 디렉토리 삭제 첫 번째 deletedir (conf, otherargs [eleseargs.length -1]); Job Job = job.getInstance (conf, "Word count"); job.setJarbyClass (WordCount.class); job.setMapperClass (tokenizerMapper.class); job.setcombinerclass (intsumpeducer.class); job.setReducerClass (intsumpreducer.class); job.setOutputKeyClass (text.class); job.setOutputValueClass (intwritable.class); for (int i = 0; i <otherArgs.length -1; ++ i) {fileInputFormat.AddInputPath (job, new Path (OtherArgs [i])); } fileoutputformat.setOutputPath (job, new Path (OtherArgs [OtherArgs.length -1])); System.Exit (job.waitforCompletion (true)? 0 : 1); }} 그러나 이것은 충분하지 않습니다. IDE 환경에서 실행될 때 IDE는 어떤 HDFS 인스턴스에 연결할 것인지 알아야합니다 (DB 개발과 마찬가지로 구성 XML에서 데이터 소스를 지정해야합니다). 다음과 유사한 $ hadoop_home/etc/hadoop 아래에서 Core-Site.xml을 복사하십시오.
내용은 다음과 같습니다.
<? xml version = "1.0"encoding = "utf-8"?> <? <? xml-stylesheet type = "text/xsl"href = "configuration.xsl"?> <configuration> <nameame> fs.defaultfs </name> <value> hdfs : //172.28.20
위의 IP를 가상 시스템의 IP로 바꾸십시오.