Hadoop如何整合程序和数据?

时间:2013-04-16 20:32:22

标签: hadoop mapreduce

我是Hadoop的新手。我一直在阅读有关Hadoop的文档,但总是对这个问题感到困惑。 Hadoop如何与程序和数据相关联。 Hadoop将数据放入HDFS,并创建副本。用户是否可以控制哪个节点保存哪些数据? (即使他/她可以,用户是否需要关心它?)当mapreduce程序启动时,Hadoop如何将程序和数据组合在一起?它应该尽量避免节点之间的任何不必要的数据传输。那么它是否将程序(例如映射器)加载到包含数据的节点?如果是这种情况,如果一个映射器的输入数据如此之大,以至于它存储在多个节点上,该怎么办? Hadoop是否巧妙地在所有这些节点上映射到了映射器?

2 个答案:

答案 0 :(得分:1)

  1. 不,用户无法真正控制存储数据的位置。
  2. 不,用户也不应该关心。
  3. Hadoop按照localhost - >的顺序选择最接近映射器的datanode。相同的机架 - >数据中心。
  4. 是的,尝试首先从localhost获取数据。
  5. 这取决于你应该阅读“输入分割”和“HDFS块”的含义。 HDFS上的单个文件可以拆分为多个HDFS块,因此驻留在多个数据节点上。根据定义,映射器的输入彼此独立,因此,即使文件在中间被分割并且几个映射器占用它的一部分(假设,例如,它在换行时分开), progam应该产生相同的输出。 Hadoop尝试获取靠近映射器位置的数据,这可能意味着文件或其中的一部分。由于HDFS被复制,来自大量不同文件的块可以驻留在映射器的datanode上,因此它具有相当不错的选择。
  6. 见子弹5.,但几乎是 - Hadoop运行mapper“关闭”数据,或至少尝试。

答案 1 :(得分:1)

我身边有几分钱: 1-数据和程序之间的关系意味着处理发生在要处理的数据的机器上(除了几个例外情况)。

2-根据默认行为,用户在块放置上没有控件(也不必担心)。它由NameNode代码中嵌入的算法自动完成,称为“块放置策略”。但是,如果您对默认的块放置不满意并具有冒险性,那么您肯定可以使用块放置策略(Hadoop 1.2.0以后)。有关详细信息,请访问此link

3- Hadoop尽力避免数据移动,并通过在已存在数据的计算机上启动映射器来实现此目的。但正如我在第一点提到的那样,有一些例外。如果映射器必须处理的数据块(称为Split)大于HDFS块大小,则该Split的剩余部分将从一个节点移动到映射器应该运行的另一个节点(这将回答您的问题)第二个问题也是如此)。

4-当发生数据移动时,当具有要处理的数据的机器没有空闲的CPU插槽来启动映射器时,会出现第二种情况。在这种情况下,不是不必要地等待,数据块被移动到附近的节点,其中有免费的映射器插槽可用(但这两种情况很少发生)。

MapReduce框架尽力维护数据局部性并使计算尽可能高效。