在配置 Hadoop 集群时,为集群设置映射器/减速器数量的科学方法是什么?
4 回答
没有公式。这取决于你有多少核心和多少内存。mapper的数量+reducer的数量一般不应该超过core的数量。请记住,机器也在运行任务跟踪器和数据节点守护程序。一般建议之一是映射器多于减速器。如果我是你,我会用合理数量的数据运行我的一项典型工作来进行尝试。
引自“Hadoop The Definite Guide, 3rd edition”,第 306 页
由于 MapReduce 作业通常受 I/O 限制,因此拥有比处理器更多的任务以获得更好的利用率是有意义的。
超额订阅的数量取决于您运行的作业的 CPU 利用率,但一个好的经验法则是比处理器多1 到 2个任务(包括 map 和 reduce 任务)。
上面引用中的处理器相当于一个逻辑核心。
但这只是理论上的,很可能每个用例都不同,需要执行一些测试。但这个数字可能是一个很好的测试开始。
映射器的数量是根据前面描述的数据局部性原则决定的。数据局部性原则:Hadoop 尽最大努力在数据存在本地的节点上运行 map 任务,以优化网络和节点间通信延迟。由于输入数据被分割成块并馈送到不同的映射任务,因此希望将馈送到该映射任务的所有数据在单个节点上可用。由于 HDFS 仅保证大小等于其块大小 (64M) 的数据存在于一个节点上,建议/提倡拆分大小等于 HDFS 块大小,以便映射任务可以利用此数据本地化。因此,每个映射器有 64M 的数据。如果我们看到一些映射器运行了很短的时间,请尝试减少映射器的数量并使它们运行更长的时间大约一分钟。
reducer 的数量应该略小于集群中的 reduce 槽的数量(槽的概念是在配置集群时在作业/任务跟踪器属性中预先配置的),以便所有的 reducer 在一波中完成充分利用集群资源。
可能,您还应该查看减速器延迟加载,它允许减速器在需要时稍后启动,因此基本上可以增加映射槽的数量。虽然对此没有太多想法,但似乎很有用。