하둡 완벽가이드 책을 읽으면서 p 72 입력 스플릿, 혹은 단순히 스플릿 이라는 크기로

job 입력값을 나눈다는 것을 보았다.

이게 내가 알던 Block Size(128mb) 랑 헷갈려서 더 자세히 알아보았다.

 

원본 파일을 HDFS 에 물리적으로 블록 크기만큼 나눠서 저장하는 것이 흔히 알고 있는 Block size(128mb)

그럼 split size 란?

"Job 을 처리할 때 데이터를 얼마만큼 읽을 것인지에 대한 크기" 라고 이해할 수 있겠다.

 

예를 들어보자.

192mb 짜리 원본 파일이 128mb block size 로 나뉘어져서 HDFS 에 저장된다.

128mb, 64mb 짜리 두 블록이 되겠다.

 

이 상황에서 어떤 사람이 split size 를 64mb 로 정해두고 job 을 실행시켰다.

그럼 job 은 HDFS 2개의 blocks 에서 64mb 만큼 데이터를 읽어온다.

128mb block 에서 두 번 읽어오고

64mb block 에서 한 번 읽어오겠다.

 

다른 사람이 split size 를 96mb 로 정해두고 job 을 실행시켰다.

그럼 job 은 HDFS 2개의 blocks 에서 96mb 만큼 데이터를 읽어온다.

128mb block 에서 한 번 읽어온다. 따라서 이 block 에서 읽지 않은 데이터는 32mb 이다.

읽지 않은 32mb 와 64mb block 을 동시에 한 번 읽어온다.

 

split size 가 작으면 map task 가 많이 실행되는데,

이때 실행되는 오버헤드가 있지만 map task 가 많아 병렬처리성이 좋아진다.

반대로, split size 가 크면 map task 가 조금 실행되는데,

병렬처리성은 떨어지지만 map task 실행 오버헤드는 줄어든다.

 

책에서는 split size 와 block size 의 크기가 같게 맞추도록 권장하고 있다.

 

이유 : 

 

"일반적인 스플릿 크기는 HDFS 블록의 기본 크기인 128mb 가 적당

최적의 스플릿 크기가 HDFS 블록 크기(128mb)와 같아야 하는 이유는 

그 블록 크기가 단일 노드에 저장된다고 확신할 수 있는 가장 큰 입력이기 때문

 

하나의 스플릿이 두 블록에 걸쳐있을 때(128mb 이상일 때)

두 블록 모두 저장하는 HDFS  노드는 존재할 가능성이 낮아서

스플릿의 일부 데이터를 네트워크를 통해 맵 태스크가 실행되는 다른 노드로 전송해야 함

이렇게 되면 맵 태스크 전체가 로컬 데이터만 이용할 때보다 느려짐"

 

split size 에 따라 MAP 의 개수가 정해진다.

위의 예에서, 먼젓번 사람은 3개의 Map을 실행시킬 것이고,

두번째 사람은 2개의 Map 을 실행시킬 것이다.

 

split size 를 정해주지 않으면 기본적으로 Block Size 를 따라간다.

block size = 128mb = default split size

 

split size 를 정해주는 옵션의 이름은 mapred.min.split.size 이다.

참고로 split size 외에 Map 개수를 아래처럼 정해줄 수 있다.

./bin/hadoop jar hadoop-example-1.0.3.jar terasort –Dmapred.map.tasks=40 –Dmapred.reduce.tasks=5 /home/teragen /home/terasort

 

 

 

https://stackoverflow.com/questions/30549261/split-size-vs-block-size-in-hadoop

https://m.blog.naver.com/PostView.nhn?blogId=yoonhok_524&logNo=60172127824&proxyReferer=https:%2F%2Fwww.google.com%2F

 

+ Recent posts