我对mapreduce的工作原理有点困惑。我读了一些文章,但没有得到正确的答案。脚本:我在hdfs上存储了一个大小为1tb的文件(假设它存储在一个位置/user/input/)。复制为3,块大小为128 mb。现在,我想用mapreduce分析这个1tb文件。因为块大小是128MB,所以我总共有8192个块8192个Map任务会在所有100个节点上生成,平均分配Map者的数量吗?或者它将只在放置复制数据的节点上运行?
dtcbnfnu1#
Map器的数量取决于输入拆分,而不是复制因子。请参阅以下文章,了解InputSplit的内部结构:hadoop进程记录是如何跨越块边界分割的?mapper和reducer的数量由hadoop框架决定。详情请参阅以下帖子:默认减速器数量为了简单起见,假设hdfs块和inputsplit是相同的,没有跨多个数据节点的数据跨越。在您的情况下,1 tb文件处理需要8192个Map。启动Map任务时,Map任务尝试在存在数据的节点上运行Map程序。8192块的1 tb文件可能没有均匀分布在100个节点上。如果它们平均分布在100个节点上,框架将在所有100个节点上运行map任务。数据局部性是数据节点选择的关键。
nx7onnlm2#
要运行的Map程序的数量不依赖于节点或块的数量或任何其他东西—它们只依赖于输入拆分的总数。在数据库上下文中,拆分可能对应于行的范围。现在,hdfs中的一个块可能是128mb,而输入分割的大小是256mb,在这种情况下,只有1个Map器将在这个覆盖2个块的输入分割上运行。现在问题来了,输入拆分是如何创建的这些拆分是由inputformat类创建的,该类包含负责创建拆分的getsplit和createrecordreader方法,如果您想更改这些拆分的创建方式,可以重写这些方法。这些Map器作业是在集群的不同节点上启动的,但不能保证它是均匀分布的。mapreduce总是尝试将Map器作业交给具有要处理的本地数据的节点。如果这是不可能的,它会给Map器的工作,以最佳的资源节点。请注意,输入拆分不包含实际数据。他们有参考资料。这些存储位置有助于mapreduce分配作业。我建议你访问这个链接http://javacrunch.in/yarn.jsp 它会给你一个关于Yarn如何分配工作的印象。你也可以访问这个Map减少内部工作http://javacrunch.in/mr.jsp.希望这能解决你的疑问
2条答案
按热度按时间dtcbnfnu1#
Map器的数量取决于输入拆分,而不是复制因子。
请参阅以下文章,了解InputSplit的内部结构:
hadoop进程记录是如何跨越块边界分割的?
mapper和reducer的数量由hadoop框架决定。
详情请参阅以下帖子:
默认减速器数量
为了简单起见,假设hdfs块和inputsplit是相同的,没有跨多个数据节点的数据跨越。
在您的情况下,1 tb文件处理需要8192个Map。启动Map任务时,Map任务尝试在存在数据的节点上运行Map程序。8192块的1 tb文件可能没有均匀分布在100个节点上。如果它们平均分布在100个节点上,框架将在所有100个节点上运行map任务。数据局部性是数据节点选择的关键。
nx7onnlm2#
要运行的Map程序的数量不依赖于节点或块的数量或任何其他东西—它们只依赖于输入拆分的总数。在数据库上下文中,拆分可能对应于行的范围。
现在,hdfs中的一个块可能是128mb,而输入分割的大小是256mb,在这种情况下,只有1个Map器将在这个覆盖2个块的输入分割上运行。现在问题来了,输入拆分是如何创建的这些拆分是由inputformat类创建的,该类包含负责创建拆分的getsplit和createrecordreader方法,如果您想更改这些拆分的创建方式,可以重写这些方法。
这些Map器作业是在集群的不同节点上启动的,但不能保证它是均匀分布的。mapreduce总是尝试将Map器作业交给具有要处理的本地数据的节点。如果这是不可能的,它会给Map器的工作,以最佳的资源节点。
请注意,输入拆分不包含实际数据。他们有参考资料。这些存储位置有助于mapreduce分配作业。
我建议你访问这个链接http://javacrunch.in/yarn.jsp 它会给你一个关于Yarn如何分配工作的印象。你也可以访问这个Map减少内部工作http://javacrunch.in/mr.jsp.
希望这能解决你的疑问