2012-10-22 1 views
4

내 Elastic Map에서 S3에 저장된 작업 출력 줄이기에 LZO 압축을 사용하려고하지만이 데이터에서 향후 작업이 파일을 여러 작업으로 분할 할 수 있도록 파일이 자동으로 인덱싱되는지는 분명하지 않습니다.AWS EMR의 Hadoop 출력에서 ​​LZO를 사용할 때 나중에 자동으로 분할 할 수 있도록 (S3에 저장된) 파일을 색인화합니까?

예를 들어, 내 출력이 1GB LZO 파일에서 일련의 TSV 데이터 라인 인 경우 장래의 맵 작업은 1 개의 작업 또는 (1GB/blockSize) 작업 (예 : 파일이 압축되지 않았거나 디렉토리에 LZO 색인 파일이있는 경우)?

편집 : 이것이 자동으로 수행되지 않으면 내 출력을 LZO-indexed로 만드는 데 권장되는 것은 무엇입니까? 의 색인을 수행하여3에 파일을 업로드 하시겠습니까?

답변

6

내 첫 번째 질문에 대한 간단한 대답 : AWS는 이 아니며 자동 색인 생성을 수행합니다. 나는 내 자신의 직업으로 이것을 확인했으며 [email protected] on their forum에서 같은 것을 읽었습니다. 인덱스으로

일부 LZO 파일, 당신은 Twitter hadoop-lzo 프로젝트에서 내장 내 자신의 항아리를 사용해야합니다 : 여기

는 인덱싱을 할 수있는 방법입니다. EMR을 사용하여 직접 인덱싱하려면 Jar를 어딘가에 작성한 다음 Amazon S3에 업로드해야합니다.

클로우 데라는 setting this up on your own cluster의 모든 단계에 대한 좋은 지침이 있습니다. 로컬 클러스터에서이 작업을 수행하여 Jar 파일을 만들고 S3에 업로드 할 수있었습니다. 직접 빌드하지 않으려는 경우 미리 빌드 된 Jar를 찾을 수 있습니다.

Hadoop 작업에서 데이터를 출력 할 때 LzoCodec이 아닌 LzopCodec을 사용해야합니다. 그렇지 않으면 파일이 색인 가능하지 않습니다 (적어도 내 경험에 기반 함). 예 자바 코드 (같은 생각은 스트리밍 API를 통해 전달) : (아래 설명하여 하둡 - LZO 항아리 S3에, 그리고 하둡 작업은 출력 디렉토리에 귀하의 인덱서를 실행 파일을 .lzo 출력했다

import com.hadoop.compression.lzo.LzopCodec; 
TextOutputFormat.setCompressOutput(job, true); 
TextOutputFormat.setOutputCompressorClass(job, LzopCodec.class) 

되면 당신이 EMR 작업/클러스터 실행) 가지고 : 당신이 미래의 작업의 데이터를 사용할 때 다음

elastic-mapreduce -j <existingJobId> \ 
    --jar s3n://<yourBucketName>/hadoop-lzo-0.4.17-SNAPSHOT.jar \ 
    --args com.hadoop.compression.lzo.DistributedLzoIndexer \ 
    --args s3://<yourBucketName>/output/myLzoJobResults \ 
    --step-name "Lzo file indexer Jar" 

을, 그렇지 않으면 분리가 발생하지 않습니다, 입력이 LZO 형식으로 지정해야합니다. 자바 코드 예제 :

import com.hadoop.mapreduce.LzoTextInputFormat; 
job.setInputFormatClass(LzoTextInputFormat.class); 
관련 문제