- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我刚刚开始学习 Hadoop,并且仍在尝试和尝试理解事物,我真的很好奇 OutputCollector 类 collect() 方法的用法,从现在开始我找到的所有示例都只调用此方法一次。如果这种方法的调用成本真的很高(因为它正在将输出写入文件)?在考虑不同的场景时,我遇到了我发现需要不止一次调用它的情况。同样明智的是下面是给定的代码片段
public static class Reduce extends MapReduceBase implements
Reducer<IntWritable, Text, Text, NullWritable> {
public void reduce(IntWritable key, Iterator<Text> values,
OutputCollector<Text, NullWritable> output, Reporter reporter)
throws IOException {
Text outData = null;
while (values.hasNext()) {
outData = new Text();
outData.set(values.next().toString());
output.collect(outData, NullWritable.get());
}
}
}
因为 values
对象包含映射器根据某些过滤条件发出的大量记录,我需要将这些记录写入输出文件。或者反过来我也可以使用低于给定的方法。
public static class Reduce extends MapReduceBase implements
Reducer<IntWritable, Text, Text, NullWritable> {
public void reduce(IntWritable key, Iterator<Text> values,
OutputCollector<Text, NullWritable> output, Reporter reporter)
throws IOException {
StringBuilder sb = new StringBuilder();
while (values.hasNext()) {
sb.append(values.next().toString() + "\r\n ");
}
Text outData = new Text();
outData.set(sb.toString());
output.collect(outData, NullWritable.get());
}
}
然而,这两种方法都适用于我的单节点设置,适用于高达 400k 条记录的大型输入数据集和包含大约 70k 条记录的 values
对象。我想问一下哪种方法更好?而且上面编写的代码在多节点集群上表现良好吗?任何帮助表示赞赏。谢谢。
最佳答案
最后归结为您写入了多少数据(以字节为单位)。
这两种解决方案都有一定的大小开销,在第一个示例中,您编写了多个字符串,序列化每个字符串的长度的开销是恒定的。在另一个解决方案中,您编写的开销与行分隔符相同。
因此在字节大小方面,两者是相等的,因此两种解决方案中收集数据的速度应该不会明显变慢。
你的问题的一个非常不同的部分是内存使用,想想一个非常大的值迭代,你的 StringBuilder
将因为调整大小操作和它使用的所有内存而效率低下。 collect
方法更智能,如果写缓冲区已满,它会溢出到磁盘。另一方面,如果你有大量的可用内存并且你想一次写入一个巨大的记录——这也可能与将写入缓冲区设置为类似大小一样有效。
关于java - 在 Hadoop 中使用 context.write() 或 outputCollector.collect() 写入输出的成本?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26004370/
在计算输出的数字平均值后,我无法返回 flaot 值。收集..任何人都可以帮助我吗?? 公共(public)静态类 MapClass 扩展了 MapReduceBase 实现映射器{ private
这是引用 Storm's OutputCollector尤其是它的 ack(Tuple) 和 fail(Tuple) 方法。 这两种方法都只是将调用转移到 IOutputCollector 类型的 _
我想知道 OutputCollector 的“实例”输出是否用于映射函数:output.collect(键,值)这个 -output- 将键值对存储在某处?即使它发送到 reducer 函数,它们也一
使用BaseRichBolt时,有什么区别 _collector.fail(tuple) 和 _collector.ack(tuple) 它是否像超时一样导致元组被重新发送?或者它只是丢弃元组。 If
在 this文章我找到了这个用于字数统计的映射器代码: public static class MapClass extends MapReduceBase implements Mapp
我刚刚开始学习 Hadoop,并且仍在尝试和尝试理解事物,我真的很好奇 OutputCollector 类 collect() 方法的用法,从现在开始我找到的所有示例都只调用此方法一次。如果这种方法的
我是一名优秀的程序员,十分优秀!