我正在阅读Hadoop: The definitive guide
。在理解一些概念的过程中,我读了一些SO帖子,这让我同样令人困惑但澄清。以下是一些观点,我需要专家意见是否正确以及如果不正确会发生什么?
让我们假设这是我的HDFS在具有一个节点的Psuedo分布式集群中的外观:
/local/path/to/datanode/storage/0/blk_00001 300 MB
/local/path/to/datanode/storage/0/blk_00002 300 MB
/local/path/to/datanode/storage/0/blk_00003 300 MB
/local/path/to/datanode/storage/0/blk_00004 200 MB
我的文件总大小为1100 MB,它被分成300 MB的块(这是我的块大小)。
现在我即将开始我的Mapreduce工作:
我理解InputFormat
(反过来拆分文件)决定了地图的数量。
案例1:
我有以下设置:
split size mapred.min.split.size=400 MB
总共将有三个MR工作。每个都有一个400 MB的输入大小来处理。
1) Mapper 1 :这意味着第一个MR作业将使用blk_00001中的300 MB和blk_00002中的100 MB(数据位置丢失)。
2)映射器2:现在第二个映射器必须从位置101 MB blk_00002 seek
+来自blk_00003的另一个200 MB。
)映射器3: blk_0003上还有100 MB需要处理,而blk_0004需要处理200 MB。 现在大小为300 MB,应该整体处理。
块大小在MAPRED任务中没有任何作用。
Q1:一切都正确,直到这里????????
案例2:
现在让我说我的MR工作有以下设置:
mapred.tasktracker.map.tasks.maximum=3
。这意味着对于任何给定节点,并行运行三个map任务。
Q2 :如果上面的所有映射器在同一节点上并行运行,它们是在具有相似优先级的不同线程中运行还是在CPU级别上运行单独的进程。
CASE 3 :如果num
中的conf.setNumMapTasks(int num)
大于分割数。
也就是说,我有num = 10,splits = 3.将要执行的MR工作总数为3.
** Q3:**正确??
减速机任务:
Q4 映射器必须在reducer启动之前完成 - 在我所知的所有情况下,任何不会出现的示例。因为钥匙需要排序并交给它们以减少它们。
Q5 那么mapred.reduce.slowstart.completed.maps=0.5
会有什么影响。这意味着当地图任务完成50%时,启动减速器。但是reducer需要map作业才能完成。正确???
2)如果我没有指定任何内容,那么减少器的默认数量是多少。
proposed使用0.95 - 1.75 *(nodes * mapred.tasktracker.tasks.maximum)。所以,如果我的簇有5个节点,每个节点有5个核心,则公式给出(0.95 * 5 * 5)= 24个reducer。
所以我应该设置conf.setNumReduceTasks(24)????
答案 0 :(得分:3)
Q1:一切都正确,直到这里????????
这取决于输入格式。无论您将最小分割大小设置为什么,FileInputFormat
都不会进行小于块大小的分割。以下是计算拆分大小的代码。
protected long computeSplitSize(long goalSize, long minSize, long blockSize) {
return Math.max(minSize, Math.min(goalSize, blockSize));
}
Q2:如果上面的所有映射器在同一节点上并行运行,它们是在具有相似优先级的不同线程中运行还是在CPU级别上运行单独的进程。
每个任务都在其自己的Java virtual machine中运行,因此需要单独的流程。
Q3:如果我在conf.setNumMapTasks(int num)中的num大于split的数量。也就是说,我有num = 10,splits = 3.将要执行的MR工作总数为3.
setNumMapTasks()
是not supported anymore,仅仅是对MapReduce系统的暗示。
问题4:映射器必须在reducer启动之前完成 - 在我所知的所有情况下,任何不可能的示例。因为钥匙需要排序并交给它们以减少它们。
Q5那么mapred.reduce.slowstart.completed.maps = 0.5会有什么影响。这意味着当地图任务完成50%时,启动减速器。但是reducer需要map作业才能完成。正确???
慢启动涉及将数据复制到适当的计算机。在所有映射器完成之前,不会调用reducer中的reduce()
方法。
如果我没有指定任何内容,缩减器的默认数量是多少。
1
所以我应该设置conf.setNumReduceTasks(24)????
什么对你的任务最有效。