我们有一个特别的算法想要和HDFS集成。该算法要求我们访问本地数据(该工作将专门在Mapper
中完成)。然而,我们确实希望在分发文件方面利用HDFS的优势(提供可靠性和条带化)。计算完成后,我们将使用Reducer
简单地发回答案,而不执行任何额外的工作。避免使用网络是一个明确的目标。是否有一个配置设置允许我们限制网络数据访问,这样当一个MapReduce作业启动时,它将只访问它的本地DataNode?
更新:
添加一点上下文
我们正在尝试用字符串匹配来分析这个问题。假设我们的集群有N个节点,一个文件存储了ngb的文本。文件存储在HDFS中,均匀分布到节点(每个节点1份)。我们可以创建一个MapReduce作业,在每个节点上启动一个进程来访问位于同一主机上的文件部分吗?或者,MapReduce框架会不均匀地分配工作吗?(例如,1个作业访问所有N个部分的数据,或0.5 N个节点试图处理整个文件?
如果您将reduce任务的数量设置为零,则可以跳过洗牌,从而跳过算法的网络成本。
创建作业时,可以使用以下代码行
job.setNumReduceTasks(0);
我不知道你的算法会做什么,但说它是一个模式匹配算法寻找一个特定的单词的出现,然后映射器会报告每个分割匹配的数量。如果你想增加计数,你需要网络通信和一个减速器。
我发现的第一个谷歌匹配地图的例子:Map-Only MR作业
将reducer设置为零将增加数据局部性。这意味着Mappers生成的中间数据将存储在HDFS上。当然,您将无法控制选择哪些节点将存储中间数据,如果其大小大于映射器插槽的数量*块大小,则远程访问将尝试避免饥饿。我的建议是使用延迟调度器,并将locale -delay-node-ms和locale -delay-rack-ms设置为较大的值(即映射器的最大预期运行时间)。这将使延迟调度器在远程请求数据之前尽可能多地等待。然而,这可能会导致资源利用率不足并增加运行时间(例如,任何不存储任何数据块的节点都将长时间处于空闲状态)。