我正在尝试使用多达32个减速器对大量数据运行hadoop作业.但是当我查看每个减速器的输出时,我发现可能会发生多个减速器获得一个键(当然具有不同的值).使用更多减速器时可以避免这种行为吗?
LE:我已经尝试过使用Text类了,但问题是虽然它工作正常但是我的jvm最终会由于堆空间不足而崩溃.除了compareTo之外,hadoop用于将数据划分为密钥池的标准是什么?
你说你有一个自定义键(实现WritableComparable),你重写了这个hashCode()方法吗?
如果您正在使用HashPartitioner(这是默认设置),并且没有覆盖hashCode()自定义键中的方法,那么来自不同映射器的两个相同的键很可能会转到不同的reducer(hashCode()的结果是模数用减速器的数量确定要发送键/值对的减速器.这是因为默认情况下hashCode()方法是native,并返回对象内存中的地址
您的密钥的简单hashCode实现可以像将元组字段的哈希码一起添加一样简单(假设这些字段本身具有非本地hashCode实现):
public int hashCode() {
return field1.hashCode() + field2.hashCode()
}
Run Code Online (Sandbox Code Playgroud)
我怀疑你所看到的是投机性的执行.通常,给定键的所有值始终只有一个减速器.来自http://developer.yahoo.com/hadoop/tutorial/module4.html:
推测执行:Hadoop系统的一个问题是,通过将任务划分到多个节点,一些慢节点可能对程序的其余部分进行速率限制.例如,如果一个节点具有慢速磁盘控制器,那么它可能仅以所有其他节点的速度的10%读取其输入.因此,当99个地图任务已经完成时,系统仍在等待最终的地图任务检入,这比所有其他节点花费的时间要长得多.
通过强制任务彼此隔离运行,各个任务不知道其输入来自何处.任务信任Hadoop平台,只提供适当的输入.因此,可以并行多次处理相同的输入,以利用机器能力的差异.由于作业中的大多数任务即将结束,Hadoop平台将在几个节点上安排剩余任务的冗余副本,这些节点没有其他工作要执行.此过程称为推测执行.任务完成后,他们会向JobTracker宣布这一事实.任务的任何副本首先完成即成为最终副本.如果其他副本以推测方式执行,Hadoop会告诉TaskTrackers放弃任务并丢弃其输出.然后,Reducers首先从成功完成的Mapper接收输入.
默认情况下启用推测执行.您可以通过将mapred.map.tasks.speculative.execution和mapred.reduce.tasks.speculative.execution JobConf选项分别设置为false来禁用映射器和缩减器的推测执行.
| 归档时间: |
|
| 查看次数: |
1500 次 |
| 最近记录: |