HDFS 存储系统中,引入了文件系统的分块概念(block),块是存储的最小单位,HDFS定义其大小为 64MB。与单磁盘文件系统相似,存储在 HDFS 上的文件均存储为多个块,不同的是,如果某文件大小没有到达 64MB,该文件也不会占据整个块空间。在分布式的 HDFS集群上,Hadoop 系统 保证一个块存储在一个 datanode 上。
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。
当某个分块分成均等的若干分片时,会有最后一个分片大小小于定义的分片大小,则该分片独立成为一个分片。