关闭

Hadoop分块与分片

标签: hadoop
1019人阅读 评论(0) 收藏 举报
分类:

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。

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

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:191995次
    • 积分:3071
    • 等级:
    • 排名:第11273名
    • 原创:74篇
    • 转载:291篇
    • 译文:0篇
    • 评论:4条
    最新评论