Hadoop 은 어떻게 나 눠 요?
4444 단어 빅 데이터-Hadop
첫 번 째 부분 은 데이터 의 구분 (즉, File 을 Block 으로 나 누 는 것) 입 니 다. 이것 은 물리 적 으로 진실 하 게 구분 되 었 습 니 다. 데이터 파일 이 HDFS 에 올 라 갈 때 한 조각 으로 나 누 어야 합 니 다. 각 조각의 크기 는 hadop - default. xml 에서 설정 옵션 으로 나 누 어야 합 니 다.
dfs.block.size
67108864
The default block size for new files.
이것 이 기본 블록 당 64MB 입 니 다.데 이 터 를 구분 할 때 군더더기 가 있 고 개 수 는 아래 설정 에서 지정 합 니 다.
dfs.replication
3
Default block replication.
The actual number of replications can be specified when the file is created.
The default is used if replication is not specified in create time.
구체 적 인 물리 적 구분 절 차 는 Namenode 에서 결정 합 니 다.
두 번 째 구분 은 InputFormat 이라는 인터페이스 에서 정 의 된 것 으로 getSplits 방법 이 있 습 니 다.여기에 새로운 개념 이 하나 있다. fileSplit.매 맵 마다 fileSplit 을 처리 하기 때문에 몇 개의 fileSplit 만 있 으 면 맵 이 몇 개 있 습 니까?
hadop 분배 splits 의 소스 코드 를 살 펴 보 겠 습 니 다.
if ((length != 0) && isSplitable(fs, path)) {
long blockSize = file.getBlockSize();
long splitSize = computeSplitSize(goalSize, minSize, blockSize);
long bytesRemaining = length;
while (((double) bytesRemaining)/splitSize > SPLIT_SLOP) {
int blkIndex = getBlockIndex(blkLocations, length-bytesRemaining);
splits.add(new FileSplit(path, length-bytesRemaining, splitSize, blkLocations[blkIndex].getHosts()));
bytesRemaining -= splitSize;
}
if (bytesRemaining != 0) {
splits.add(new FileSplit(path, length-bytesRemaining, bytesRemaining, blkLocations[blkLocations.length-1].getHosts())); }
} else if(length!=0) {
splits.add(new FileSplit(path,0,length,blkLocations[0].getHosts()));
}else{
// Create empty hosts array for zero length files
splits.add(new FileSplit(path,0,length,new String[0]));
}
코드 를 통 해 알 수 있 듯 이 하나의 블록 은 하나의 splits, 즉 하나의 map 이 고 하나의 블록 크기 만 알 면 실행 시의 map 수 를 계산 할 수 있 습 니 다.하나의 split 의 크기 는 goalSize, minSize, blockSize 세 가지 값 으로 결정 된다.coptute SplitSize 의 논 리 는 goalSize 와 blockSize 두 값 중에서 가장 작은 것 을 선택 하 는 것 입 니 다 (예 를 들 어 일반적으로 map 수 를 설정 하지 않 습 니 다. 이때 blockSize 는 현재 파일 의 블록 size 이 고 goalSize 는 파일 크기 를 사용자 가 설정 한 map 수로 나 누 어 얻 은 것 입 니 다. 설정 하지 않 으 면 기본 값 은 1 입 니 다). 기본 적 인 대부분 상황 에서 blockSize 는 비교적 작 습 니 다.그리고 블 로 스 사이즈 랑 민 사이즈 중 에 제일 큰 거.한편, minSize 는 'mapred. min. split. size' 설정 을 통과 하지 않 으 면 ('mapred. min. split. size' 는 기본 0), minSize 는 1 입 니 다. 이렇게 얻 은 splits 의 size 는 바로 blockSize 입 니 다. 즉, 하나의 맵 이 있 고 몇 조각 이 있 으 면 map 가 있 습 니 다.
위 에서 말 한 것 은 splitable 의 경우 unsplitable 은 실제 상황 에 따라 계산 할 수 있 으 며, 일반적으로 하나의 파일 에 맵 을 표시 합 니 다.
다음은 인터넷 에서 발췌 한 총 결 이다.
몇 가지 간단 한 결론: 1. 하나의 split 는 0 시 몇 개 또는 몇 시 몇 개의 Block 을 포함 하지 않 습 니 다. 반드시 1 개의 정수 와 같은 Block 을 포함 합 니 다. 2. 하나의 split 는 두 개의 File 의 Block 을 포함 하지 않 고 File 경 계 를 뛰 어 넘 지 않 습 니 다. 3. split 와 Block 의 관 계 는 한 쌍 이상 의 관계 입 니 다. 4. maptasks 의 개 수 는 결국 splits 의 길이 로 결 정 됩 니 다.
그리고 한 가지 설명 이 필요 합 니 다. FileSplit 류 중 하 나 는 private String [] hosts 입 니 다.이 FileSplit 이 어떤 기계 에 놓 여 있 는 지 설명 하 는 것 처럼 보이 지만, 실제로 hosts 에는 Block 의 불필요 한 기계 목록 만 저장 되 어 있 을 뿐이다.예 를 들 어 하나의 fileSplit 에는 4 개의 Block 이 있 습 니 다. Block 11, Block 12, Block 13, Block 14. 이 FileSplit 의 hosts 에 최종 적 으로 저 장 된 것 은 Block 11 자체 와 백업 이 있 는 기계 목록 입 니 다. 즉, Block 12, Block 13, Block 14 에 어떤 기계 가 FileSplit 에 기록 되 어 있 지 않 습 니까?
FileSplit 의 이 속성 은 스케줄 링 작업 시의 데이터 로 컬 문제 에 유리 합 니 다.tasktracker 가 task 를 요청 하면 jobtracker 는 task 를 찾 아 maptask 를 찾 습 니 다. 이 task 가 입력 한 FileSplit 에 hosts 가 tasktracker 가 있 는 기 계 를 포함 하고 있 는 지 확인 해 야 합 니 다. 즉, 이 tasktracker 와 한 기계 에 있 는 datanode 가 FileSplit 의 한 Block 백업 을 가지 고 있 는 지 판단 하 는 것 입 니 다.
그러나 한 마디 로 블록 하나만 끌 어 올 릴 수 있 고, 다른 블록 은 인터넷 에서 올 려 야 한다.그러나 기본 적 인 대부분의 경우 하나의 block 에 대응 하 는 map 는 hosts 를 수정 하여 map 의 현지 화 수 를 더 많이 할 수 있 습 니 다.block 의 hosts 가 fileSplit 에 전 달 될 때 hosts 의 호스트 주 소 는 여러 개 입 니 다. map 는 이 hosts 에서 우선 선택 할 수 있 음 을 나타 냅 니 다 (우선 일 뿐 hdfs 는 그 당시 의 네트워크 부하 에 따라 hosts 의 호스트 가 아 닌 map task 를 선택 할 수 있 습 니 다).
이 기능 을 알 고 fileSplit 에 전 송 된 hosts 를 수정 할 수 있 습 니 다. 목록 에 block 이 있 는 hosts 만 쓰 면 hdfs 는 이 map 를 이 hosts 에 우선 올 려 서 실행 할 수 있 습 니 다. hosts 에 이 block 이 있 기 때문에 네트워크 로 데 이 터 를 전송 하 는 시간 을 절약 할 수 있 습 니 다.
이렇게 하면 job 가 많 을 때 hot spot, 즉 데 이 터 를 많이 사용 할 수록 hosts 에 있 는 map task 가 많아 질 수 있 습 니 다.그래서 fileSplit 에 전 달 될 때 균형 을 맞 추 는 여러 가지 요 소 를 고려 해 야 합 니 다.