1.10 Hadoop的分布式容错文件系统HDFS
Hadoop的文件系统叫HDFS,意为Hadoop的分布式文件系统。在某种意义上,HDFS是建立在各节点的宿主文件系统基础上的全局文件系统。如果说Hadoop是集群操作系统,那么HDFS就是集群的文件系统。
说HDFS是分布式文件系统,并不是指整个文件系统中有些文件在这个节点上,有些文件在那个节点上,那样就只是远程mount文件卷,没有什么新意了。如果是那样,我们设想有100个Mapper分布在100个节点上,都以同一个文件为输入,只是不同的Mapper处理这个文件中不同的数据段(假定每个段的长度是128MB),于是这100个Mapper都要到同一个节点上来读数据,哪里还谈得上“数据在哪里,计算就在哪里”?所以HDFS的分布方式是沿着文件的长度把它分成许多定长的数据块(每个数据块的长度是64MB或128MB),把不同的数据块存放在不同的节点上。这样,就可以实现“数据在哪里,计算就在哪里”了。当然,如果允许随机写入,那么假如用户要在一个文件中间插入一段数据,就会把原来的数据块边界打乱,那就麻烦了。所以HDFS不允许随机写入,而只允许在文件末尾添加(append)内容。对于OLAP,只允许在文件末尾添加而不允许在文件中间插入或修改是合理的,因为这些数据已是历史数据,是让你拿来分析的,你要修改它干什么?所以,像YARN和MapReduce框架一样, HDFS可以说也是专为OLAP量身定制的。
光是分布还不行,还得容错。如果没有容错,HDFS的那种分布方式就是不现实的。设想如果一个文件的内容分布在100个节点上,那么只要有其中的一个节点发生故障而变成不可读,这个文件就不完整了。而100个节点中有一个发生故障的概率,是单个节点发生故障的概率的100倍。也就是说,有可能运行一段时间以后所有的文件都不完整了,这还了得。所以,这种方式的分布必须结合容错措施才有使用价值。
HDFS的容错措施是把每个数据块都以三个复份分别存储在不同的节点上。这样,如果其中之一发生了故障,就继续使用剩下的两份,并再复制一份,仍维持三个复份。过一会儿,如果那个发生故障的节点又恢复了,那个数据块超过了三个复份,就从中删除一个,总之就是维持在每个数据块三个复份。
对于HDFS,集群中有一个节点扮演着主节点的角色,称为namenode。主节点上维持着整个HDFS文件系统的目录,可以说是整个HDFS的目录服务器,或者说查名服务器。主节点上并不存储数据块复份,而只是存储着所有文件和目录的“元数据”。应用程序需要访问某个文件中某一个位置上的数据时,首先向主节点查询,主节点答以数据块的号码和所存放的节点,并发给一个类似于提货票据的Token,让应用程序自己去提货。至于主节点的容错,则通过namenode的热备来解决。同样的思路也用于数据库HBase的设计。
总之,Hadoop原先是个专门支持MapReduce计算模型的大数据处理平台和框架,主要发掘数据间的并行度。现在则也支持链状数据流,这样就既可以发掘出数据之间的并行度,又可以发掘出上下游之间的并行度。从系统结构的角度看,Hadoop实质上是个建立在宿主操作系统基础上的集群操作系统。经过这些年来的发展,Hadoop已经得到广泛采用,成为大数据处理平台的“事实标准”之一。所以,我们可以把Hadoop作为大数据处理平台的一个标本、一个典型加以研究,就像我们可以把Linux作为操作系统的一个标本、一个典型加以研究。把Hadoop研究透了,对Hadoop有了透彻的理解,再要理解别的大数据处理平台也就不难了。