0

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

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。

有谁可以给​​我一个想法如何存档?

4

3 回答 3

2

我认为简单的方法是在映射器中实现逻辑,你会记住什么是当前数据集并发出这样的对:

(DataSetOne, content)
(DataSetOne, content)
(DataSetOne, content)

(DataSetTwo, content)
(DataSetTwo, content)

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

如果性能将成为一个问题,我建议考虑组合器。

于 2011-01-15T17:48:26.993 回答
0

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

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

于 2011-01-15T17:58:48.983 回答
0

首先,如果您的数据集位于单独的文件中或超出配置的块大小,则它们将被拆分为多个地图。因此,如果您有一个 128MB 的数据集并且您的块大小为 64mb,则 hadoop 将 2 块此文件并为每个设置 2 个映射器。
这就像 hadoop 教程中的 wordcount 示例。就像大卫说的那样,您需要将键/值对映射到 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);
}

就像大卫说的那样,你可以使用组合器。组合器是简单的 reducer,用于在 map 和 reduce 阶段之间保存资源。它们可以在配置中设置。

于 2011-01-15T18:06:00.283 回答