반응형

이번에 hadoop mapreduce작업을 진행하는겸 reducer개수 설정에 따라 처리속도가 어떻게 달라지는지 간단히 확인해보았다.

(물론 cluster의 환경 작업의 데이터처리 사이즈 및 작업의 종류에 따라 달라질 수 있다.)

 

작업내용

- parquet형태의 데이터를 읽는다.

- 컬럼별 특정 rule에 의해 match가 되지 않는 데이터에 대해 counting을 한다.

- MisMatch된 데이터에 대해 최종적으로 hdfs에 write한다. (MultipleOutput)

- 컬럼별 데이터 분포도를 counting해서 컬럼별로 결과 file로 남긴다. (local)

- 컬럼별 나올 수 있는 모든 조합들의 집합의 데이터 분포도도 hdfs파일에 write한다. (MultipleOutput)

 

데이터 사이즈/데이터 라인수

362.5 M / 22,766,706

 

컬럼개수 

6개

 

Reducer 1 개일 때 : 2 34

19/06/27 14:28:18 INFO client.RMProxy: Connecting to ResourceManager at acenmd-dmp001.svr.toastmaker.net/10.160.231.113:8032

19/06/27 14:28:19 INFO input.FileInputFormat: Total input paths to process : 50

19/06/27 14:28:19 INFO mapreduce.JobSubmitter: number of splits:50

19/06/27 14:28:19 INFO mapreduce.JobSubmitter: Submitting tokens for job: job_1559692026802_4638

19/06/27 14:28:19 INFO impl.YarnClientImpl: Submitted application application_1559692026802_4638

19/06/27 14:28:19 INFO mapreduce.Job: The url to track the job: http://acenmd-dmp001.svr.toastmaker.net:8088/proxy/application_1559692026802_4638/

19/06/27 14:28:19 INFO mapreduce.Job: Running job: job_1559692026802_4638

19/06/27 14:28:26 INFO mapreduce.Job: Job job_1559692026802_4638 running in uber mode : false

19/06/27 14:28:26 INFO mapreduce.Job:  map 0% reduce 0%

19/06/27 14:28:40 INFO mapreduce.Job:  map 2% reduce 0%

(생 략)

19/06/27 14:30:48 INFO mapreduce.Job:  map 100% reduce 99%

19/06/27 14:30:52 INFO mapreduce.Job:  map 100% reduce 100%

19/06/27 14:30:52 INFO mapreduce.Job: Job job_1559692026802_4638 completed successfully

 

Reducer 5개일 때 : 1 9

19/06/27 18:32:26 INFO client.RMProxy: Connecting to ResourceManager at acenmd-dmp001.svr.toastmaker.net/10.160.231.113:8032

19/06/27 18:32:27 INFO input.FileInputFormat: Total input paths to process : 50

19/06/27 18:32:27 INFO mapreduce.JobSubmitter: number of splits:50

19/06/27 18:32:27 INFO mapreduce.JobSubmitter: Submitting tokens for job: job_1559692026802_4692

19/06/27 18:32:27 INFO impl.YarnClientImpl: Submitted application application_1559692026802_4692

19/06/27 18:32:28 INFO mapreduce.Job: The url to track the job: http://acenmd-dmp001.svr.toastmaker.net:8088/proxy/application_1559692026802_4692/

19/06/27 18:32:28 INFO mapreduce.Job: Running job: job_1559692026802_4692

19/06/27 18:32:35 INFO mapreduce.Job: Job job_1559692026802_4692 running in uber mode : false

19/06/27 18:32:35 INFO mapreduce.Job:  map 0% reduce 0%

19/06/27 18:32:50 INFO mapreduce.Job:  map 8% reduce 0

(생 략)

19/06/27 18:33:32 INFO mapreduce.Job:  map 100% reduce 99%

19/06/27 18:33:35 INFO mapreduce.Job:  map 100% reduce 100%

19/06/27 18:33:35 INFO mapreduce.Job: Job job_1559692026802_4692 completed successfully

 

Reducer 10개 일 때 : 1분 2초

19/06/27 18:18:08 INFO client.RMProxy: Connecting to ResourceManager at acenmd-dmp001.svr.toastmaker.net/10.160.231.113:8032

19/06/27 18:18:09 INFO input.FileInputFormat: Total input paths to process : 50

19/06/27 18:18:09 INFO mapreduce.JobSubmitter: number of splits:50

19/06/27 18:18:09 INFO mapreduce.JobSubmitter: Submitting tokens for job: job_1559692026802_4688

19/06/27 18:18:10 INFO impl.YarnClientImpl: Submitted application application_1559692026802_4688

19/06/27 18:18:10 INFO mapreduce.Job: The url to track the job: http://acenmd-dmp001.svr.toastmaker.net:8088/proxy/application_1559692026802_4688/

19/06/27 18:18:10 INFO mapreduce.Job: Running job: job_1559692026802_4688

19/06/27 18:18:17 INFO mapreduce.Job: Job job_1559692026802_4688 running in uber mode : false

19/06/27 18:18:17 INFO mapreduce.Job:  map 0% reduce 0%

19/06/27 18:18:31 INFO mapreduce.Job:  map 2% reduce 0%

(생 략)

19/06/27 18:19:07 INFO mapreduce.Job:  map 100% reduce 99%

19/06/27 18:19:10 INFO mapreduce.Job:  map 100% reduce 100%

19/06/27 18:19:10 INFO mapreduce.Job: Job job_1559692026802_4688 completed successfully

 

Reducer 20개 일때 : 1분 1초

19/06/27 18:27:45 INFO client.RMProxy: Connecting to ResourceManager at acenmd-dmp001.svr.toastmaker.net/10.160.231.113:8032

19/06/27 18:27:46 INFO input.FileInputFormat: Total input paths to process : 50

19/06/27 18:27:47 INFO mapreduce.JobSubmitter: number of splits:50

19/06/27 18:27:47 INFO mapreduce.JobSubmitter: Submitting tokens for job: job_1559692026802_4689

19/06/27 18:27:47 INFO impl.YarnClientImpl: Submitted application application_1559692026802_4689

19/06/27 18:27:47 INFO mapreduce.Job: The url to track the job: http://acenmd-dmp001.svr.toastmaker.net:8088/proxy/application_1559692026802_4689/

19/06/27 18:27:47 INFO mapreduce.Job: Running job: job_1559692026802_4689

19/06/27 18:27:56 INFO mapreduce.Job: Job job_1559692026802_4689 running in uber mode : false

19/06/27 18:27:56 INFO mapreduce.Job:  map 0% reduce 0%

19/06/27 18:28:14 INFO mapreduce.Job:  map 19% reduce 0%

19/06/27 18:28:15 INFO mapreduce.Job:  map 39% reduce 0%

(생 략)

19/06/27 18:28:42 INFO mapreduce.Job:  map 100% reduce 99%

19/06/27 18:28:43 INFO mapreduce.Job:  map 100% reduce 100%

19/06/27 18:28:46 INFO mapreduce.Job: Job job_1559692026802_4689 completed successfully

 

결 론

Reducer를 많이 늘린다고해서 처리 속도가 비례해서 향상되는 것은 아니다. 해당 작업의 유형을 고려하고 Reducer개수를 조절해가며 최적의 개수를 찾는게 중요하다. Reducer개수에 따라 결과 데이터가 hdfs에 쓰여진다.(Reducer10개면 10개의 파티션으로, 5개이면 5개의 파티션으로)

 

마지막으로 하둡 완벽가이드(4판)의 내용을 첨부한다.

리듀서를 하나만 두는 것(기본값)은 하둡 초보자가 자주 범하는 실수다. 실제로 대부분의 잡은 리듀서 수를 기본값인 1보다 크게 설정하는 것이 좋다. 그렇지 않으면 모든 중간 데이터가 하나의 리듀스 태스크로 모여들기 때문에 잡이 굉장히 느려진다. 사실 잡의 리듀서 수를 결정하는 것은 과학보다는 예술에 가깝다. 보통 리듀서 수를 늘리면 병렬 처리 개수도 늘어나서 리듀스 단계에서 걸리는 시간을 줄일 수 있다. 그러나 너무 많이 늘리면 작은 파일이 너무 많이 생성되는 준최적화(suboptimal)에 빠지게 된다. 경험적으로 리듀서의 실행 시간은 5분 내외, 출력 파일의 HDFS 블록 수는 최소 1개로 잡는 것이 좋다.

 

반응형

+ Recent posts