这是一个涉及Hadoop/HDFS的概念性问题.假设您有一个包含10亿行的文件.并且为了简单起见,我们考虑每条线的形式
,其中k是从开头开始的线的偏移量,值是线的内容.
现在,当我们说要运行N个映射任务时,框架是否将输入文件拆分为N个拆分并在该拆分上运行每个映射任务?或者我们是否必须编写一个分区函数来执行N分割并在生成的分割上运行每个映射任务?
我想知道的是,拆分是在内部完成还是我们必须手动拆分数据?
更具体地说,每次调用map()函数时,它的Key key and Value val
参数是什么?
谢谢,迪帕克
该InputFormat
负责提供劈叉.
通常,如果您有n个节点,HDFS将在所有这n个节点上分发文件.如果你开始一个工作,默认情况下会有n个映射器.感谢Hadoop,计算机上的映射器将处理存储在此节点上的部分数据.我认为这是所谓的Rack awareness
.
所以简而言之:上传HDFS中的数据并启动MR作业.Hadoop将关注优化执行.
文件被拆分为HDFS块并复制块.Hadoop根据数据位置原则为拆分分配节点.Hadoop将尝试在块所在的节点上执行映射器.由于复制,有多个这样的节点托管相同的块.
如果节点不可用,Hadoop将尝试选择最接近托管数据块的节点的节点.例如,它可以在同一个机架中选择另一个节点.由于各种原因,节点可能不可用; 所有映射槽可能正在使用中,或者节点可能只是关闭.
幸运的是,一切都将由框架来处理.
MapReduce数据处理由输入分割的概念驱动.为特定应用程序计算的输入拆分数决定了映射器任务的数量.
映射数通常由输入文件中的DFS块数驱动.
在可能的情况下,将这些映射器任务中的每一个分配给存储输入分割的从节点.资源管理器(或JobTracker,如果您在Hadoop 1中)尽力确保在本地处理输入拆分.
如果由于跨越数据节点边界的输入分裂而无法实现数据局部性,则一些数据将从一个数据节点传输到另一个数据节点.
假定有128 MB块和最后一个记录不适合在块一个和在传播B座,然后在数据B座将被复制到节点具有阻止一
看看这个图.
看看相关的问题
关于Hadoop/HDFS文件拆分
Hadoop流程记录如何跨块边界分割?
我认为Deepak提出的问题更多是关于如何确定map函数每次调用的输入,而不是每个map 节点上的数据。我是根据问题的第二部分说这句话的: 更具体地说,每次调用map()函数时,其Key键和Value val参数是什么?
实际上,同样的问题也将我带到这里,并且如果我是一位经验丰富的hadoop开发人员,我可能会像上面的答案一样解释它。
为了回答这个问题,
根据我们为InputFormat设置的值,将拆分给定地图节点上的文件。(这是使用setInputFormat()在Java中完成的!)
一个例子:
conf.setInputFormat(TextInputFormat.class); 在这里,通过将TextInputFormat传递给setInputFormat函数,我们告诉hadoop 将映射节点处的输入文件的每一行都视为映射函数的输入。换行或回车用于信号行结束。有关更多信息,请参见TextInputFormat!
在此示例中:键是文件中的位置,值是文本行。
希望这可以帮助。