복붙노트

[HADOOP] 하둡에서 NullWritable을 사용할 때의 이점

HADOOP

하둡에서 NullWritable을 사용할 때의 이점

Null 텍스트를 사용하는 것보다 NullWritable을 null 키 / 값에 사용하면 (즉, 새 Text (null)) 이점은 무엇입니까? «하둡 : 확실한 가이드»책에서 다음을 볼 수 있습니다.

출력이 NullWritable을 사용하여 어떻게 쓰여지는지 명확히 이해하지 못합니까? MapReduce 프레임 워크가 null 키 / 값 (null 중 하나)을 읽는 것을 무시할 수 있도록 초기 출력 파일에이 파일의 키 또는 값이 null임을 나타내는 단일 상수 값이 있습니까? 또한 실제로는 null 텍스트가 직렬화됩니까?

감사,

Venkat

해결법

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

    1.런타임시 키 / 값 유형을 지정해야합니다. 따라서 NullWritable을 쓰거나 읽는 모든 것이 해당 유형을 처리 할 것이라는 것을 미리 알 수 있습니다. 파일에 마커 등이 없습니다. 그리고 기술적으로 NullWritable은 "읽기"입니다. NullWritable을 "읽는"것은 사실상 아무 작업도하지 않습니다. 당신은 아무것도 쓰거나 읽지 않는다는 것을 너 자신을 위해 볼 수있다 :

    런타임시 키 / 값 유형을 지정해야합니다. 따라서 NullWritable을 쓰거나 읽는 모든 것이 해당 유형을 처리 할 것이라는 것을 미리 알 수 있습니다. 파일에 마커 등이 없습니다. 그리고 기술적으로 NullWritable은 "읽기"입니다. NullWritable을 "읽는"것은 사실상 아무 작업도하지 않습니다. 당신은 아무것도 쓰거나 읽지 않는다는 것을 너 자신을 위해 볼 수있다 :

    NullWritable nw = NullWritable.get();
    ByteArrayOutputStream out = new ByteArrayOutputStream();
    nw.write(new DataOutputStream(out));
    System.out.println(Arrays.toString(out.toByteArray())); // prints "[]"
    
    ByteArrayInputStream in = new ByteArrayInputStream(new byte[0]);
    nw.readFields(new DataInputStream(in)); // works just fine
    

    그리고 새로운 Text (null)에 대한 질문은 다시 한번 시도해보십시오 :

    Text text = new Text((String)null);
    ByteArrayOutputStream out = new ByteArrayOutputStream();
    text.write(new DataOutputStream(out)); // throws NullPointerException
    System.out.println(Arrays.toString(out.toByteArray()));
    

    텍스트는 null 문자열로 전혀 작동하지 않습니다.

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

    2.나는 run 메소드를 변경한다. 성공

    나는 run 메소드를 변경한다. 성공

    @Override
    public int run(String[] strings) throws Exception {
        Configuration config = HBaseConfiguration.create();  
        //set job name
        Job job = new Job(config, "Import from file ");
        job.setJarByClass(LogRun.class);
        //set map class
        job.setMapperClass(LogMapper.class);
    
        //set output format and output table name
        //job.setOutputFormatClass(TableOutputFormat.class);
        //job.getConfiguration().set(TableOutputFormat.OUTPUT_TABLE, "crm_data");
        //job.setOutputKeyClass(ImmutableBytesWritable.class);
        //job.setOutputValueClass(Put.class);
    
        TableMapReduceUtil.initTableReducerJob("crm_data", null, job);
        job.setNumReduceTasks(0);
        TableMapReduceUtil.addDependencyJars(job);
    
        FileInputFormat.addInputPath(job, new Path(strings[0]));
    
        int ret = job.waitForCompletion(true) ? 0 : 1;
        return ret;
    }
    
  3. ==============================

    3.자신의 Writable 클래스에 문자열을 래핑 할 수 있으며 빈 문자열이 있는지 여부를 나타내는 부울 값을 가질 수 있습니다.

    자신의 Writable 클래스에 문자열을 래핑 할 수 있으며 빈 문자열이 있는지 여부를 나타내는 부울 값을 가질 수 있습니다.

    @Override
    public void readFields(DataInput in) throws IOException { 
        ...
        boolean hasWord = in.readBoolean();
        if( hasWord ) {
            word = in.readUTF();
        }
        ...
    }
    

    @Override
    public void write(DataOutput out) throws IOException {
        ...
        boolean hasWord = StringUtils.isNotBlank(word);
        out.writeBoolean(hasWord);
        if(hasWord) {
            out.writeUTF(word);
        }
        ...
    }
    
  4. from https://stackoverflow.com/questions/16198752/advantages-of-using-nullwritable-in-hadoop by cc-by-sa and MIT license