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