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

时间:2015-08-03 13:52:46

标签: java hadoop mapreduce hdfs distributed-computing

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

更新: 添加一些上下文

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

2 个答案:

答案 0 :(得分:2)

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

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

job.setNumReduceTasks(0);

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

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

答案 1 :(得分:1)

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