-1

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

4

2 回答 2

1
  1. 不,用户无法真正控制数据的存储位置。
  2. 不,用户也不应该关心。
  3. Hadoop 选择最接近映射器的数据节点,顺序为 localhost -> 相同机架 -> 数据中心。
  4. 是的,它首先尝试从本地主机获取数据。
  5. 这取决于,您应该阅读“输入拆分”和“HDFS 块”的含义。HDFS 上的单个文件可以拆分为多个 HDFS 块,因此驻留在多个数据节点上。根据定义,映射器的输入是相互独立的,因此,即使文件在中间被拆分并且几个映射器占用了其中的一部分(假设,例如,它在换行符处拆分),程序也应该产生相同的输出。Hadoop 尝试获取靠近映射器位置的数据块,这可能意味着文件或文件的一部分。由于 HDFS 被复制,来自大量不同文件的块可以驻留在映射器的数据节点上,因此它有一个很好的选择。
  6. 见第 5 条,但几乎是的——Hadoop 运行映射器的“接近”数据,或者至少尝试这样做。
于 2013-04-16T20:45:35.843 回答
1

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

2-根据默认行为,用户无法控制(也不必担心)块放置。它由嵌入在 NameNode 代码中的算法自动完成,称为“块放置策略”。但是,如果您对默认的块放置不满意并且喜欢冒险,那么您绝对可以使用块放置策略(Hadoop 1.2.0 及更高版本)。有关这方面的详细信息,您可以访问此链接

3- Hadoop 尽最大努力避免数据移动,它通过在已经存在数据的机器上启动映射器来做到这一点。但也有一些例外,正如我在第一点中提到的。如果映射器必须处理的数据块(称为拆分)大于 HDFS 块大小,则该拆分的剩余部分将从一个节点移动到应该运行映射器的另一个节点(这回答了您的倒数第二个问题)。

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

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

于 2013-04-16T21:43:46.893 回答