우리는 MapReduce가 코끼리 Hadoop의 핵심이라는 것을 알고 있습니다. Hadoop에서 데이터 처리의 핵심은 MapReduce 프로그래밍 모델입니다. Map/Reduce는 일반적으로 입력 데이터 세트를 여러 개의 독립적인 데이터 블록으로 분할하며, 이는 맵 작업(작업)에 의해 완전히 병렬 방식으로 처리됩니다. 프레임워크는 먼저 맵의 출력을 정렬한 다음 결과를 reduce 작업에 입력합니다. 일반적으로 작업의 입력 및 출력은 파일 시스템에 저장됩니다. 따라서 우리 프로그래밍 센터는 주로 매퍼 단계와 리듀서 단계입니다.
MapReduce 프로그램을 처음부터 개발하고 Hadoop 클러스터에서 실행해 보겠습니다.
mapper 코드 map.py:
import sys for line in sys.stdin: word_list = line.strip().split(' ') for word in word_list: print '\t'.join([word.strip(), str(1)])
코드 보기
reducer 코드 Reduce.py:
import sys cur_word = None sum = 0 for line in sys.stdin: ss = line.strip().split('\t') if len(ss) < 2: continue word = ss[0].strip() count = ss[1].strip() if cur_word == None: cur_word = word if cur_word != word: print '\t'.join([cur_word, str(sum)]) cur_word = word sum = 0 sum += int(count) print '\t'.join([cur_word, str(sum)]) sum = 0
코드 보기
리소스 파일 src.txt(테스트용, 클러스터에서 실행용) hdfs에 업로드하는 것을 잊지 마세요):
hello ni hao ni haoni hao ni hao ni hao ni hao ni hao ni hao ni hao ni hao ni hao ni hao ni hao ao ni haoni hao ni hao ni hao ni hao ni hao ni hao ni hao ni hao ni hao ni hao ni haoao ni haoni hao ni hao ni hao ni hao ni hao ni hao ni hao ni hao ni hao ni hao ni hao Dad would get out his mandolin and play for the family Dad loved to play the mandolin for his family he knew we enjoyed singing I had to mature into a man and have children of my own before I realized how much he had sacrificed I had to,mature into a man and,have children of my own before.I realized how much he had sacrificed
코드 보기
먼저 로컬에서 디버그하여 결과가 올바른지 확인하고 다음 명령을 입력하십시오.
cat src.txt | python map.py | sort -k 1 | python reduce.py
명령줄의 결과 출력:
a 2 and 2 and,have 1 ao 1 before 1 before.I 1 children 2 Dad 2 enjoyed 1 family 2 for 2 get 1 had 4 hao 33 haoao 1 haoni 3 have 1 he 3 hello 1 his 2 how 2 I 3 into 2 knew 1 loved 1 man 2 mandolin 2 mature 1 much 2 my 2 ni 34 of 2 out 1 own 2 play 2 realized 2 sacrificed 2 singing 1 the 2 to 2 to,mature 1 we 1 would 1
코드 보기
Passed Debugging에서 로컬 디버깅이 발견되었으며 코드는 정상입니다. 클러스터에 넣고 실행하세요. 편의상 노동력 해방을 위한 특별한 스크립트 run.sh를 작성했습니다.
HADOOP_CMD="/home/hadoop/hadoop/bin/hadoop" STREAM_JAR_PATH="/home/hadoop/hadoop/contrib/streaming/hadoop-streaming-1.2.1.jar" INPUT_FILE_PATH="/home/input/src.txt" OUTPUT_PATH="/home/output" $HADOOP_CMD fs -rmr $OUTPUT_PATH $HADOOP_CMD jar $STREAM_JAR_PATH \ -input $INPUT_FILE_PATH \ -output $OUTPUT_PATH \ -mapper "python map.py" \ -reducer "python reduce.py" \ -file ./map.py \ -file ./reduce.py
아래 스크립트를 분석해 보겠습니다.
HADOOP_CMD: hadoop的bin的路径 STREAM_JAR_PATH:streaming jar包的路径 INPUT_FILE_PATH:hadoop集群上的资源输入路径 OUTPUT_PATH:hadoop集群上的结果输出路径。(注意:这个目录不应该存在的,因此在脚本加了先删除这个目录。**注意****注意****注意**:若是第一次执行,没有这个目录,会报错的。可以先手动新建一个新的output目录。) $HADOOP_CMD fs -rmr $OUTPUT_PATH $HADOOP_CMD jar $STREAM_JAR_PATH \ -input $INPUT_FILE_PATH \ -output $OUTPUT_PATH \ -mapper "python map.py" \ -reducer "python reduce.py" \ -file ./map.py \ -file ./reduce.py #这里固定格式,指定输入,输出的路径;指定mapper,reducer的文件; #并分发mapper,reducer角色的我们用户写的代码文件,因为集群其他的节点还没有mapper、reducer的可执行文件。
감소 단계 이후의 레코드 출력을 보려면 다음 명령을 입력하세요.
cat src.txt | python map.py | sort -k 1 | python reduce.py | wc -l 命令行中输出:43
작업 세부 정보를 보려면 브라우저에 master:50030을 입력하세요.
Kind % Complete Num Tasks Pending Running Complete Killed Failed/Killed Task Attempts map 100.00% 2 0 0 2 0 0 / 0 reduce 100.00% 1 0 0 1 0 0 / 0
이것을 Map-Reduce Framework에서 봤습니다.
Counter Map Reduce Total Reduce output records 0 0 43
전체 과정이 성공했다는 증거입니다. 첫 번째 hadoop 프로그램 개발이 완료되었습니다.
위 내용은 Python 개발 MapReduce 시리즈 WordCount 데모의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!