[HADOOP] Hadoop MapReduce에서 바이너리 파일 용 사용자 정의 InputFormat 및 RecordReader 만들기
HADOOPHadoop MapReduce에서 바이너리 파일 용 사용자 정의 InputFormat 및 RecordReader 만들기
저는 이진 형식으로 작성된 커다란 시계열 데이터 파일을 처리하는 M / R 작업을 작성하고 있습니다.이 파일은 다음과 같습니다 (가독성을 위해 여기에 새로운 행이 있으며 실제 데이터는 분명히 연속적입니다).
TIMESTAMP_1---------------------TIMESTAMP_1
TIMESTAMP_2**********TIMESTAMP_2
TIMESTAMP_3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%TIMESTAMP_3
.. etc
여기서 타임 스탬프는 단순히 8 바이트 구조체이며 처음 2 바이트만큼 식별 할 수 있습니다. 실제 데이터는 위에 표시된 것처럼 중복 값 타임 스탬프 사이에 한정되며 하나 이상의 미리 정의 된 구조체를 포함합니다. mappers에 키 / 값 쌍을 방출하는 사용자 정의 InputFormat을 작성하려고합니다.
< TIMESTAMP_1, --------------------- >
< TIMESTAMP_2, ********** >
< TIMESTAMP_3, %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% >
논리적으로, 나는 현재 TIMESTAMP를 추적하고, TIMESTAMP가 다시 감지 될 때까지 모든 데이터를 모으고 싶습니다. 그런 다음 내
# a split occurs inside my data
reader X: TIMESTAMP_1--------------
reader Y: -------TIMESTAMP_1 TIMESTAMP_2****..
# or inside the timestamp
or even: @@@@@@@TIMES
TAMP_1-------------- ..
이것에 접근하는 좋은 방법은 무엇입니까? 내 CustomRecordReader가 데이터를 잃지 않고 분할간에 동기화 할 수 있도록 파일 오프셋에 액세스하는 쉬운 방법이 있습니까? 나에게는 분할이 어떻게 처리되는지에 대한 개념적 차이가 있으므로 이러한 설명이 도움이 될 수 있습니다. 감사.
해결법
-
==============================
1.일반적으로 분할을 지원하는 입력 형식을 만드는 것은 간단하지 않습니다. 일관된 레코드를 얻기 위해 분할 경계에서 이동할 위치를 찾을 수 있어야하기 때문입니다. XmlInputFormat은 이렇게하는 형식의 좋은 예입니다. 실제로 분할 가능 입력이 필요한지 먼저 고려해 보시기 바랍니다. 입력 형식을 분할 가능하지 않은 것으로 정의 할 수 있으며 이러한 모든 문제가있는 것은 아닙니다. 일반적으로 파일 크기가 블록 크기보다 크지 않으면 아무 것도 없습니다. 그들이하는 경우 - 당신은 데이터 지역의 일부를 풀 것입니다.
일반적으로 분할을 지원하는 입력 형식을 만드는 것은 간단하지 않습니다. 일관된 레코드를 얻기 위해 분할 경계에서 이동할 위치를 찾을 수 있어야하기 때문입니다. XmlInputFormat은 이렇게하는 형식의 좋은 예입니다. 실제로 분할 가능 입력이 필요한지 먼저 고려해 보시기 바랍니다. 입력 형식을 분할 가능하지 않은 것으로 정의 할 수 있으며 이러한 모든 문제가있는 것은 아닙니다. 일반적으로 파일 크기가 블록 크기보다 크지 않으면 아무 것도 없습니다. 그들이하는 경우 - 당신은 데이터 지역의 일부를 풀 것입니다.
-
==============================
2.FileInputFormat의 구상 서브 클래스 (예 : SeqenceFileAsBinaryInputFormat)를 서브 클래스 화하고 isSplitable () 메서드를 재정 의하여 false를 반환 할 수 있습니다.
FileInputFormat의 구상 서브 클래스 (예 : SeqenceFileAsBinaryInputFormat)를 서브 클래스 화하고 isSplitable () 메서드를 재정 의하여 false를 반환 할 수 있습니다.
import org.apache.hadoop.fs.FileSystem; import org.apache.hadoop.fs.Path; import org.apache.hadoop.mapred.SequenceFileAsBinaryInputFormat; public class NonSplitableBinaryFile extends SequenceFileAsBinaryInputFormat{ @Override protected boolean isSplitable(FileSystem fs, Path file) { return false; } @Override public RecordReader getRecordReader(InputSplit split, JobConf job, Reporter reporter) throws IOException { //return your customized record reader here } }
from https://stackoverflow.com/questions/10531007/creating-custom-inputformat-and-recordreader-for-binary-files-in-hadoop-mapreduc by cc-by-sa and MIT license
'HADOOP' 카테고리의 다른 글
[HADOOP] Hadoop 정렬 입력 순서 (0) | 2019.07.31 |
---|---|
[HADOOP] 하이브 테이블의 데이터 행을 개별 행으로 가져 오려면 어떻게해야합니까? (0) | 2019.07.31 |
[HADOOP] 나머지 API를 통해 MapReduce 작업 실행 (0) | 2019.07.31 |
[HADOOP] hadoop-core에 대한 maven artifactId hadoop 2.2.0 (0) | 2019.07.30 |
[HADOOP] Hadoop의지도 축소 프레임에서 "Selenium Webdriver"를 실행하고지도 단계에서 고정합니다. (0) | 2019.07.30 |