数据块:
HDFS的块大小为64MB,HDFS上的文件被划分为多个分块,作为独立的存储单元。但与其他文件系统不同的是,HDFS中小于一个块大小的文件不会占据整个块的空间。一个文件的大小可以大于集群中任何一个磁盘的容量,其他所有块不需要存储在同一个磁盘上。用 hadoop fsck / -files -blocks 可以查看整个文件系统中各文件的块组成情况。
Namenode 与 Datanode:
HDFS的模式是“管理者-工作者”模式,namenode就是管理者,datanode就是工作者。namenode手里有文件系统的整个命名空间,也就相当于有一个“管理账簿”。而datanode就是真正的工作结点。
目录没有备份数这个概念,因为dir(目录)是作为元数据保存在namenode中的。
Hadoop文件系统
Hadoop有一个抽象的文件系统概念,而HDFS只是其中的一个实现。hadoop对文件系统提供了许多接口,它一般使用URI方案来选取合适的文件系统实例进行交互。例如,要想列出本地文件系统根目录下的文件,可以用以下命令:
% hadoop fs -ls file:///
尽管运行的MapReduce程序可以访问任何文件系统,但在处理大数据集时,还是要选择一个具有数据本地优化的分布式文件系统,如HDFS或KFS。
通过FileSystem API读取数据
FileSystem是一个通用文件系统API,第一步是要知道我们所用的文件系统类型,生成一个文件系统实例。获取FileSystem实例有两个工厂方法。
public static FileSystem get(Configuration conf) throws IOException
public static FileSystem get(URI uri, Configuration conf) throws IOException
其中,Configuration对象封装了客户端或服务器的配置,这个配置就是conf/core-site.xml中指定的。
文件读取剖析
DistributedFileSystem通过使用RPC调用namenode,以确定文件起始块的位置。对于每一个块,namenode返回存有该块复本的datanode地址。此外,这些datanode根据它们与客户端的距离来排序。如果该客户端本身就是一个datanode(比如,在一个MapReduce任务中),并保存有相应数据块的一个复本时,该节点将从本地datanode中读取数据。