Hadoop如何执行输入拆分?

Dee*_*pak 34 hadoop mapreduce hdfs

这是一个涉及Hadoop/HDFS的概念性问题.假设您有一个包含10亿行的文件.并且为了简单起见,我们考虑每条线的形式<k,v>,其中k是从开头开始的线的偏移量,值是线的内容.

现在,当我们说要运行N个映射任务时,框架是否将输入文件拆分为N个拆分并在该拆分上运行每个映射任务?或者我们是否必须编写一个分区函数来执行N分割并在生成的分割上运行每个映射任务?

我想知道的是,拆分是在内部完成还是我们必须手动拆分数据?

更具体地说,每次调用map()函数时,它的Key key and Value val参数是什么?

谢谢,迪帕克

Pet*_*ann 24

InputFormat负责提供劈叉.

通常,如果您有n个节点,HDFS将在所有这n个节点上分发文件.如果你开始一个工作,默认情况下会有n个映射器.感谢Hadoop,计算机上的映射器将处理存储在此节点上的部分数据.我认为这是所谓的Rack awareness.

所以简而言之:上传HDFS中的数据并启动MR作业.Hadoop将关注优化执行.


小智 14

文件被拆分为HDFS块并复制块.Hadoop根据数据位置原则为拆分分配节点.Hadoop将尝试在块所在的节点上执行映射器.由于复制,有多个这样的节点托管相同的块.

如果节点不可用,Hadoop将尝试选择最接近托管数据块的节点的节点.例如,它可以在同一个机架中选择另一个节点.由于各种原因,节点可能不可用; 所有映射槽可能正在使用中,或者节点可能只是关闭.


Rav*_*abu 8

幸运的是,一切都将由框架来处理.

MapReduce数据处理由输入分割的概念驱动.为特定应用程序计算的输入拆分数决定了映射器任务的数量.

映射数通常由输入文件中的DFS块数驱动.

在可能的情况下,将这些映射器任务中的每一个分配给存储输入分割的从节点.资源管理器(或JobTracker,如果您在Hadoop 1中)尽力确保在本地处理输入拆分.

如果由于跨越数据节点边界的输入分裂而无法实现数据局部性,则一些数据将从一个数据节点传输到另一个数据节点.

假定有128 MB块和最后一个记录不适合在块一个和在传播B座,然后在数据B座将被复制到节点具有阻止一

看看这个图.

在此输入图像描述

看看相关的问题

关于Hadoop/HDFS文件拆分

Hadoop流程记录如何跨块边界分割?


Kar*_*kan 5

我认为Deepak提出的问题更多是关于如何确定map函数每次调用的输入,而不是每个map 节点上的数据。我是根据问题的第二部分说这句话的: 更具体地说,每次调用map()函数时,其Key键和Value val参数是什么?

实际上,同样的问题也将我带到这里,并且如果我是一位经验丰富的hadoop开发人员,我可能会像上面的答案一样解释它。

为了回答这个问题,

根据我们为InputFormat设置的值,将拆分给定地图节点上的文件。(这是使用setInputFormat()在Java中完成的!)

一个例子:

conf.setInputFormat(TextInputFormat.class); 在这里,通过将TextInputFormat传递给setInputFormat函数,我们告诉hadoop 将映射节点处的输入文件的每一行都视为映射函数的输入。换行或回车用于信号行结束。有关更多信息,请参见TextInputFormat

在此示例中:键是文件中的位置,值是文本行。

希望这可以帮助。


Nik*_*dij 5

块大小和输入分割大小之间的差异。

输入分割是数据的逻辑分割,主要在 MapReduce 程序或其他处理技术的数据处理过程中使用。输入分割大小是用户定义的值,Hadoop 开发人员可以根据数据大小(您正在处理的数据量)选择分割大小。

输入分割主要用于控制MapReduce程序中Mapper的数量。如果您没有在MapReduce程序中定义输入分割大小,那么在数据处理过程中默认的HDFS块分割将被视为输入分割。

例子:

假设您有一个 100MB 的文件,HDFS 默认块配置为 64MB,那么它将被分成 2 个部分并占用两个 HDFS 块。现在您有一个 MapReduce 程序来处理此数据,但您尚未指定输入拆分,那么基于块的数量(2 个块)将被视为 MapReduce 处理的输入拆分,并且将为该作业分配两个映射器。但是假设,您在 MapReduce 程序中指定了拆分大小(例如 100MB),那么两个块(2 块)将被视为 MapReduce 处理的单个拆分,并且将为该作业分配一个 Mapper。

现在假设,您已经在 MapReduce 程序中指定了拆分大小(例如 25MB),那么 MapReduce 程序将有 4 个输入拆分,并且将为该作业分配 4 个 Mapper。

结论:

  1. 输入分割是输入数据的逻辑划分,而HDFS块是数据的物理划分。
  2. 如果未通过代码指定输入分割,则 HDFS 默认块大小是默认分割大小。
  3. 分割是用户定义的,用户可以在 MapReduce 程序中控制分割大小。
  4. 一个split可以映射到多个block,一个block可以有多个split。
  5. 映射任务(Mapper)的数量等于输入分割的数量。

来源:https ://hadoopjournal.wordpress.com/2015/06/30/mapreduce-input-split-versus-hdfs-blocks/