我正在Hadoop中编写一个Reducer,我正在使用它的输入值来构建一个字节数组,该数组编码一个元素列表。我写入数据的缓冲区大小取决于reducer接收的值的数量。提前在内存中分配它的大小会很有效,但我不知道有多少值没有用“foreach”语句迭代它们。
Hadoop输出是一个HBase表。
更新 在使用映射器处理我的数据之后,reducer键具有幂律分布。这意味着只有少数键具有很多价值(最多9000),但大多数键只有几个值。我注意到通过分配4096字节的缓冲区,97.73%的值适合它。对于其余的,我可以尝试重新分配具有双倍容量的缓冲区,直到所有值都适合它。对于我的测试用例,这可以通过在最坏的情况下重新分配内存6次来完成,当一个密钥有9000个值时。
答案 0 :(得分:2)
我假设在你分配了你的字节数组之后,无论如何你都要用for-each来完成它们,但你不想要在内存中缓冲所有记录(因为你只能循环遍历)你从值集合中获得的迭代器一次)。因此,你可以
答案 1 :(得分:0)
您可以使用以下范例:
映射:每个映射器保存从键到整数的映射,其中M [k]是用某个键k发出的值的数量。在输入结束时,地图也会发出键值对(k,M [k])。
排序:使用二级排序,使对(k,M [k])位于对(k,您的值)之前。
减少:说我们正在看关键的k。然后,reducer首先聚合来自不同映射器的计数M [k]以获得数n。这是你要找的号码。现在,您可以创建数据结构并进行计算。