web-dev-qa-db-ja.com

HadoopでNullWritableを使用する利点

NullWritableキー/値に対してnullを使用することの利点は、nullテキスト(つまりnew Text(null))を使用するよりも優れています。 『Hadoop:The Definitive Guide』の本から次のことがわかります。

NullWritableは、長さがゼロのシリアル化であるため、Writableの特殊なタイプです。ストリームにバイトが書き込まれたり、ストリームから読み取られたりすることはありません。プレースホルダーとして使用されます。たとえば、MapReduceでは、その位置を使用する必要がない場合、キーまたは値をNullWritableとして宣言できます。空の定数値を効果的に格納します。 NullWritableは、キーと値のペアではなく、値のリストを格納するときにSequenceFileのキーとしても役立ちます。これは不変のシングルトンです。インスタンスはNullWritable.get()を呼び出すことで取得できます

NullWritableを使用して出力がどのように書き出されるのか明確に理解していませんか?最初の出力ファイルには、このファイルのキーまたは値がnullであることを示す単一の定数値があるため、MapReduceフレームワークはnullのキー/値(どちらでも)の読み取りを無視できます。 null)?また、nullテキストはどのように実際にシリアル化されますか?

おかげで、

ベンカット

27
Venk K

キー/値タイプは実行時に指定する必要があるため、NullWritablesの書き込みまたは読み取りは、そのタイプを処理することを事前に認識します。ファイルにはマーカーも何もありません。そして、技術的にはNullWritablesは「読み取り」です。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
_

new 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()));
_

Textは、nullStringでは機能しません。

23
Joe K

文字列を独自の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);
    }
    ...
}
0
Arthur B

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;
}
0
zwj0571