복붙노트

[HADOOP] Hadoop Streaming에서 "typedbytes"또는 "rawbytes"를 사용하는 방법은 무엇입니까?

HADOOP

Hadoop Streaming에서 "typedbytes"또는 "rawbytes"를 사용하는 방법은 무엇입니까?

Hadoop Streaming이 Java 이외의 다른 언어로 바이너리 데이터를 분석 할 수있게 해주는 "typedbytes"또는 "rawbytes"모드로 해결할 수있는 문제가 있습니다. (이 기능이 없으면 스트리밍은 \ t 및 \ n과 같은 문자를 구분 기호로 해석하고 non-utf-8 문자에 대해 불만을 토로합니다. 내 바이너리 데이터를 모두 Base64로 변환하면 작업 흐름이 느려지므로 목적을 이길 수 있습니다.)

이 바이너리 모드는 HADOOP-1722에 의해 추가되었습니다. Hadoop Streaming 작업을 호출하는 명령 줄에서 "-io rawbytes"를 사용하면 데이터를 32 비트 정수 크기와 그 크기의 원시 데이터로 정의 할 수 있으며 "-io typedbytes"를 사용하면 데이터를 1로 정의 할 수 있습니다 - 비트 0 (원시 바이트를 의미 함), 32 비트 정수 크기, 그 다음에 해당 크기의 원시 데이터가옵니다. 나는 하나 또는 여러 개의 레코드를 사용하여 이러한 형식의 파일을 만들었고 typedbytes.py의 출력과 비교하여 올바른 형식으로되어 있는지 확인했습니다. 또한 모든 가능한 변형 (빅 엔디안, 리틀 엔디안, 다른 바이트 오프셋 등)을 시도했습니다. CDH4에서 Hadoop 0.20을 사용하고 있습니다.이 클래스는 typedbytes 처리를 구현하는 클래스가 있으며 "-io"스위치가 설정되면 해당 클래스를 입력합니다.

"hadoop fs -copyFromLocal"을 사용하여 이진 파일을 HDFS에 복사했습니다. 지도 축소 작업의 입력으로 사용하려고하면 지정한 길이 (예 : 3 바이트)의 바이트 배열을 만드는 행의 OutOfMemoryError와 함께 실패합니다. 숫자를 잘못 읽고 큰 블록을 할당해야합니다. 그럼에도 불구하고, mapper (이전 레코드는 확실하지 않음)에 레코드를 가져올 수 있습니다.이 레코드는 표준 오류에 기록하여 볼 수 있습니다. 레코드의 시작 부분에는 항상 너무 많은 바이트가 있습니다. 예를 들어 파일이 "\ x00 \ x00 \ x00 \ x00 \ x03hey"인 경우 매퍼는 "\ x04 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x07 \ x00 \ x00 \ x00 \ x08 \ x00 \ x00 \ x00 \ x00 \ x03hey "(재현 가능한 비트, 내가 볼 수있는 패턴은 없지만).

이 대화의 5 페이지에서, 나는 "loadtb"와 "dumptb"라는 명령을 사용하여 HDFS로 /로부터 복사하고 SequenceFile의 입력 된 바이트를 랩핑 / 언랩하는 것을 배웠습니다. "-inputformat org.apache.hadoop.mapred.SequenceFileAsBinaryInputFormat"과 함께 사용하면 Hadoop은 SequenceFile을 정확하게 언팩하지만 정확하게 동일한 방식으로 안에 포함 된 typedbytes를 잘못 해석합니다.

또한이 기능에 대한 문서를 찾을 수 없습니다. 2 월 7 일에 (이메일로 보내 드렸습니다) 아파치의 streaming.html 페이지에서 짧게 언급되었지만,이 r0.21.0 웹 페이지는 이후 삭제되었으며 r1.1.1에 상응하는 페이지에는 rawby에 대한 언급이 없습니다. 또는 typedbytes.

그래서 내 질문은 : Hadoop Streaming에서 rawbytes 또는 typedbytes를 사용하는 올바른 방법은 무엇입니까? 누구도 일하게 한 적이 있습니까? 그렇다면 조리법을 게시 할 수 있습니까? Hadoop Streaming에서 바이너리 데이터를 사용하고자하는 사람에게는 이것이 문제가 될 것입니다. Hadoop Streaming은 상당히 광범위한 그룹이어야합니다.

추신 Dumbo, Hadoopy 및 rmr 모두이 기능을 사용하지만 Python 기반 또는 R 기반 프레임 워크를 중재하지 않고 직접 사용하는 방법이 있어야합니다.

해결법

  1. ==============================

    1.좋아, 나는 효과가있는 조합을 찾았지만, 이상해.

    좋아, 나는 효과가있는 조합을 찾았지만, 이상해.

    stream.map.output 및 stream.reduce.input에 대한 유일한 설명서는 2009 년 2 월 6 일부터 HADOOP-1722 교환에있었습니다 (이전 논의에서는 형식을 매개 변수화하는 다른 방법을 고려했습니다.)

    이 제조법은 입력에 강력한 입력을 제공하지 않습니다. 유형 문자는 SequenceFile을 생성하고 -inputformat을 사용하여 해석 할 때 어딘가에서 손실됩니다. 그러나 이것은 '\ n'(정말로 중요한 것)과 매퍼 (mapper)와 감속기 (reducer) 사이의 강력한 타이핑 (typing)보다는 바이너리 레코드 경계에서 분리를 제공합니다.

  2. ==============================

    2.Mapper로 데이터를 스트리밍 할 때 분할 레벨에서 데이터를 헥사 인코딩하여 이진 데이터 문제를 해결했습니다. 이것은 노드에서 처리하기 전에 데이터를 먼저 변환하는 대신 조작의 병렬 효율성을 활용하고 증가시킵니다.

    Mapper로 데이터를 스트리밍 할 때 분할 레벨에서 데이터를 헥사 인코딩하여 이진 데이터 문제를 해결했습니다. 이것은 노드에서 처리하기 전에 데이터를 먼저 변환하는 대신 조작의 병렬 효율성을 활용하고 증가시킵니다.

  3. ==============================

    3.분명히 스트리밍을위한 JustBytes IO 모드에 대한 패치가 있는데, 이는 매퍼 (mapper) 명령에 전체 입력 파일을 제공합니다.

    분명히 스트리밍을위한 JustBytes IO 모드에 대한 패치가 있는데, 이는 매퍼 (mapper) 명령에 전체 입력 파일을 제공합니다.

    https://issues.apache.org/jira/browse/MAPREDUCE-5018

  4. from https://stackoverflow.com/questions/15171514/how-to-use-typedbytes-or-rawbytes-in-hadoop-streaming by cc-by-sa and MIT license