vlambda博客
学习文章列表

图文详解大数据分布式文件系统HDFS—切片划分

背景


  • 每个hdfs文件的一个切片对应一个MapReduce作业的一个map任务

  • 那么文件的切片是怎么划分的呢?下面介绍其中一个InputFormat:TextInputFormat

作用


  • 获取纯文本文件的逻辑切片

  • 为每个逻辑切片创建基于行的读取器

  • 读取器读取的内容是kv键值对,键是记录的偏移量,值是当前行文本内容


前提条件


  • 文件内容为纯文本

  • hdfs的块大小默认为blockSize = 128M

  • 在TextInputFormat前提下,计算得到的每个切片大小为splitSize = 128M

  • 溢出阈值变量SPLIT_SLOP = 1.1(意思就是如果剩余待切分的文件长度 / splitSize < 1.1的话,那么就把剩下的文件长度当做一个逻辑切片看待,即使剩下的带切分的文件内容在2个块中存储)


切片获取


  1. 假设当前一个文本文件存储在hdfs上有N个块(不含副本块数)

  2. 前N-2个块每个块对应一个逻辑切片,如果第N-1和第N个块的大小之和除以splitSize小于等于1.1,则第N-1和第N个块被划分到一个逻辑切片中;如果第N-1和第N个块的大小之和除以splitSize大于1.1,则第N-1个块和第N个块分别对应一个逻辑切片

  3. 例:文件129M.txt是一个文件大小为129M的文件,因为blockSize为128M,因此该文件以使用了两个block存储,第一个block大小为128M,第二个block大小为1M

    • 最开始时,文件剩余划分内容长度为129M,129M / splitSize = 1.007 < 1.1,因此该文件的第一个block和第二个block划分到一个切片了

    • 因此该文件对应的切片数量为1

图示(未画出副本block)

  1. 例:文件150M.txt是一个文件大小为150M的文件,因为blockSize为128M,因此该文件以使用了两个block存储,第一个block大小为128M,第二个block大小为22M

    • 最开始时,文件剩余划分内容长度为150M,150M / splitSize = 1.17 > 1.1,因此该文件的第一个block和第二个block分别对应一个切片

    • 因此该文件对应的切片数量为2

图文详解大数据分布式文件系统HDFS—切片划分

图示(未画出副本block)

代码片段


TextInputFormat获取文本文件切片源码

切片类关键属性

  • 文件路径(文件逻辑路径)

  • 起始偏移量

  • 内容长度

  • 这个起始偏移量所在数据块在哪些DataNode的磁盘上

  • 这个数据块被缓存在哪些DataNode的内存中

切片类属性

  • 例1:以文件大小为129M这个例子为例,该文件划分了一个切片(对应两个block),因此该切片的属性中起始偏移量start为0,内容长度length为129*1024*1024 = 135266304

  • 例2:以上述切片例子中的第2例150M的文件为例,该例中有2个切片,第一个切片中包含该文件的第一个block,该block的大小为128M,因此该切片的属性起始偏移量start为0,内容长度length为128*1024*1024 = 134217728;第二个切片包含该文件的第二个block(内容只有22M),因此第二个切片的属性中起始偏移量start为(150-22)*1024*1024 = 134217728,内容长度length为22*1024*1024 = 23068672

以上就是TextInputFormat获取文本文件逻辑切片的过程了,后面介绍如何读取切片对应文件块的内容

这篇文章对你有用的话,点个关注呗