【发布时间】:2013-01-18 17:23:20
【问题描述】:
我有一个包含大约 10 亿个数据点的数据集。我想从中提取大约 4600 万个唯一数据点。
我想使用 Hadoop 来提取唯一值,但在 Hadoop 上不断出现“内存不足”和 Java 堆大小错误 - 同时,我可以使用 Python 在单个机器上相当轻松地运行它设置(哈希表,如果你愿意的话。)
我正在使用一种相当简单的算法来提取这些唯一值:我正在解析我的地图中的 10 亿行并输出如下所示的行:
UniqValueCount:I a
UniqValueCount:I a
UniqValueCount:I b
UniqValueCount:I c
UniqValueCount:I c
UniqValueCount:I d
然后运行“聚合”reducer 得到结果,对于上面的数据集应该是这样的:
I 4
这适用于一小组值,但是当我为 10 亿个数据点(如我所提到的有 4600 万个键)运行它时,作业失败了。
我在 Amazon 的 Elastic Map Reduce 上运行它,即使我使用六个 m2.4xlarge 节点(它们的最大内存节点为每个 68.4 GB),作业也会失败并出现“内存不足”错误。
但我可以使用 Python 代码提取唯一值,该代码在一个 m1.large(一个具有 8 GB 内存的小盒子)上具有 Set 数据结构(哈希表)。我很困惑 Hadoop 作业失败了,因为 4600 万个唯一值不应该占用那么多内存。
可能出了什么问题?我是不是用错了 UniqValueCount?
【问题讨论】:
标签: hadoop mapreduce hadoop-streaming elastic-map-reduce