2014-09-16 3 views
0

지도 축소 기능을 사용하지 않아 파이썬으로 알고리즘을 작성했으며 'n'데이터 세트에서 같은 프로그램 ('알고리즘')의 'n'맵 인스턴스를 실행해야합니다. 내 코드가 파이썬이기 때문에, 나는 내 코드에 대해 hadoopstreaming을 사용하고있다.hadoop의 분할 수와 맵 작업 수

하둡 스트리밍 설명서에서 "입력 파일의 전체 HDFS 경로를 포함하는 파일 생성 : 각 맵 작업은 하나의 파일 이름을 입력으로 가져옵니다."

그래서 각 데이터 세트 파일에 대한 경로가있는 텍스트 파일을 만들었습니다. 시험을 위해서, 나는 이것으로부터 단어 카운트 프로그램을 작성했습니다 - http://www.michael-noll.com/tutorials/writing-an-hadoop-mapreduce-program-in-python/. 그리고 내지도 기능에, 나는 실제 단어를하기 전에 코드의 아래 부분이

for line in sys.stdin: 
    # obtain filename from file list 
    filename = line.rstrip('\n') 
    localfilename = ntpath.basename(filename) 
    os.environ("hadoop dfs -get"+line+ " " + localfilename) 

Q1을 계산 작성했습니다. 그래서 내 이해는 각 줄을 내지도 함수에 분할로 주어 지므로 분할 수는 주 파일의 분할 수 또는 줄 수 여야합니다. 내 주 파일에 세 개의 파일 이름이 있지만 두 개의 분할이 만들어져 있음을 알 수 있습니다. 왜 그래야만하지?

Q2. 그리고 내 일이 실패하고, 나는 왜 이런 로그 파일을 확인해야 할 지 모르겠다.

Q3. 그리고 그 외에도 다른 요구 사항을 처리하는 또 다른 옵션이 있습니다. 세 개의 데이터 세트를 모두 한 파일에 저장하고 특정 구분 기호로 구분 한 다음이 conf.set ("textinputformat.record.delimiter", "specific-delimiter "),하지만 문제는 java에서 수행되어야한다는 것입니다. 또한, 많은 포럼에서이를 달성하기 위해 사용자 정의 레코드 판독기를 작성했습니다. 이후 Java에서 좋은 아니에요, 나는 파이썬에서 내 구현을 작성 오전, 어쨌든이 매개 변수를 설정하거나 Java 코드를 작성하지 않고합니까?

4. hadoop에 내 요구 사항을 처리하기 위해 누락 된 다른 옵션이 있습니까?

[email protected]:~/code$ hadoop jar /usr/local/hadoop-2.2.0/share/hadoop/tools/lib/hadoop-streaming-2.2.0.jar -mapper "python $PWD/fileprocess.py" -reducer "python $PWD/reduce.py" -input final.txt -output output.txt 
14/09/16 05:27:23 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable 
packageJobJar: [/home/hduser/tmp/hadoop-unjar4045267665479713934/] [] /tmp/streamjob4078572719514334736.jar tmpDir=null 
14/09/16 05:27:26 INFO client.RMProxy: Connecting to ResourceManager at master/10.0.0.4:8032 
14/09/16 05:27:26 INFO client.RMProxy: Connecting to ResourceManager at master/10.0.0.4:8032 
14/09/16 05:27:31 INFO mapred.FileInputFormat: Total input paths to process : 1 
14/09/16 05:27:31 INFO mapreduce.JobSubmitter: number of splits:2 
14/09/16 05:27:31 INFO Configuration.deprecation: user.name is deprecated. Instead, use mapreduce.job.user.name 
14/09/16 05:27:31 INFO Configuration.deprecation: mapred.jar is deprecated. Instead, use mapreduce.job.jar 
14/09/16 05:27:31 INFO Configuration.deprecation: mapred.output.value.class is deprecated. Instead, use mapreduce.job.output.value.class 
14/09/16 05:27:31 INFO Configuration.deprecation: mapred.mapoutput.value.class is deprecated. Instead, use mapreduce.map.output.value.class 
14/09/16 05:27:31 INFO Configuration.deprecation: mapred.job.name is deprecated. Instead, use mapreduce.job.name 
14/09/16 05:27:31 INFO Configuration.deprecation: mapred.input.dir is deprecated. Instead, use mapreduce.input.fileinputformat.inputdir 
14/09/16 05:27:31 INFO Configuration.deprecation: mapred.output.dir is deprecated. Instead, use mapreduce.output.fileoutputformat.outputdir 
14/09/16 05:27:31 INFO Configuration.deprecation: mapred.map.tasks is deprecated. Instead, use mapreduce.job.maps 
14/09/16 05:27:31 INFO Configuration.deprecation: mapred.output.key.class is deprecated. Instead, use mapreduce.job.output.key.class 
14/09/16 05:27:31 INFO Configuration.deprecation: mapred.mapoutput.key.class is deprecated. Instead, use mapreduce.map.output.key.class 
14/09/16 05:27:31 INFO Configuration.deprecation: mapred.working.dir is deprecated. Instead, use mapreduce.job.working.dir 
14/09/16 05:27:34 INFO mapreduce.JobSubmitter: Submitting tokens for job: job_1410171456875_0012 
14/09/16 05:27:34 INFO impl.YarnClientImpl: Submitted application application_1410171456875_0012 to ResourceManager at master/10.0.0.4:8032 
14/09/16 05:27:35 INFO mapreduce.Job: The url to track the job: http://master:8088/proxy/application_1410171456875_0012/ 
14/09/16 05:27:35 INFO mapreduce.Job: Running job: job_1410171456875_0012 
14/09/16 05:27:51 INFO mapreduce.Job: Job job_1410171456875_0012 running in uber mode : false 
14/09/16 05:27:51 INFO mapreduce.Job: map 0% reduce 0% 
14/09/16 05:28:11 INFO mapreduce.Job: Task Id : attempt_1410171456875_0012_m_000001_0, Status : FAILED 
Error: java.lang.RuntimeException: PipeMapRed.waitOutputThreads(): subprocess failed with code 2 
    at org.apache.hadoop.streaming.PipeMapRed.waitOutputThreads(PipeMapRed.java:320) 
    at org.apache.hadoop.streaming.PipeMapRed.mapRedFinished(PipeMapRed.java:533) 
    at org.apache.hadoop.streaming.PipeMapper.close(PipeMapper.java:130) 
    at org.apache.hadoop.mapred.MapRunner.run(MapRunner.java:61) 
    at org.apache.hadoop.streaming.PipeMapRunner.run(PipeMapRunner.java:34) 
    at org.apache.hadoop.mapred.MapTask.runOldMapper(MapTask.java:429) 
    at org.apache.hadoop.mapred.MapTask.run(MapTask.java:341) 
    at org.apache.hadoop.mapred.YarnChild$2.run(YarnChild.java:162) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at javax.security.auth.Subject.doAs(Subject.java:415) 
    at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1491) 
    at org.apache.hadoop.mapred.YarnChild.main(YarnChild.java:157) 

답변

2

Q1 :는 적합한 어느 선이 어디로 가야할지에 대해 어떠한 보증도하지 않습니다 수 하둡 각 파일을 분할합니다. 별도의 매퍼로 처리되도록 라인을 별도의 파일에 저장해야합니다. 귀하의 예를 들어

, 세 개의 파일 이름이있는 경우, 대신에 하나의 /TEMP/files 파일에 모두 넣는 하나의 파일 이름을 가진 하위 폴더에 세 개의 파일, 각을 만들어야합니다 다음과 같이 작업에 추가 : -input /TEMP/files/*합니다. 그것은 당신에게 당신이 찾고있는 행동을 줄 것입니다.

데이터에 대한 지역 정보를 얻지는 않습니다. 첫 번째 파일 참조를 가져올 맵퍼는 다른 파일 참조를 가져와야 할 수 있습니다. 클러스터의 크기에 따라 처리중인 대부분의 파일에 대해 네트워크에 연결하지 않아도됩니다.

질문 2 : 명령 줄 출력은 Java 컨테이너 오류 만 알려주고 python의 실제 오류는 표시하지 않습니다. 그것을 얻으려면 취업 추적자 페이지로 가야합니다 : http://localhost:50030/jobtracker.jsp

여기에서 실패한 직업에서 직장을 찾을 수 있습니다. 해당 페이지에서 실패한 작업을 클릭하고 작업 로그 열의 옵션 중 하나를 선택하십시오. 거기에서 파이썬 스크립트의 stderr 출력을 볼 수 있습니다.

당신은 os.environ으로 이상한 일을하고 있습니다. 명령을 실행하려면 하위 프로세스를 사용해야합니다.

from subprocess import call 
call(["/usr/bin/hadoop", "dfs", "-get", line, localfilename]) 

Q3 : 예를 들어 내가 요구 사항은 여기 정확히 모르겠어요. 위의 파일에서 참조하는 실제 파일에 대해 이야기하고 있습니까? 그러면 매퍼로 직접 가져올 것입니다. 수동으로 처리하므로 map/reduce로 전달되지 않기 때문에 현재 어떤 형식이든 상관 없습니다.

Q4 : 병렬로 처리하려는 파일이 있지만 map/reduce를 사용할 필요가없는 것 같습니다. 당신은 기본적으로 당신이 CPU 잔뜩으로 사용할 수있는 가상 클러스터를 가지고 있다는 사실을 이용하기를 원합니다. 괜찮 았고 일할 수 있지만 노예에 일을 걸어 놓는 것 외에는 아무것도 사용하지 않았습니다.

+0

안녕하세요. 답장을 보내 주셔서 감사합니다. 예, 잘못되었습니다. 방금 수정했습니다. 그리고 첫 번째 대답과는 별도로, 여러분은 -input/TEMP/files/*를 사용하여 내가 바라는 행동을 줄 것이라고 언급했습니다. 따라서이 경우 하나의 파일을 처리하는 각지도 작업에 대한 필자의 요구 사항을 충족시킵니다. 필자는 일부 기능 의존성 작업을 수행하고 있기 때문에 데이터가 혼합되어서는 안되기 때문에 믹싱 데이터 세트가 내 요구 사항에 완전히 영향을 미칩니다. –

+0

예, 두 개의 다른 파일이 동일한 매퍼로 전송되지 않습니다. 그래도 궁금한데, 왜 중요합니까? 동일한 매퍼가 처리하더라도 입력 파일에서 각 파일을 독립적으로 처리 할 수 ​​있습니다. – Nonnib

+0

왜냐하면, 나는 그 데이터 세트 내에서 다른 것과 각각의 튜플을 비교할지도 함수에 내 알고리즘을 쓰려고하기 때문에, 다른 데이터 세트가 믹스되면 완전한 엉망이 될 것입니다. –