我是Hadoop的新手。我一直在阅读有关Hadoop的文档,但总是对这个问题感到困惑。 Hadoop如何与程序和数据相关联。 Hadoop将数据放入HDFS,并创建副本。用户是否可以控制哪个节点保存哪些数据? (即使他/她可以,用户是否需要关心它?)当mapreduce程序启动时,Hadoop如何将程序和数据组合在一起?它应该尽量避免节点之间的任何不必要的数据传输。那么它是否将程序(例如映射器)加载到包含数据的节点?如果是这种情况,如果一个映射器的输入数据如此之大,以至于它存储在多个节点上,该怎么办? Hadoop是否巧妙地在所有这些节点上映射到了映射器?
答案 0 :(得分:1)
答案 1 :(得分:1)
我身边有几分钱: 1-数据和程序之间的关系意味着处理发生在要处理的数据的机器上(除了几个例外情况)。
2-根据默认行为,用户在块放置上没有控件(也不必担心)。它由NameNode代码中嵌入的算法自动完成,称为“块放置策略”。但是,如果您对默认的块放置不满意并具有冒险性,那么您肯定可以使用块放置策略(Hadoop 1.2.0以后)。有关详细信息,请访问此link
3- Hadoop尽力避免数据移动,并通过在已存在数据的计算机上启动映射器来实现此目的。但正如我在第一点提到的那样,有一些例外。如果映射器必须处理的数据块(称为Split)大于HDFS块大小,则该Split的剩余部分将从一个节点移动到映射器应该运行的另一个节点(这将回答您的问题)第二个问题也是如此)。
4-当发生数据移动时,当具有要处理的数据的机器没有空闲的CPU插槽来启动映射器时,会出现第二种情况。在这种情况下,不是不必要地等待,数据块被移动到附近的节点,其中有免费的映射器插槽可用(但这两种情况很少发生)。
MapReduce框架尽力维护数据局部性并使计算尽可能高效。