作者:黄钰朝
邮箱:[email protected]
日期:2019年8月5日
最近主要学习了Hadoop的几个入门的知识:
Hadoop是apache基金会的一个分布式系统基础架构,主要应用于大数据处理领域。Hadoop的核心是分布式文件系统(HDFS)和分布式计算框架(MapReduce),HDFS提供了在分布式系统中存储和管理文件的能力,而MapReduce提供了在分布式系统中对文件进行分析计算的能力。因为分布式系统相比于集中式系统具有存储和性能方面的优势,而大数据分析的特点就是数据量大,计算量大,所以Hadoop非常适用于大数据处理。
Hadoop最早是作为lucene的子项目Nutch(一个开源的搜索引擎)的一部分被Doug Cutting开发出来,一开始是为了解决搜索引擎需要处理的数据量不断增大的问题,Doug Cutting基于谷歌的学术论文GFS实现了分布式文件系统NDFS(后来改名为HDFS),基于谷歌学术论文提出的MapReduce编程模型实现了分布式计算框架MapReduce,后来又根据谷歌提出的分布式数据存储系统Big Table实现了实时分布式数据库HBase。至此,谷歌大数据的三驾马车(GFS,MapReduce,Big Table),都被Doug Cutting 一一引入到了Hadoop系统中。
分布式系统是建立在网络之上的软件系统,分布式系统在软件层面将分散在不同主机上的硬件资源统一管理起来,例如分布式文件系统,在分布式文件系统中的一个文件实际上分布在很多不同的主机上,在对这个文件进行读取操作时,实际上需要将分布在不同主机上的数据取出来,而在分布式文件系统中,用户并不需要关心这些文件的不同部分数据存储在哪里,只需要对文件进行统一操作,而数据的存储,调度则交给分布式系统自动完成。
分布式系统的优点是具有高可靠性,因为分布式系统在硬件层面上是将数据分布在不同的主机上,并且对于每一份数据,都会数据的副本保存在另外的主机上,所以某个结点主机出现故障时并不会影响整个分布式系统的运行。
Hadoop由四个核心模块组成:
Hadoop适合用于海量数据,写一次,读多次的场景,按计算特征可以分为:
HDFS的全称是Hadoop Distributed File System,顾名思义,HDFS是Hadoop中的分布式文件系统,是Hadoop的核心部件之一,解决的是大数据处理中的第一个问题:大数据怎么保存?
大数据的特点就是数据量大,因此对于大数据存储有三个主要的问题:
在单机时代,解决的方案是RAID(独立冗余磁盘阵列),而现在,Hadoop的解决方案是HDFS(分布式文件系统)。
RAID的原理就是在一台主机中安装多个磁盘,通过RAID技术,使得多个磁盘使用起来就像一个磁盘一样,RAID技术将数据分散在不同的磁盘上,读写时可以多个磁盘并行读写,大大提高了读写性能,同时在可靠性上,根据不同的RAID级别,使用不同的策略(副本的份数等)使数据冗余存储,也就是生成数据的副本,一旦数据发生丢失或损坏,立即从副本中恢复,这样使得数据的可靠性也得到了大大提升。通过多个廉价磁盘的组合形成磁盘阵列,其读写性能和可靠性甚至远远超过单个昂贵的高端磁盘。
HDFS的设计理念和RAID相似,不同的是HDFS面向更加大量的数据,并且不是以磁盘为单位,而是基于计算机网络技术,将数据保存在不同的主机上。
HDFS的具体解决方案是分片冗余,本地校验。
磁盘中以数据块为单位对数据进行读写。HDFS中也有“块”的概念,默认情况下,HDFS的一个块的大小是128m。如果一个文件的大小小于一个块的大小,那么该文件在HDFS中实际也只会占用其原本文件大小的空间,而不会占据一个块的空间。
答案很明显,将文件分成很多的小块,可以将一个很大的文件存储在不同的磁盘上面,而且由于块的大小是固定的,很容易计算单个磁盘能够存储多少个块。
因为读写是以块为单位的,因此每次读取需要查找每一个块,将块设置得很大主要就是为了减少寻址时间。但是块也不能设置得太大,块越大时,文件分割得到的块就越少,就失去了“分布式”的优势:并行读写。因此一般设置块的大小时,要使得寻址时间占数据传输时间的1%。
Hadoop整体上使用一主多从的架构,即由一个namenode,集中管理n个datanode。
可用性是指系统正常工作时间比上总的运行时间,由此可见,发生故障的时间越短,则可用性越高,高可用性就是指系统能够长时间保持正常工作的能力。
HDFS中,每个datanode中的数据都有存在于别的datanode上面的副本,因此单个datanode失效并不会影响Hadoop集群的正常运行,而namenode只有一个,namenode一旦失效,整个HDFS就处于不可访问的状态,因此,HDFS的高可用主要就是namenode的高可用。
Sencondary Namenode并不解决namenode的单点问题和非高可用性问题(non-HA)。
在Hadoop2.0之前,namenode存在单点问题,仅仅通过secondary namenode机制来辅助namenode,减轻namenode的重启时的压力。
首先需要了解namenode用于保存元数据信息的两个文件:
fsimage:文件系统镜像,顾名思义,这是namenode启动时对整个HDFS生成的快照
namenode启动时才会把edit logs合并到fsimage中,启动之后的改动只保存到edit logs
如果namenode运行的时间很长,那么edit logs文件就越大,下次启动合并需要的时间就越长
Secondary Namenode的作用:
这是Hadoop2.0之后引入的高可用机制,使用active namenode和standby namenode两个namenode来实现高可用,其中active namenode是状态为active的namenode,而是standby namenode是状态为standby namenode的namenode,可见两者的区别在于状态,两者是完全可以互相替换的,当active namenode失效时,standby namenode就会变成 active状态,接管工作,整个切换的过程只需要几十秒。而在这之前,namenode失效时进行冷启动需要大约30分钟。
实现两个namenode之间互相替换,需要保证两者的数据是同步的,而实现数据同步有两种可供选择的方式:NFS方式和QJM方式
NFS作为active namenode和standby namenode之间数据共享的存储。active namenode会把最近的edits文件写到NFS,而standby namenode从NFS中把数据读过来。
这个方式的缺点是,如果active namenode或者standby namenode有一个和NFS之间网络有问题,则会造成他们之前数据的同步出问题。
QJM的方式可以解决上述NFS容错机制不足的问题。active namenode和standby namenode之间是通过一组journalnode(数量是奇数,可以是3,5,7…,2n+1)来共享数据。
active namenode把最近的edits文件写到2n+1个journalnode上,只要有n+1个写入成功就认为这次写入操作成功了,然后standby namenode就可以从journalnode上读取了。
可以看到,QJM方式有容错的机制,可以容忍n个journalnode的失败。
HDFS可能发生的三种故障为:
HDFS为此使用的故障检测机制为:
今天的时间,整体上了解了Hadoop是个什么东西,学习Hadoop的发展历史和组成结构,以及Hadoop的优缺点和适合的场景,了解了HDFS的原理和HDFS高可用和容错性的实现。这还只是Hadoop的基础,后面看了一下Hadoop的I/O,感觉不是很明白这些压缩,数据完整性,序列化框架和基于文件的数据结构在具体的运用中是个什么样子,又能发挥多大的作用,所以,接下来的目标应该是学习MapReduce相关的知识,站在运用的角度再来理解这些东西。
导师提到的需要注意的问题: