是否可以限制 MapReduce 作业访问远程数据?

Is it possible to restrict a MapReduce job from accessing remote data?

我们有特定的算法要与 HDFS 集成。该算法要求我们在本地访问数据(工作将专门在 Mapper 中完成)。但是,我们确实希望在分发文件(提供可靠性和条带化)方面利用 HDFS。执行计算后,我们将使用 Reducer 简单地发回答案,而不是执行任何额外的工作。避免使用网络是一个明确的目标。是否有一个配置设置允许我们限制网络数据访问,以便当 MapReduce 作业启动时它只会访问它的本地 DataNode?

更新: 添加一点上下文

我们正在尝试用字符串匹配来分析这个问题。假设我们的集群有 N 个节点,一个文件存储了 N GB 的文本。该文件存储在 HDFS 中,并均匀分布到节点(每个节点 1 个部分)。我们能否创建一个 MapReduce 作业,在每个节点上启动一个进程来访问同一主机上的文件部分?或者,MapReduce 框架会不会不均匀地分配工作? (例如,1 个作业访问所有 N 部分数据,或 .5N 个节点试图处理整个文件?

如果将 reduce 任务的数量设置为零,则可以跳过改组,从而跳过算法的网络成本。

创建作业时,可以使用以下代码行

job.setNumReduceTasks(0);

我不知道你的算法会做什么,但说它是一种寻找特定单词出现的模式匹配算法,然后映射器会报告每次拆分的匹配数。如果要添加计数,则需要网络通信和减速器。

第一个 google 匹配我发现的仅地图示例: Map-Only MR jobs

将缩减器设置为零会增加数据局部性。这意味着 Mappers 生成的中间数据将存储在 HDFS 上。当然,您无法选择哪些节点将存储中间数据,如果它的大小大于映射器槽数 * 块大小,那么远程访问将尝试避免饥饿。我的建议是使用延迟调度程序并将 locality-delay-node-ms 和 locality-delay-rack-ms 设置为较大的值(即映射器的最大预期 运行 时间)。这将使延迟调度程序在远程请求数据之前尽可能多地等待。但是,这可能会导致资源利用不足并增加 运行 时间(例如任何不存储任何数据块的节点将长时间空闲 locality-delay-node-ms + locality-delay-rack -ms).