java—hadoopMap程序是否只在本地执行?

rryofs0p  于 2021-06-03  发布在  Hadoop
关注(0)|答案(2)|浏览(573)

我遇到的情况是,文件的所有块都位于一台机器上,默认的复制因子是1。
在这个场景中,如果我在集群上启动hadoop,我觉得我的所有Map任务都只能在一台机器上运行,因为块只存在于那台机器上。对吗?本地Map器任务的执行是一个约束还是一个优先级?
如果是,是否可以通过将块复制到其他机器的本地磁盘来配置Map器任务,使其也在其他机器上运行。?
第二个问题是,即使mapper任务只在一台机器上运行,通过复制mapper的中间数据在所有其他机器上启动reducer是否正确。?

uemypmqf

uemypmqf1#

数据本地执行只是一个优先级,而不是一个约束。如果其他节点上有空闲的插槽,hadoop将生成非本地Map器。您甚至可以为同时运行的相同数据块启动更多Map程序—这称为推测性执行—首先完成的任务将获胜,其他任务将被杀死。
至于reducer,它们在一个称为shuffle的阶段通过网络复制map输出数据。

kq0g1dla

kq0g1dla2#

框架尽最大努力使处理尽可能地保持局部性。但在某些情况下,这种情况可能会发生。一是插槽不可用。另一种情况可能是inputsplit跨越多个块,而每个块位于不同的计算机上。在这种情况下,inputsplit的另一部分将被移动到该inputsplit的Map器启动的节点,这样整个块将由一个Map器处理。
本地Map器任务的执行是一个约束还是一个优先级?
这不是约束。只是为了让事情更有效率。否则,将大数据从这里移到那里以处理它将是多么低效。这是hadoop的基本原则之一。
如果是,是否可以通过将块复制到其他机器的本地磁盘来配置Map器任务,使其也在其他机器上运行。?
你为什么要这么做?如果确实要在同一块的多个副本上运行Map程序,可以将推测执行切换为true,而不是将块从一个位置复制到另一个位置。这将在多台机器上的同一块上运行多个Map器,您将通过最快的Map器获得输出。
第二个问题是,即使mapper任务只在一台机器上运行,通过复制mapper的中间数据在所有其他机器上启动reducer是否正确。?
异径管可以在任何有自由槽的节点上启动。不过,并非所有的机器都需要。

相关问题