2

所以这是我的情况:

我有一个使用 HBase 的 mapreduce 作业。我的映射器接受一行文本输入并更新 HBase。我没有减速器,也没有将任何输出写入光盘。我希望能够在预期利用率激增时向集群添加更多处理能力,然后在利用率下降时缩减规模。让我们暂时假设我不能使用 Amazon 或任何其他云提供商;我在私有集群中运行。

一种解决方案是在我需要更多容量时将新机器添加到我的集群中。但是,我希望能够添加和删除这些机器而无需任何等待或麻烦。我不想在每次需要添加或删除节点时重新平衡 HDFS。

因此,一个好的策略似乎是拥有一个“核心”集群,其中每台机器都运行一个任务跟踪器和一个数据节点,当我需要增加容量时,我可以启动一些运行任务跟踪器的“一次性”机器,但不是数据节点。这可能吗?如果是这样,有什么影响?

我意识到在没有数据节点的机器上运行的任务跟踪器不会受益于数据局部性。但在实践中,这意味着什么?我在想象,当在其中一台“一次性”机器上安排作业时,jobtracker 将通过网络向 tasktracker 发送一行输入,然后 tasktracker 接收该输入行并将其直接提供给 Mapper,而无需将任何内容写入光盘。这是怎么回事?

哦,我正在使用 Cloudera cdh3u3。不知道这是否重要。

4

1 回答 1

1

我在想,当在其中一台“一次性”机器上安排作业时,jobtracker 将通过网络向 tasktracker 发送一行输入,然后 tasktracker 接收该行输入并将其直接提供给 Mapper,而无需将任何内容写入光盘。这是怎么回事?

不完全是,作业跟踪器任务一个任务跟踪器来运行一个映射任务来处理输入拆分。JobTracker 不会将数据传递给任务跟踪器,更多的是传递序列化的拆分信息(文件名、起始偏移量和长度)。TaskTracker 运行 MapTask,它是 MapTask 实例化 InputFormat 和关联的 RecordReader 以获取拆分信息 - 将输入 Key/Values 传递给 Mapper。

如果您没有本地数据节点,或者您有本地数据节点,但数据没有复制到本地数据节点上,则数据将从另一个数据节点通过网络读取(希望机架本地,但仍可能来自其他地方)。

您可以在 Hadoop 计数器输出中查看数据块在任务本地或机架本地的频率统计信息。

于 2012-04-27T10:37:13.820 回答