Java Hadoop是否将密钥拆分为几个reducer池?

Java Hadoop是否将密钥拆分为几个reducer池?,java,hadoop,Java,Hadoop,我正在尝试在大量数据上运行hadoop作业,最多使用32个减缩器。但是,当我查看每个reducer的输出时,我发现可能会有多个reducer获得一个键(当然有不同的值)。在使用更多减速器时是否可以避免这种行为 LE:我尝试过使用文本类,但问题是,尽管它工作正常,但我的jvm最终由于堆空间不足而崩溃。除了compareTo之外,hadoop将数据划分到关键池的标准是什么?我怀疑您看到的是推测性执行。通常情况下,给定键的所有值始终恰好指向一个减速机。发件人: 推测性执行:Hadoop系统的一个问题是

我正在尝试在大量数据上运行hadoop作业,最多使用32个减缩器。但是,当我查看每个reducer的输出时,我发现可能会有多个reducer获得一个键(当然有不同的值)。在使用更多减速器时是否可以避免这种行为


LE:我尝试过使用文本类,但问题是,尽管它工作正常,但我的jvm最终由于堆空间不足而崩溃。除了compareTo之外,hadoop将数据划分到关键池的标准是什么?

我怀疑您看到的是推测性执行。通常情况下,给定键的所有值始终恰好指向一个减速机。发件人:

推测性执行:Hadoop系统的一个问题是,通过在多个节点上划分任务,可能会有几个节点执行缓慢 节点的速率限制程序的其余部分。例如,如果一个节点 如果磁盘控制器速度较慢,则可能仅在 所有其他节点速度的10%。因此,当99个地图任务已经完成时 完成后,系统仍在等待最后的地图任务进行检查 在中,这比所有其他节点花费的时间都长

通过强制任务彼此独立运行,单个 任务不知道其输入来自何处。任务信任Hadoop 平台仅提供适当的输入。因此,同样 输入可以并行处理多次,以利用 机器能力的差异。因为作业中的大多数任务都是 最后,Hadoop平台将安排冗余拷贝 跨多个没有其他节点的剩余任务的 要完成的工作。这个过程称为推测执行。什么时候 任务完成后,他们会向JobTracker宣布这一事实。随便哪个 任务的副本首先完成成为最终副本。如果其他 Hadoop告诉TaskTracker,拷贝是以推测的方式执行的 放弃任务并放弃其输出。然后减速器接收 他们首先从成功完成映射的映射器输入

默认情况下启用推测执行您可以禁用 通过设置 mapred.map.tasks.prospective.execution和 将mapred.reduce.tasks.substictive.execution JobConf选项设置为false, 分别。


您说您有一个自定义键(实现WritableComparable),您是否重写了
hashCode()
方法

如果您使用的是HashPartitioner(默认设置),并且没有覆盖自定义键中的
hashCode()
方法,那么来自不同映射器的两个相同键很可能会转到不同的还原器(hashCode()的结果)与减缩器的数量成模,以确定要将键/值对发送到的减缩器)。这是因为,默认情况下hashCode()方法是本机的,并返回对象在内存中的地址

密钥的简单hashCode实现可以简单到将元组字段的hashCode添加在一起(假设这些字段本身具有非本机hashCode实现):


我已经关闭了推测执行,但仍然没有成功,我还将还原程序的启动阈值设置为0.95,并且它们仍然有多个池。您是否使用自定义比较器?你怎么知道多个还原程序得到的是同一个键呢?我正在为我的键实现writableComparable类,因为我需要键是一个元组,我在compareTo中比较元组中的每个字符串。每个reducer在输出中只输出一行,我在不同的reducer输出文件中分割了同一行的副本。compareTo是如何实现的?行中有一些东西:public int compareTo(Object other){return left.toString().compareTo((Tuple)other.left);}
public int hashCode() {
    return field1.hashCode() + field2.hashCode()
}