ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • hadoop MR
    HADOOP 2022. 10. 17. 14:20

    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

     

Designed by Tistory.