我知道在将数据转移到reducer之前,映射器会将其输出写入节点本地磁盘。但是为什么他们不能直接将数据发送到相应的减速器(在运行中随机播放),让减速器进行排序和休息。
我一直在考虑当地商店的优点。第一个数据保留在磁盘上,但即使一个映射器失败,已经保留的中间键值也将被清除,另一个映射器将从头开始。其次是带宽考虑因素,但最终数据将被发送到减速器。我们可以逐块发送以减少网络开销。
也许关键原因在于合并排序过程。如果数据在发送到Reducer之前没有排序,则可能会成为瓶颈。
答案 0 :(得分:2)
为什么他们不能将数据直接发送到相应的减速器(在运行中随机播放),让减速器进行排序和休息。
一旦键值对到达减速器,改组和排序就毫无意义。在减速器接收输入之前进行改组和排序。它甚至在任何减速器启动之前就开始以节省等待时间。保存的键值对是此阶段早期开始的结果。在映射器完成后,当分组填充减速器任务的配额时,会立即调度它们以启动减速器。排序是全局的,以避免相同的密钥到达不同的reducer。
我一直在考虑当地商店的优点。
不确定当地商店的意思。但是HDFS
默认情况下会将您的数据复制到多个节点上,以(1)容忍磁盘故障的风险,(2)允许更灵活地分配第一层映射器(读取始终是映射器层)。
第一个数据保留在磁盘上,但即使一个映射器失败,也会清除已经存在的中间键值,另一个映射器将从头开始。
作为映射器进程,它们不会保留指向自己输出的指针。假设在处理了10行输入之后,映射器已经写出了97行键值对。然后,在写入3个额外的键值对之后,映射器在处理第11行输入期间崩溃。映射器不知道它在第11行解析开始之前写了97行。它不能回溯。
注意:也许某些设置会启用此回溯功能。我不确定。
其次是带宽考虑,但最终数据将被发送到减速器。我们可以逐块发送以减少网络开销。
同样,在所有映射器完成之前,您无法发送任何数据,因为您无法确保传入的键值对不属于您想要提前发送的块。