如何将一组文本作为一个整体映射到节点?

时间:2011-01-13 19:47:54

标签: hadoop filesplitting

假设我有一个包含以下数据的纯文本文件:

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.

有没有人可以告诉我如何存档?

3 个答案:

答案 0 :(得分:2)

我认为简单的方法是在mapper中实现逻辑,你会记得 什么是当前的dataSet并发出如下对:

(DataSetOne,content)
(DataSetOne,内容)
(DataSetOne,内容)

(DataSetTwo,内容)
(DataSetTwo,内容)

然后你将在减少阶段计算群体。

如果性能成为问题,我建议考虑合并器。

答案 1 :(得分:0)

您可以扩展FileInputFormat类并实现RecordReader接口(或者如果您使用的是较新的API,则扩展RecordReader抽象类)以定义如何拆分数据。这是一个链接,为您提供了如何使用旧API实现这些类的示例。

http://www.questionhub.com/StackOverflow/4235318

答案 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);
}

像大卫一样说你也可以使用合成器。组合器是简单的减速器,用于在地图和减少阶段之间保存资源。可以在配置中设置它们。