MapReduce: Job 제출 과정


       
Hadoop 을 처음 배 웠 습 니 다. MapReduce job 의 수명 주기 중 job 제출, task 배포 와 task 실행, JT scheduling 전략, job 성능 참고 등에 대한 지식 을 몇 편의 로그 로 설명 하려 고 합 니 다.코드 및 참고 자 료 를 통 해 job 집행 의 대체적인 세부 사항 을 알 고 싶 으 며, 이후 job 성능 이 좋 을 때 근거 가 있 기 를 기대 합 니 다.세부 사항 과 관련 된 코드 는 Hadoop - 0.21.0 버 전 을 참고 합 니 다.
        MapReduce 는 Hadoop FileSystem 에 의존 하여 job 실행 과정 에서 필요 한 모든 자원 파일 을 저장 합 니 다.이 파일 들 은 job 의 jar 파일, job 의 프로필, job 의 mapper 가 처리 해 야 할 대상 파일 (입력 파일) 과 job 의 출력 결과 가 있 습 니 다.MapReduce 는 설정 파일 에 있 는 File System 의 URI 에 따라 현재 Hadoop 이 지원 하 는 File System 을 사용 하고 있 는 지 판단 할 수 있 으 며, 기본 값 은 local system 입 니 다.저 는 job 가 TT 에서 의 표현 에 관심 이 많 고 TT 는 DN 에 의존 하기 때문에 나중에 말 한 File System 은 모두 HDFS 를 말 합 니 다.        Cluster 에서 실행 되 는 MapReduce job 가 주목 해 야 할 설정 파일 은 mapred - default. xml 과 mapred - site. xml 입 니 다. 이름 에 따라 사이트 파일 에 Cluster 와 관련 된 내용 을 설정 해 야 합 니 다. default 는 마음대로 설정 할 수 있 습 니 다.그것들 과 관련 된 인용문 은 How To ConfigureCluster setup 이다.
             
      
                 위의 그림 은 job 의 완전한 실행 절 차 를 나타 낸다.이 블 로 그 는 첫 번 째 단계 부터 네 번 째 단계 까지 의 구체 적 인 실현 에 만 관심 을 가지 고 있 으 며, 당연히 시 뮬 레이 션 의 예 에서 순서대로 서술 할 것 이다.다음은 우리 의 진행 과정 을 시작 합 니 다...         MapReduce 자체 워드 Count 의 예, 예 를 들 어 프로 세 스 첫 번 째 단계 에서 기본 적 인 파 라 메 터 를 설정 한 후 job 를 시작 합 니 다.

                Cluster cluster = new Cluster(config);
		Job job = Job.getInstance(cluster);
		
		job.setMapperClass(WordMapper.class);
		job.setReducerClass(WordReducer.class);
		job.setJarByClass(WordCount.class);
		job.setCombinerClass(WordReducer.class);
		job.setOutputKeyClass(Text.class);
		job.setOutputValueClass(IntWritable.class);
		
		FileInputFormat.addInputPath(job, new Path(args[0]));
		FileOutputFormat.setOutputPath(job, new Path(args[1]));

		job.submit();

              
                여기 있 는 FileInputFormat. addInputPath (job, path) 를 주의 하 십시오. 먼저 MapReduce 의 입력 파일 이나 디 렉 터 리 가 File system 에 존재 하 는 지 확인 해 야 합 니 다. MapReduce 가 HDFS 에 의존 하면 로 컬 파일 을 HDFS 에 업로드 해 야 합 니 다.MapReduce 는 job 의 출력 결과 가 이전 job 의 출력 결 과 를 덮어 쓰 는 것 을 방지 하기 위해 서 모든 job 의 출력 디 렉 터 리 가 다른 job 와 독립 되 어야 하 며, 이 디 렉 터 리 는 job 초기 화 시 존재 하지 않 아야 하 며, job 가 필요 할 때 만 만들어 야 합 니 다. 그렇지 않 으 면 오류 가 발생 할 수 있 습 니 다.나 는 MapReduce 가 사용자 가 처음으로 출력 디 렉 터 리 를 설정 할 때 이 디 렉 터 리 의 유효성 을 검사 할 것 이 라 고 생각 했 지만 사실은 많은 일 을 한 후에 야 검 사 를 하 는 것 이 당 혹 스 러 웠 다.              job 제출 초기 에 절차 의 두 번 째 단계 와 같이 client 는 JT 에 job 의 식별 자로 jobID 를 신청 합 니 다.job 와 같은 jobID 형식201101281410_0001. 중간 문자열 은 JT 의 식별 자 이 고 그 다음은 job 의 번호 이 며 1 부터 계속 증가 합 니 다.        jobID 를 받 은 후 MapReduce 는 job 실행 에 필요 한 자원 파일 을 File system 에 복사 해 야 합 니 다.복사 하기 전에 이 자원 파일 들 이 File system 에 어디 에 저장 되 어 있 는 지 확인 해 야 합 니 다.JT 는 작업 디 렉 터 리 (Staging area, 데이터 센터 라 고도 함) 를 설정 하여 모든 job 와 관련 된 데 이 터 를 저장 합 니 다.이 디 렉 터 리 의 접 두 사 는 mapreduce. jobtracker. staging. root. dir 매개 변수 로 지 정 됩 니 다. 기본 값 은 / tmp / hadop / mapred / staging 입 니 다. 모든 client user 는 여러 개의 job 를 제출 할 수 있 습 니 다. 이 디 렉 터 리 에 user name 정 보 를 추가 해 야 합 니 다.그래서 이 작업 디 렉 터 리 (Staging area) 는: / tmp / hadop / mapred / staging / denny /. staging / 와 유사 합 니 다.job 와 관련 된 자원 파일 에 저 장 된 디 렉 터 리 는 작업 디 렉 터 리 + jobID: ${Staging area} / job201101281410_0001。         이 자원 파일 들 이 저 장 된 상황 은 다음 과 같다.
    
 
      stagingArea/job_yyyyMMddHHmm_tttt/job.jar    job     jar  
      stagingArea/job_yyyyMMddHHmm_tttt/files    job     
      stagingArea/job_yyyyMMddHHmm_tttt/libjars  job     jar  
      stagingArea/job_yyyyMMddHHmm_tttt/archives  job archives  

    
        현재 File system 이 HDFS 라면 위의 모든 파일 에 대해 HDFS 의 replication 을 설정 합 니 다. 이 값 은 mapreduce. client. submit. file. replication 매개 변수 로 지 정 됩 니 다. 기본 값 은 10 입 니 다. 일반 HDFS 파일 의 기본 폭 보다 훨씬 큽 니 다. 입력 데 이 터 를 더 많은 DT 에 올 리 고 가능 한 한 로 컬 데이터 계산 을 실현 하 는 것 도 고려 할 수 있 습 니 다.         자원 파일 을 File system 에 업로드 한 후, job 제출 을 담당 하 는 프로그램 은 job 설정 의 출력 디 렉 터 리 (output dir) 를 검사 합 니 다.이 디 렉 터 리 가 지정 되 지 않 았 거나 디 렉 터 리 가 File system 에 존재 하지 않 으 면 이상 을 던 집 니 다.왜 그렇게 많은 파일 을 올 린 후에 야 이 관건 적 인 검 사 를 해 야 합 니까?        다음은 전체 job 제출 과정 에서 가장 중요 한 단계 입 니 다. 입력 파일 에 대해 데이터 분할 (input split) 을 합 니 다.MapReduce 과정 에서 모든 mapper 는 입력 파일 의 어느 부분 을 처리 하 는 지 어떻게 압 니까?마 퍼 가 실행 되 기 전에 데 이 터 를 처리 하 는 범 위 를 정 해 야 한다. 그러면 현재 의 데이터 분할 작업 은 바로 이런 일 을 하 는 것 이다.더 중요 한 것 은 필름 의 수량 이 맵 task 의 수량 을 결정 하고 그것들 사이 에 일일이 대응한다.이 데이터 블록 (split) 은 논리 블록 일 뿐 어느 블록 에 접근해 야 하 는 지, 그리고 이 블록의 시작 index 와 데이터 길이 에 대한 정 보 를 기록 합 니 다.        다음은 데 이 터 를 어떻게 나 누 는 지 자세히 말씀 드 리 겠 습 니 다.job 는 여러 개의 입력 파일 이 있 을 수 있 습 니 다. 다른 디 렉 터 리 에 분포 되 어 있 을 수도 있 습 니 다.우 리 는 입력 디 렉 터 리 의 설정 을 가 져 온 후에 우리 가 처리 해 야 할 파일 들 을 식별 할 수 있다.디 렉 터 리 에 있 는 파일 이 우리 의 요구 에 부합 되 는 지 여 부 를 필터 하기 위해 PathFilter 를 설정 할 수 있 습 니 다. 사용자 정의 PathFilter 클래스 는 mapreduce. input. pathFilter. class 속성 으로 설정 할 수 있 습 니 다.우리 가 가 져 온 모든 입력 파일 에 대해 블록 정보 에 따라 데이터 블록 을 만 들 고 파일 사이 에 블록 을 만 들 수 없습니다.데이터 분할 의 데이터 크기 를 설정 할 수 있 습 니 다. 최소 바이트 수 는 mapreduce. input. fileinputformat. split. minsize 로 설정 할 수 있 습 니 다. 기본 값 은 1 이 고 최대 바이트 수 는 mapreduce. input. fileinputformat. split. maxsize 로 설정 할 수 있 습 니 다. 기본 값 은 Long. MAX 입 니 다.VALUE。사용자 가 정의 하 는 블록 크기 의 설정 과 각 파일 block 크기 의 설정 으로 블록 크기 를 계산 할 수 있 습 니 다.분 편 크기 를 계산 하 는 공식 은?
splitSize = Math.max(minSize, Math.min(maxSize, blockSize))

공식 적 으로 볼 수 있 듯 이 max Size 설정 이 BlockSize 보다 크 면 모든 block 은 하나의 블록 파일 입 니 다. 그렇지 않 으 면 하나의 block 파일 을 여러 개의 블록 으로 나 눌 것 입 니 다. 만약 에 block 에 남 은 작은 데이터 양 이 splitSize 보다 적 으 면 독립 적 인 블록 이 라 고 생각 합 니까?        분 편 이 생 긴 후에 우 리 는 이 데 이 터 를 저장 하고 stagingarea / job 로 정렬 해 야 한다.yyyyMMddHHmm_tttt / job. split 파일 에서 맵 task 가 실 행 될 때 만 접근 할 수 있 습 니 다.이 동시에 각 조각 을 하나의 MetaData 정보 로 나 누 었 습 니 다. 이 MetaData 정 보 는 각 조각 이 어느 slave server 에 있 는 지 포함 하고 있 습 니 다. JT 가 방문 하고 맵 task 를 물리 적 파일 을 가 진 slave server 에 효과적으로 배포 하 는 근거 로 합 니 다.MetaData 정 보 는 stagingArea / job 에 저 장 됩 니 다.yyyyMMddHHmm_tttt / job. splitmetainfo 파일 에 있 습 니 다.               이로써 job 제출 에 필요 한 데 이 터 는 대부분 준비 되 었 고 앞의 블록 버스터 작업 도 맵 task 가 얼마나 필요 한 지 확 정 했 으 며 job 와 관련 된 설정 이 모두 확정 되 었 습 니 다.job 프로필 을 stagingarea / job 에 업로드 합 니 다.yyyyMMddHHmm_ttt / job. xml 파일 에서 client 에서 하 는 작업 이 완료 되 었 습 니 다.Client 는 JT 와 통신 을 시도 한 후 job 를 JT 에 제출 합 니 다.        JT 에 제출 한 작업 과 job 초기 화 에 대한 세부 사항 은 다음 절 에서 다시 이야기 합 니 다.

좋은 웹페이지 즐겨찾기