복붙노트

[HADOOP] .txt 파일을 Hadoop의 시퀀스 파일 형식으로 변환하는 방법

HADOOP

.txt 파일을 Hadoop의 시퀀스 파일 형식으로 변환하는 방법

Hadoop에서 map-reduce 작업을 효과적으로 활용하려면 데이터가 hadoop의 시퀀스 파일 형식으로 저장되어야합니다. 그러나 현재 데이터는 플랫 .txt 형식으로되어 있습니다. 누구든지 .txt 파일을 시퀀스 파일로 변환 할 수있는 방법을 제안 할 수 있습니까?

해결법

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

    1.그래서 더 간단한 대답은 SequenceFile 출력을 가진 "신원"작업 일뿐입니다. 자바에서는 다음과 같이 보입니다.

    그래서 더 간단한 대답은 SequenceFile 출력을 가진 "신원"작업 일뿐입니다. 자바에서는 다음과 같이 보입니다.

        public static void main(String[] args) throws IOException,
            InterruptedException, ClassNotFoundException {
    
        Configuration conf = new Configuration();
        Job job = new Job(conf);
        job.setJobName("Convert Text");
        job.setJarByClass(Mapper.class);
    
        job.setMapperClass(Mapper.class);
        job.setReducerClass(Reducer.class);
    
        // increase if you need sorting or a special number of files
        job.setNumReduceTasks(0);
    
        job.setOutputKeyClass(LongWritable.class);
        job.setOutputValueClass(Text.class);
    
        job.setOutputFormatClass(SequenceFileOutputFormat.class);
        job.setInputFormatClass(TextInputFormat.class);
    
        TextInputFormat.addInputPath(job, new Path("/lol"));
        SequenceFileOutputFormat.setOutputPath(job, new Path("/lolz"));
    
        // submit and wait for completion
        job.waitForCompletion(true);
       }
    
  2. ==============================

    2.

    import java.io.IOException;
    import java.net.URI;
    
    import org.apache.hadoop.conf.Configuration;
    import org.apache.hadoop.fs.FileSystem;
    import org.apache.hadoop.fs.Path;
    import org.apache.hadoop.io.IOUtils;
    import org.apache.hadoop.io.IntWritable;
    import org.apache.hadoop.io.SequenceFile;
    import org.apache.hadoop.io.Text;
    
    //White, Tom (2012-05-10). Hadoop: The Definitive Guide (Kindle Locations 5375-5384). OReilly Media - A. Kindle Edition. 
    
    public class SequenceFileWriteDemo { 
    
        private static final String[] DATA = { "One, two, buckle my shoe", "Three, four, shut the door", "Five, six, pick up sticks", "Seven, eight, lay them straight", "Nine, ten, a big fat hen" };
    
        public static void main( String[] args) throws IOException { 
            String uri = args[ 0];
            Configuration conf = new Configuration();
            FileSystem fs = FileSystem.get(URI.create( uri), conf);
            Path path = new Path( uri);
            IntWritable key = new IntWritable();
            Text value = new Text();
            SequenceFile.Writer writer = null;
            try { 
                writer = SequenceFile.createWriter( fs, conf, path, key.getClass(), value.getClass());
                for (int i = 0; i < 100; i ++) { 
                    key.set( 100 - i);
                    value.set( DATA[ i % DATA.length]);
                    System.out.printf("[% s]\t% s\t% s\n", writer.getLength(), key, value); 
                    writer.append( key, value); } 
            } finally 
            { IOUtils.closeStream( writer); 
            } 
        } 
    }
    
  3. ==============================

    3.TXT 파일의 형식이 무엇인지에 따라 다릅니다. 레코드 당 한 줄입니까? 그렇다면 각 행에 대해 하나의 레코드를 만드는 TextInputFormat을 간단히 사용할 수 있습니다. 당신의 매퍼 (mapper)에서 당신은 그 라인을 파싱하고 당신이 선택한 방식으로 그것을 사용할 수 있습니다.

    TXT 파일의 형식이 무엇인지에 따라 다릅니다. 레코드 당 한 줄입니까? 그렇다면 각 행에 대해 하나의 레코드를 만드는 TextInputFormat을 간단히 사용할 수 있습니다. 당신의 매퍼 (mapper)에서 당신은 그 라인을 파싱하고 당신이 선택한 방식으로 그것을 사용할 수 있습니다.

    레코드 당 하나의 행이 아니라면, 독자적인 InputFormat 구현을 작성해야 할 수도 있습니다. 자세한 내용은이 자습서를 살펴보십시오.

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

    4.중간 테이블을 작성하고, CSD 내용을 그대로 LOAD DATA로 작성한 다음 두 번째 테이블을 sequencefile (분할, 클러스터 등)으로 작성하고 중간 테이블에서 select에 삽입 할 수 있습니다. 압축 옵션을 설정할 수도 있습니다 (예 :

    중간 테이블을 작성하고, CSD 내용을 그대로 LOAD DATA로 작성한 다음 두 번째 테이블을 sequencefile (분할, 클러스터 등)으로 작성하고 중간 테이블에서 select에 삽입 할 수 있습니다. 압축 옵션을 설정할 수도 있습니다 (예 :

    set hive.exec.compress.output = true;
    set io.seqfile.compression.type = BLOCK;
    set mapred.output.compression.codec = org.apache.hadoop.io.compress.SnappyCodec;
    
    create table... stored as sequencefile;
    
    insert overwrite table ... select * from ...;
    

    그러면 MR 프레임 워크가 사용자를 위해 무겁게 처리하여 Java 코드를 작성해야하는 번거 로움을 덜어줍니다.

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

    5.형식 지정자와 조심하십시오 :.

    형식 지정자와 조심하십시오 :.

    예를 들어, System.out.printf ( "[% s] \ t % s \ t % s \ n", writer.getLength (), key, value); 우리에게 java.util.FormatFlagsConversionMismatchException을 줄 것이다 : Conversion = s, Flags =

    대신 다음을 사용해야합니다.

    System.out.printf("[%s]\t%s\t%s\n", writer.getLength(), key, value); 
    
  6. ==============================

    6.데이터가 HDFS에 없으면 HDFS에 업로드해야합니다. 두 가지 옵션 :

    데이터가 HDFS에 없으면 HDFS에 업로드해야합니다. 두 가지 옵션 :

    i) .txt 파일에 hdfs -put을 입력하고 HDFS로 가져 오면 seq 파일로 변환 할 수 있습니다.

    ii) HDFS Client 상자에서 텍스트 파일을 입력으로 가져 와서 Sequence File API를 사용하여 SeqFile로 변환하고 SequenceFile.Writer를 작성하고 (key, values)를 추가합니다.

    열쇠에 신경 쓰지 않는다면, 줄 번호를 키로 만들고 텍스트를 값으로 완성 할 수 있습니다.

  7. ==============================

    7.Mahout이 설치되어 있다면 - seqdirectory라고 불리는 것이있다 - 할 수있다.

    Mahout이 설치되어 있다면 - seqdirectory라고 불리는 것이있다 - 할 수있다.

  8. from https://stackoverflow.com/questions/5377118/how-to-convert-txt-file-to-hadoops-sequence-file-format by cc-by-sa and MIT license