前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Hadoop MapReduce中的InputSplit

Hadoop MapReduce中的InputSplit

作者头像
smartsi
发布2019-08-07 09:06:49
1.7K0
发布2019-08-07 09:06:49
举报
文章被收录于专栏:SmartSiSmartSi

Hadoop的初学者经常会有这样两个问题:

  • Hadoop的一个Block默认是128M(或者64M),那么对于一条记录来说,会不会造成一条记录被分到两个Block中?
  • Block中读取数据进行切分时,会不会造成一条记录被分到两个InputSplit中?

对于上面的两个问题,首先要明确两个概念:BlockInputSplit。在Hadoop中,文件由一个一个的记录组成,最终由mapper任务一个一个的处理。 例如,示例数据集包含有关1987至2008年间美国境内已完成航班的信息。如果要下载数据集可以打开如下网址: http://stat-computing.org/dataexpo/2009/the-data.html 。每一年都会生成一个大文件(例如:2008年文件大小为108M),在每个文件中每单独的一行都代表一次航班信息。换句话说,一行代表一个记录。 HDFS以固定大小的Block为基本单位存储数据,而对于MapReduce而言,其处理单位是InputSplit

1. Block

块是以block size进行划分数据。因此,如果集群的block size为128MB,则数据集的每个块将为128MB,除非最后一个块小于block size(文件大小不能被 block size 完全整除)。例如下图中文件大小为513MB,513%128=1,最后一个块e小于block size,大小为1MB。因此,块是以block size进行切割,并且块甚至可以在到逻辑记录结束之前结束(blocks can end even before a logical record ends)。

假设我们的集群中block size是128MB,每个逻辑记录大约100MB(假设为巨大的记录)。所以第一个记录将完全在一个块中,因为记录大小为100MB小于块大小128 MB。但是,第二个记录不能完全在一个块中,第二条记录将出现在两个块中,从块1开始,溢出到块2中。

2.InputSplit

但是如果每个Map任务都处理特定数据块中的所有记录,那怎么处理这种跨越块边界的记录呢?如果分配一个Mapper给块1,在这种情况下,Mapper不能处理第二条记录,因为块1中没有完整的第二条记录。因为HDFS对文件块内部并不清楚,它不知道一个记录会什么时候可能溢出到另一个块(because HDFS has no conception of what’s inside the file blocks, it can’t gauge when a record might spill over into another block)。InputSplit就是解决这种跨越块边界记录问题的,Hadoop使用逻辑表示存储在文件块中的数据,称为输入拆分InputSplitInputSplit是一个逻辑概念,并没有对实际文件进行切分,它只包含一些元数据信息,比如数据的起始位置,数据长度,数据所在的节点等。它的划分方法完全取决于用户自己。但是需要注意的是InputSplit的多少决定了MapTask的数目,因为每个InputSplit会交由一个MapTask处理。

MapReduce作业客户端计算InputSplit时,它会计算出块中第一个记录的开始位置和最后一个记录的结束位置。在最后一个记录不完整的情况下,InputSplit包括下一个块的位置信息和完成该记录所需的数据的字节偏移(In cases where the last record in a block is incomplete, the input split includes location information for the next block and the byte offset of the data needed to complete the record)。下图显示了数据块和InputSplit之间的关系:

块是磁盘中的数据存储的物理块,其中InputSplit不是物理数据块。它只是一个逻辑概念,并没有对实际文件进行切分,指向块中的开始和结束位置。因此,当Mapper尝试读取数据时,它清楚地知道从何处开始读取以及在哪里停止读取。InputSplit的开始位置可以在一个块中开始,在另一个块中结束。InputSplit代表了逻辑记录边界,在MapReduce执行期间,Hadoop扫描块并创建InputSplits,并且每个InputSplit将被分配给一个Mapper进行处理。

原文:http://www.dummies.com/programming/big-data/hadoop/input-splits-in-hadoops-mapreduce/ http://hadoopinrealworld.com/inputsplit-vs-block/

http://hadoopinrealworld.com/inputsplit-vs-block/

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2017-12-06,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1. Block
  • 2.InputSplit
相关产品与服务
大数据
全栈大数据产品,面向海量数据场景,帮助您 “智理无数,心中有数”!
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档