有没有办法通过更改地图任务的数量或更改每个映射器的拆分大小来提高MapReduce的性能? 例如,我有一个100GB的文本文件和20个节点。我想在文本文件上运行WordCount作业,理想的映射器数量或理想的分割大小是什么,以便可以更快地完成?
更多地图制作者会更快吗? 分割尺寸越小,它会更快吗?
修改
我正在使用hadoop 2.7.1,只是因为你知道有YARN。
答案 0 :(得分:1)
使用更多映射器时,它不一定更快。每个映射器都有一个启动和设置时间。在hadoop的早期,当mapreduce是事实上的标准时,据说映射器应该运行~10分钟。今天文件推荐1分钟。您可以使用setNumMapTasks(int)
来改变地图任务的数量,{{1}}可以在JobConf中定义。在该方法的文档中有关于映射器计数的非常好的信息:
有多少张地图?
地图数量通常由总大小决定 输入的数量,即输入文件的总块数。
地图的正确并行度似乎约为10-100张地图 每个节点,虽然已经设置为300左右的非常cpu光 地图任务。任务设置需要一段时间,因此最好是地图采用 至少要执行一分钟。
基于文件的InputFormats的默认行为是分割输入 根据输入的总大小(以字节为单位)输入逻辑InputSplits 文件。但是,会处理输入文件的FileSystem块大小 作为输入拆分的上限。分割大小的下限 可以通过mapreduce.input.fileinputformat.split.minsize设置。
因此,如果您期望10TB的输入数据并且块大小为128MB, 除非使用了setNumMapTasks(int),否则最终会得到82,000个映射 把它设得更高。
您的问题可能与this SO question.
有关说实话,尝试查看现代框架,例如Apache Spark和Apache Flink。