假设我有一个包含以下数据的纯文本文件:
DataSetOne <br />
content <br />
content <br />
content <br />
DataSetTwo <br />
content <br />
content <br />
content <br />
content <br />
......等等......
我想要的是:计算每个数据集中的内容数量。例如,结果应为
<DataSetOne, 3>, <DataSetTwo, 4>
我是hadoop的初学者,我想知道是否有办法将一大块数据作为一个整体映射到一个节点。例如,将所有DataSetOne设置为节点1,将所有DataSetTwo设置为节点2.
有没有人可以告诉我如何存档?
答案 0 :(得分:2)
我认为简单的方法是在mapper中实现逻辑,你会记得 什么是当前的dataSet并发出如下对:
(DataSetOne,content)
(DataSetOne,内容)
(DataSetOne,内容)
(DataSetTwo,内容)
(DataSetTwo,内容)
然后你将在减少阶段计算群体。
如果性能成为问题,我建议考虑合并器。
答案 1 :(得分:0)
您可以扩展FileInputFormat类并实现RecordReader接口(或者如果您使用的是较新的API,则扩展RecordReader抽象类)以定义如何拆分数据。这是一个链接,为您提供了如何使用旧API实现这些类的示例。
答案 2 :(得分:0)
首先,如果数据集位于单独的文件中,或者它们超出配置的块大小,则会拆分多个地图。因此,如果你有一个128MB的数据集,你的chunksize是64mb hadoop将阻止这个文件并为每个设置2个映射器。
这就像hadoop教程中的wordcount示例。就像David说的那样,你需要将键/值对映射到HDFS中然后减少它们。
我会像这样实现:
// field in the mapper class
int groupId = 0;
@Override
protected void map(K key, V value, Context context) throws IOException,
InterruptedException {
if(key != groupId)
groupId = key;
context.write(groupId, value);
}
@Override
protected void reduce(K key, Iterable<V> values,
Context context)
throws IOException, InterruptedException {
int size = 0;
for(Value v : values){
size++;
}
context.write(key, size);
}
像大卫一样说你也可以使用合成器。组合器是简单的减速器,用于在地图和减少阶段之间保存资源。可以在配置中设置它们。