-
hadoop3 기준으로 설명
1. hadoop MR 실행하기 위한 기본 쉘 파일${HADOOP} --config ${HADOOP_CONF_DIR} jar ${JAR_PATH} \ -files "argvs, mapper.py, reducer.py" \ -D mapreduce.job.name="test job" \ -D mapreduce.job.reduces=1 \ -D mapreduce.reduce.memory.mb=40960 \ -D stream.num.map.output.key.fields=1 \ -D stream.map.output.field.separator="\t" \ -D mapreduce.job.output.key.comparator.class=org.apache.hadoop.mapred.lib.KeyFieldBasedComparator \ -D mapreduce.partition.keycomparator.options="-k1,1" \ -D mapreduce.partition.keypartitioner.options="-k1,1" \ -partitioner org.apache.hadoop.mapred.lib.KeyFieldBasedPartitioner \ -cmdenv PYTHONPATH=. \ -input "HDFS INPUT" \ -output "HDFS OUTPUT" \ -mapper "python mapper.py argvs" \ -reducer "python reducer.py"${HADOOP} --config ${HADOOP_CONF_DIR} jar ${JAR_PATH}하둡은 jar 파일을 통해 실행되므로 첫 line에서 설치된 하둡의 jar 파일을 config로 할당해야 한다.
-files "argvs, mapper.py, reducer.py"필요한 파일들은 미리 선언해서 사용해야 하는데, python 파일외에 argvs로 사용할 파일들도 미리 선언해야 한다.
만약 하둡내에 있는 파일이라면 다음과 같이 변경해서 사용해야 한다.-files "hdfs://${HADOOP_ADDR}/args#argvs, mapper.py, reducer.py"위와 같이 할당하면 되고, #argvs 는 alias된 형태이므로, mapper 혹은 reducer 실행시 hdfs:// ~ 주소 전체를 인자로 넘길 필요 없이, argvs로만 넘기면 된다.
-D mapreduce.job.name="test job"yarn에서 보여지는 job name으로, yarn 내에 다양한 잡들이 많기 때문에 이름을 할당하여 구분짓기 위함이다.
-D mapreduce.job.reduces=1 -D mapreduce.reduce.memory.mb=40960리듀서를 1개만 할당하여, 결과파일을 1개만 생성한다는 의미로 part-00000 한 개의 파일만 생성될 것이고,
한 리듀서에 40GB의 메모리를 할당한 다는 의미이다.-D stream.num.map.output.key.fields=1 -D stream.map.output.field.separator="\t"mapper에서 1번째 "\t"을 구분자로 key값과 value값으로 나눈다는 의미이다.
예시로, P1 \t val1 val2 val3 val4 값이 Mapper의 output으로 나왔다면,
key : P1 , values : val1 val2 val3 val4 와 같이 reducer로 전달되게 된다.-D mapreduce.job.output.key.comparator.class=org.apache.hadoop.mapred.lib.KeyFieldBasedComparator -D mapreduce.partition.keycomparator.options="-k1,1"class 명은 keycomparator를 사용하기 위해 기본적으로 선언하는 인자로 인식하면 되고,
keycomparator의 의미는 mapper의 Output key값을 sorting하는 의미로 생각하면 된다.
-k1,1 의 의미는 sort의 key값 중 1번 key는 1번째 필드라는 의미이다.
n차 정렬을 하려면 다음과 같다
"-k1,1nr -k2,2n -k3,3nr"
키1은 numeric reverse sort, 키2는 numeric sort, 키3은 numeric reverse sort-D mapreduce.partition.keypartitioner.options="-k1,1" -partitioner org.apache.hadoop.mapred.lib.KeyFieldBasedPartitioner-partitioner option은 위 comparator에서 class 선언해준 것 처럼 기본적으로 선언해야 한다.( 아마 위치도 -D 옵션 사이말고.. -D 옵션 맨 뒤에 해야하는 걸로 알고 있는데.. 확실하진 않음 )
keypartititioner의 의미는 mapper의 output Key을 partition을 나누어서 reducer에게 전달한다고 생각하면 된다.
-k1,1의 경우 첫번째 키로 파티션을 나눈다고 생각하면 된다.
만약 첫번째, 두번째 키로 파티션을 할당하고 싶다면, -k1,2와 같이 할당하면 된다.
-k1,1 의 예시로 실행되면 다음과 같다.mapper output P1 P2 P3 P1 P4 P5 P2 P2 P5 P3 P5 P2 reducer에게 input으로 전달될 시, //part-00000( 파일명은 다를 수 있음 ) P1 P2 P3 P1 P4 P5 //part-00001 P2 P2 P5 //part-00002 P3 P5 P2