在 Hadoop 中使用 NullWriteable 的优势

2022-09-01 14:41:10

与使用文本相比,使用键/值有哪些优势(即 )。我从《Hadoop: The Definitive Guide》一书中看到了以下内容。NullWritablenullnullnew Text(null)

NullWritable是 一种特殊类型的 ,因为它具有零长度序列化。不会向流写入或读取任何字节。它被用作占位符;例如,在MapReduce中,当您不需要使用该位置时,可以将键或值声明为该位置 - 它有效地存储了一个恒定的空值。NullWriteable 在您想要存储值列表(而不是键值对)时也可以用作键。它是一个不可变的单例:实例可以通过调用来检索WritableNullWritableSequenceFileNullWritable.get()

我不清楚如何使用?在开始的输出文件中是否会有一个常量值指示此文件的键或值是 ,以便MapReduce框架可以忽略读取键/值(以)为准)?另外,文本实际上是如何序列化的?NullWritablenullnullnullnull

谢谢

文卡特


答案 1

键/值类型必须在运行时给出,因此任何写入或读取的内容都会提前知道它将处理该类型;文件中没有标记或任何内容。从技术上讲,“阅读”,只是“阅读”a实际上是一个禁忌。您可以亲眼看到根本没有任何书面或阅读的内容:NullWritablesNullWritablesNullWritable

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


答案 2

我更改了运行方法。和成功

@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;
}

推荐