하둡 완벽가이드 책을 읽으면서 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
'Hadoop' 카테고리의 다른 글
[Hadoop] RPC 에 대한 간단한 설명 및 링크 (0) | 2020.07.29 |
---|---|
[Hadoop] 하둡 완벽 가이드 필기 - HDFS (0) | 2020.07.29 |
[Hadoop] 하둡 완벽 가이드 필기 - YARN (0) | 2020.07.29 |
[YARN] 스케줄러 scheduler 설명 (0) | 2020.07.23 |
[Hadoop] edit log 와 fsimage (0) | 2020.07.21 |