복붙노트

[HADOOP] 전체 스키마 정보가없는 Hadoop SequenceFile은 어떻게 검사 할 수 있습니까?

HADOOP

전체 스키마 정보가없는 Hadoop SequenceFile은 어떻게 검사 할 수 있습니까?

나는 검사하고 싶은 고객으로부터 압축 된 Hadoop SequenceFile을 가지고있다. 현재 (별도로 작업하고있는) 전체 스키마 정보가 없습니다.

그러나 잠정적으로 (그리고 일반적인 해결책이 있기를 희망하여), 파일 검사 옵션은 무엇입니까?

forqlift라는 도구를 찾았습니다. http://www.exmachinatech.net/01/forqlift/

그리고 파일에 'forqlift list'를 시도했습니다. 포함되어있는 커스텀 서브 클래스 Writable의 클래스를로드 할 수 없다고 불평합니다. 따라서 이러한 구현을 추적해야합니다.

그 동안에 다른 옵션을 사용할 수 있습니까? 나는 데이터를 추출 할 수 없다는 것을 이해하지만, 얼마나 많은 키 값과 타입을 스캔 할 수있는 도구가 있습니까?

해결법

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

    1.'Hadoop : The Definitive Guide'샘플 코드에서 SequenceFileReadDemo 클래스를 확인하십시오. 시퀀스 파일에는 키 / 값 유형이 포함되어 있습니다. 형식 정보를 가져 오려면 SequenceFile.Reader.getKeyClass () 및 SequenceFile.Reader.getValueClass ()를 사용하십시오.

    'Hadoop : The Definitive Guide'샘플 코드에서 SequenceFileReadDemo 클래스를 확인하십시오. 시퀀스 파일에는 키 / 값 유형이 포함되어 있습니다. 형식 정보를 가져 오려면 SequenceFile.Reader.getKeyClass () 및 SequenceFile.Reader.getValueClass ()를 사용하십시오.

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

    2.셸에서 :

    셸에서 :

    $ hdfs dfs -text /user/hive/warehouse/table_seq/000000_0
    

    또는 하이브에서 직접 가져온 파일 (작은 파일의 경우 이미 시작된 JVM에서 실행되기 때문에 훨씬 빠름)

    hive> dfs -text /user/hive/warehouse/table_seq/000000_0
    

    시퀀스 파일에서 작동합니다.

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

    3.나의 첫 번째 생각은 시퀀스 파일을 읽기 위해 자바 API를 사용하는 것이다. 파일에 어떤 Writable이 사용되는지 알지 못하더라도 오류 메시지를 추측하고 확인할 수 있습니다 (모르는 더 나은 방법이있을 수 있음).

    나의 첫 번째 생각은 시퀀스 파일을 읽기 위해 자바 API를 사용하는 것이다. 파일에 어떤 Writable이 사용되는지 알지 못하더라도 오류 메시지를 추측하고 확인할 수 있습니다 (모르는 더 나은 방법이있을 수 있음).

    예 :

    private void readSeqFile(Path pathToFile) throws IOException {
      Configuration conf = new Configuration();
      FileSystem fs = FileSystem.get(conf);
    
      SequenceFile.Reader reader = new SequenceFile.Reader(fs, pathToFile, conf);
    
      Text key = new Text(); // this could be the wrong type
      Text val = new Text(); // also could be wrong
    
      while (reader.next(key, val)) {
        System.out.println(key + ":" + val);
      }
    }
    

    이러한 프로그램이 잘못된 형식 인 경우이 프로그램이 중단되지만 Exception은 키와 값이 실제로 어떤 Writable 형식인지 말해야합니다.

    편집하다: 실제로 적은 file.seq를 사용하면 일반적으로 헤더의 일부를 읽고 Writable 유형이 무엇인지 확인할 수 있습니다 (최소한 첫 번째 키 / 값의 경우). 예를 들어 하나의 파일에 다음과 같이 표시됩니다.

    SEQ ^ F ^ Yorg.apache.hadoop.io.Text "org.apache.hadoop.io.BytesWritable

  4. ==============================

    4.나는 단지 Dumbo와 놀고 있었다. Hadoop 클러스터에서 Dumbo 작업을 실행하면 출력은 시퀀스 파일입니다. Dumbo 생성 시퀀스 파일 전체를 일반 텍스트로 덤프하려면 다음을 사용했습니다.

    나는 단지 Dumbo와 놀고 있었다. Hadoop 클러스터에서 Dumbo 작업을 실행하면 출력은 시퀀스 파일입니다. Dumbo 생성 시퀀스 파일 전체를 일반 텍스트로 덤프하려면 다음을 사용했습니다.

    $ bin/hadoop jar contrib/streaming/hadoop-streaming-1.0.4.jar \
        -input totals/part-00000 \
        -output unseq \
        -inputformat SequenceFileAsTextInputFormat
    $ bin/hadoop fs -cat unseq/part-00000
    

    나는 여기서 아이디어를 얻었다.

    덧붙여, Dumbo는 일반 텍스트도 출력 할 수 있습니다.

  5. ==============================

    5.나는 Java 또는 Hadoop 프로그래머가 아니기 때문에 문제를 해결하는 나의 방법은 최선이 아니지만 어쨌든.

    나는 Java 또는 Hadoop 프로그래머가 아니기 때문에 문제를 해결하는 나의 방법은 최선이 아니지만 어쨌든.

    hadoop을 설치하지 않고 FileSeq을 로컬에서 읽는 문제 (Linux debian amd64)를 해결하는 데 2 ​​일을 보냈습니다.

    제공된 샘플

    while (reader.next(key, val)) {
        System.out.println(key + ":" + val);
      }
    

    Text에서는 잘 작동하지만 BytesWritable 압축 입력 데이터에서는 작동하지 않습니다.

    제가 한? 나는 (SequenceFiles Hadoop 데이터를 작성하기 위해)이 유틸리티를 다운로드했다. github_com / shsdev / sequencefile-utility / archive / master.zip , 그리고 그것을 작동시킨 다음, 입력 Hadoop SeqFiles를 읽도록 수정했습니다.

    데비안에서 처음부터이 유틸리티를 실행하는 방법은 다음과 같습니다.

    sudo apt-get install maven2
    sudo mvn install
    sudo apt-get install openjdk-7-jdk
    
    edit "sudo vi /usr/bin/mvn",
    change `which java` to `which /usr/lib/jvm/java-7-openjdk-amd64/bin/java`
    
    Also I've added (probably not required)
    '
    PATH="/home/mine/perl5/bin${PATH+:}${PATH};/usr/lib/jvm/java-7-openjdk-amd64/"; export PATH;
    
    export JAVA_HOME=/usr/lib/jvm/java-7-openjdk-amd64/
    export JAVA_VERSION=1.7
    '
    to ~/.bashrc
    
    
    Then usage:
    sudo mvn install
    ~/hadoop_tools/sequencefile-utility/sequencefile-utility-master$ /usr/lib/jvm/java-7-openjdk-amd64/bin/java -jar ./target/sequencefile-utility-1.0-jar-with-dependencies.jar
    
    
    -- and this doesn't break the default java 1.6 installation that is required for FireFox/etc.
    

    FileSeq 호환성 문제를 해결하기 위해 (예 : "해당되는 경우 기본 Java 클래스를 사용하여 플랫폼에 native-hadoop 라이브러리를로드 할 수 없습니다") Hadoop 마스터 서버의 libs를 그대로 사용했습니다 (일종의 해킹).

    scp root@10.15.150.223:/usr/lib/libhadoop.so.1.0.0 ~/
    sudo cp ~/libhadoop.so.1.0.0 /usr/lib/
    scp root@10.15.150.223:/usr/lib/jvm/java-6-sun-1.6.0.26/jre/lib/amd64/server/libjvm.so ~/
    sudo cp ~/libjvm.so /usr/lib/
    sudo ln -s /usr/lib/libhadoop.so.1.0.0 /usr/lib/libhadoop.so.1
    sudo ln -s /usr/lib/libhadoop.so.1.0.0 /usr/lib/libhadoop.so
    

    어느 날 밤 커피를 마시 며 FileSeq hadoop 입력 파일을 읽도록이 코드를 작성했습니다.이 코드를 사용하여 "/ usr / lib / jvm / java-7-openjdk-amd64 / bin / java -jar ./target" /sequencefile-utility-1.3-jar-with- dependencies.jar -d test / -c NONE ") :

    import org.apache.hadoop.io.*;
    import org.apache.hadoop.io.SequenceFile;
    import org.apache.hadoop.io.SequenceFile.ValueBytes;
    
    import java.io.DataOutputStream;
    import java.io.FileNotFoundException;
    import java.io.FileOutputStream;
    
    Path file = new Path("/home/mine/mycompany/task13/data/2015-08-30");
    reader = new SequenceFile.Reader(fs, file, conf);
    long pos = reader.getPosition();
    
    logger.info("GO from pos "+pos);
    DataOutputBuffer rawKey = new DataOutputBuffer();
    ValueBytes rawValue = reader.createValueBytes();
    
    int DEFAULT_BUFFER_SIZE = 1024 * 1024;
    DataOutputBuffer kobuf = new DataOutputBuffer(DEFAULT_BUFFER_SIZE);
    kobuf.reset();
    
    int rl;
    do {
      rl = reader.nextRaw(kobuf, rawValue);
      logger.info("read len for current record: "+rl+" and in more details ");
      if(rl >= 0)
      {
        logger.info("read key "+new String(kobuf.getData())+" (keylen "+kobuf.getLength()+") and data "+rawValue.getSize());
        FileOutputStream fos = new FileOutputStream("/home/mine/outb");
        DataOutputStream dos = new DataOutputStream(fos);
        rawValue.writeUncompressedBytes(dos);
        kobuf.reset();
      }
    } while(rl>0);
    

    다음 정보 출처 덕분에 모래밭:

    mahour 대신에 hadoop-core를 사용한다면 수동으로 asm-3.1.jar를 다운로드해야합니다 : search_maven_org / remotecontent? filepath = org / ow2 / util / asm / asm / 3.1 / asm-3.1.jar search_maven_org / # search | ga | 1 | asm-3.1

    사용 가능한 mahout repos의 목록 : repo1_maven_org / maven2 / org / apache / mahout / Mahout 소개 : mahout_apache_org /

    Hadoop Java 클래스의 인터페이스와 소스를 배우기에 좋은 리소스입니다. FileSeq을 읽으려는 자체 코드를 작성하는 데 사용했습니다. http://grepcode.com/file/repo1.maven.org/maven2/com.ning/metrics.action/0.2.7/org/apache/hadoop/io/BytesWritable.java

    내 프로젝트를 만들 때 사용한 tb-lsdr-seqfilecreator FileSeq reader : www_javased_com /? source_dir = scape / tb-lsdr-seqfilecreator / src / main / java / eu / scape_project / tb / lsdr / seqfileutility / ProcessParameters.java

    stackoverflow_com / questions / 5096128 / sequence-files-in-hadoop - 동일한 예 (읽기 키, 작동하지 않는 값)

    https://github.com/twitter/elephant-bird/blob/master/core/src/main/java/com/twitter/elephantbird/mapreduce/input/RawSequenceFileRecordReader.java -이 하나가 도움이되었습니다 (reader.nextRaw를 사용했습니다. nextKeyValue () 및 다른 서브 시스템과 같음)

    또한 mahout.hadoop 대신 native / apache.hadoop에 대한 ./pom.xml을 변경했는데, read-> next (key, value) 버그가 둘 다 동일하기 때문에 아마도 필요하지 않습니다. 대신에 read-> nextRaw (keyRaw, valueRaw)를 사용하십시오 :

    diff ../../sequencefile-utility/sequencefile-utility-master/pom.xml ./pom.xml 
    9c9
    <     <version>1.0</version>
    ---
    >     <version>1.3</version>
    63c63
    <             <version>2.0.1</version>
    ---
    >             <version>2.4</version>
    85c85
    <             <groupId>org.apache.mahout.hadoop</groupId>
    ---
    >             <groupId>org.apache.hadoop</groupId>
    87c87
    <             <version>0.20.1</version>
    ---
    >             <version>1.1.2</version>
    93c93
    <             <version>1.1</version>
    ---
    >             <version>1.1.3</version>
    
  6. from https://stackoverflow.com/questions/7560515/how-can-i-inspect-a-hadoop-sequencefile-for-which-i-lack-full-schema-information by cc-by-sa and MIT license