복붙노트

[HADOOP] Hadoop 2.0 API를 사용하여 Sequencefile 읽기 및 쓰기

HADOOP

Hadoop 2.0 API를 사용하여 Sequencefile 읽기 및 쓰기

시퀀스 파일을 읽고 쓰는 데 새 API를 사용하는 예제를 찾고 있습니다.

효과적으로 이러한 함수를 사용하는 방법을 알아야합니다.

 createWriter(Configuration conf, org.apache.hadoop.io.SequenceFile.Writer.Option... opts) 

이전 정의가 저를 위해 작동하지 않습니다 :

SequenceFile.createWriter( fs, conf, path, key.getClass(), value.getClass());

비슷하게 나는 다음과 같이 Sequence 파일을 읽는 코드가 무엇인지 알아야한다.

SequenceFile.Reader(fs, path, conf);

여기 같은 것을 사용하는 방법입니다 -

    String uri = args[0];
    Configuration conf = new Configuration();
    Path path = new Path( uri);

    IntWritable key = new IntWritable();
    Text value = new Text();

    CompressionCodec Codec = new GzipCodec();
    SequenceFile.Writer writer = null;
    Option optPath = SequenceFile.Writer.file(path);
    Option optKey = SequenceFile.Writer.keyClass(key.getClass());
    Option optVal = SequenceFile.Writer.valueClass(value.getClass());
    Option optCom = SequenceFile.Writer.compression(CompressionType.RECORD,  Codec);

        writer = SequenceFile.createWriter( conf, optPath, optKey, optVal, optCom);

해결법

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

    1.

    public class SequenceFilesTest {
      @Test
      public void testSeqFileReadWrite() throws IOException {
        Configuration conf = new Configuration();
        FileSystem fs = FileSystem.getLocal(conf);
        Path seqFilePath = new Path("file.seq");
        SequenceFile.Writer writer = SequenceFile.createWriter(conf,
                Writer.file(seqFilePath), Writer.keyClass(Text.class),
                Writer.valueClass(IntWritable.class));
    
        writer.append(new Text("key1"), new IntWritable(1));
        writer.append(new Text("key2"), new IntWritable(2));
    
        writer.close();
    
        SequenceFile.Reader reader = new SequenceFile.Reader(conf,
                Reader.file(seqFilePath));
    
        Text key = new Text();
        IntWritable val = new IntWritable();
    
        while (reader.next(key, val)) {
            System.err.println(key + "\t" + val);
        }
    
        reader.close();
      }
    }
    
  2. ==============================

    2.나는 1 년 넘게 답변을 하긴했지만 하둡 2.4.1부터 시작했습니다. :)

    나는 1 년 넘게 답변을 하긴했지만 하둡 2.4.1부터 시작했습니다. :)

    아래 코드는 누군가 유용 할 수 있습니다.

    참고 : 여기에는 시퀀스 파일을 읽고 쓰는 주석 처리 된 1.x 코드가 포함됩니다. 어디서 파일 시스템을 선택하는지 궁금 해서요.하지만 클러스터에서 직접 실행했을 때 제대로 선택했습니다 (아마도 Configuration에서 언급 한 core-site.xml에서 알 수 있습니다).

    import java.io.File;
    import java.io.IOException;
    import java.io.RandomAccessFile;
    
    import org.apache.hadoop.conf.Configuration;
    import org.apache.hadoop.fs.Path;
    import org.apache.hadoop.io.BytesWritable;
    import org.apache.hadoop.io.IOUtils;
    import org.apache.hadoop.io.SequenceFile;
    import org.apache.hadoop.io.SequenceFile.Reader.Option;
    import org.apache.hadoop.io.Text;
    import org.apache.hadoop.io.Writable;
    import org.apache.hadoop.util.ReflectionUtils;
    
    public class SequenceFileOperator {
    
        private Configuration conf = new Configuration();
        /*private FileSystem fs;
        {
            try {
                fs = FileSystem.get(URI.create("hdfs://cldx-1336-1202:9000"), conf);
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }*/
    
        public static void main(String[] args) throws IOException {
            // TODO Auto-generated method stub
    
            if (args == null || args.length < 2) {
    
                System.out
                        .println("Following are the possible invocations <operation id> <arg1> <arg2> ...");
    
                System.out
                        .println("1 <absolute path of directory containing documents> <HDFS path of the sequence file");
    
                System.out.println("2 <HDFS path of the sequence file>");
                return;
            }
    
            int operation = Integer.valueOf(args[0]);
    
            SequenceFileOperator docToSeqFileWriter = new SequenceFileOperator();
    
            switch (operation) {
    
            case 1: {
                String docDirectoryPath = args[1];
                String sequenceFilePath = args[2];
    
                System.out.println("Writing files present at " + docDirectoryPath
                        + " to the sequence file " + sequenceFilePath);
    
                docToSeqFileWriter.loadDocumentsToSequenceFile(docDirectoryPath,
                        sequenceFilePath);
    
                break;
            }
    
            case 2: {
    
                String sequenceFilePath = args[1];
    
                System.out.println("Reading the sequence file " + sequenceFilePath);
    
                docToSeqFileWriter.readSequenceFile(sequenceFilePath);
    
                break;
            }
    
            }
    
        }
    
        private void readSequenceFile(String sequenceFilePath) throws IOException {
            // TODO Auto-generated method stub
    
            /*
             * SequenceFile.Reader sequenceFileReader = new SequenceFile.Reader(fs,
             * new Path(sequenceFilePath), conf);
             */
            Option filePath = SequenceFile.Reader.file(new Path(sequenceFilePath));
            SequenceFile.Reader sequenceFileReader = new SequenceFile.Reader(conf,
                    filePath);
    
            Writable key = (Writable) ReflectionUtils.newInstance(
                    sequenceFileReader.getKeyClass(), conf);
            Writable value = (Writable) ReflectionUtils.newInstance(
                    sequenceFileReader.getValueClass(), conf);
    
            try {
    
                while (sequenceFileReader.next(key, value)) {
    
                    System.out
                            .printf("[%s] %s %s \n",
                                    sequenceFileReader.getPosition(), key,
                                    value.getClass());
                }
            } finally {
                IOUtils.closeStream(sequenceFileReader);
            }
    
        }
    
        private void loadDocumentsToSequenceFile(String docDirectoryPath,
                String sequenceFilePath) throws IOException {
            // TODO Auto-generated method stub
    
            File docDirectory = new File(docDirectoryPath);
    
            if (!docDirectory.isDirectory()) {
                System.out
                        .println("Please provide an absolute path of a directory that contains the documents to be added to the sequence file");
                return;
            }
    
            /*
             * SequenceFile.Writer sequenceFileWriter =
             * SequenceFile.createWriter(fs, conf, new Path(sequenceFilePath),
             * Text.class, BytesWritable.class);
             */
            org.apache.hadoop.io.SequenceFile.Writer.Option filePath = SequenceFile.Writer
                    .file(new Path(sequenceFilePath));
            org.apache.hadoop.io.SequenceFile.Writer.Option keyClass = SequenceFile.Writer
                    .keyClass(Text.class);
            org.apache.hadoop.io.SequenceFile.Writer.Option valueClass = SequenceFile.Writer
                    .valueClass(BytesWritable.class);
    
            SequenceFile.Writer sequenceFileWriter = SequenceFile.createWriter(
                    conf, filePath, keyClass, valueClass);
    
            File[] documents = docDirectory.listFiles();
    
            try {
                for (File document : documents) {
    
                    RandomAccessFile raf = new RandomAccessFile(document, "r");
                    byte[] content = new byte[(int) raf.length()];
    
                    raf.readFully(content);
    
                    sequenceFileWriter.append(new Text(document.getName()),
                            new BytesWritable(content));
    
                    raf.close();
                }
            } finally {
                IOUtils.closeStream(sequenceFileWriter);
            }
    
        }
    }
    
  3. ==============================

    3.독서 용으로 사용할 수 있습니다.

    독서 용으로 사용할 수 있습니다.

    Path path= new Path("/bar");
    Reader sequenceFileReader = new SequenceFile.Reader(conf,SequenceFile.Reader.file(path));
    
  4. ==============================

    4.SequenceFile을 입력 형식으로 설정해야합니다.

    SequenceFile을 입력 형식으로 설정해야합니다.

    job.setInputFormatClass(SequenceFileInputFormat.class);
    

    여기서 SeequnceFile 형식의 HDFS를 읽는 예제를 찾을 수 있습니다.

  5. from https://stackoverflow.com/questions/16070587/reading-and-writing-sequencefile-using-hadoop-2-0-apis by cc-by-sa and MIT license