首页  ·  知识 ·  大数据
Hadoop的分块与分片
记者  CTOZJ  实践应用  编辑:dezai   图片来源:网络
HDFS存储系统中,引入了文件系统的分块概念(block),块是存储的最小单位,HDFS定义其大小为64MB。与单磁盘文件系统相似,存储在HDFS上的文件均存储为多个块,不同的是,如果某文件大小没有到

HDFS存储系统中,引入了文件系统的分块概念(block),块是存储的最小单位,HDFS定义其大小为64MB。与单磁盘文件系统相似,存储在HDFS上的文件均存储为多个块,不同的是,如果某文件大小没有到达64MB,该文件也不会占据整个块空间。在分布式的HDFS集群上,Hadoop系统保证一个块存储在一个datanode上。

当我们执行hadoop fs -put aa.txt /bb.txt,则aa.txt会被复制为集群的/bb.txt。查看系统的log日志hadoop-$username-namenode-*.log,可以看到类似于

2011-09-07 08:39:12,506 INFO org.apache.hadoop.hdfs.StateChange: BLOCK* NameSystem.addStoredBlock: blockMap updated: 127.     0.0.1:50010 is added to blk_5715489406767973176_1455 size 32

这样的信息,里面记录有分配block的元数据信息和block号(blk_5715489406767973176)。

在另一个日志中hadoop-$username-datanode-*.log可以看到对应的datanode打印出相应的log:

2011-09-07 08:39:12,495 INFO org.apache.hadoop.hdfs.server.datanode.DataNode: Receiving block blk_5715489406767973176_145     5 src: /127.0.0.1:48492 dest: /127.0.0.1:50010

HDFS的namenode只存储整个文件系统的元数据镜像,这个镜像由配置dfs.name.dir指定,datanode则存有文件的metainfo和具体的分块,存储路径由dfs.data.dir指定。

分析完毕分块,下面讨论一下分片:

hadoop的作业在提交过程中,需要把具体的输入进行分片。具体的分片细节由InputSplitFormat指定。分片的规则为  FileInputFormat.class中的getSplits()方法指定:

long splitSize = computeSplitSize(goalSize, minSize, blockSize);

computeSplitSize:

Math.max(minSize, Math.min(goalSize, blockSize));

其中goalSize为“InputFile大小”/“我们在配置文件中定义的mapred.map.tasks”值,minsize为mapred.min.split.size,blockSize为64,所以,这个算式为取分片大小不大于block,并且不小于在mapred.min.split.size配置中定义的最小Size。

当某个分块分成均等的若干分片时,会有最后一个分片大小小于定义的分片大小,则该分片独立成为一个分片。

本文作者:记者 来源:CTOZJ
CIO之家 www.ciozj.com 微信公众号:imciow
   
免责声明:本站转载此文章旨在分享信息,不代表对其内容的完全认同。文章来源已尽可能注明,若涉及版权问题,请及时与我们联系,我们将积极配合处理。同时,我们无法对文章内容的真实性、准确性及完整性进行完全保证,对于因文章内容而产生的任何后果,本账号不承担法律责任。转载仅出于传播目的,读者应自行对内容进行核实与判断。请谨慎参考文章信息,一切责任由读者自行承担。
延伸阅读