微信公众号【黄小斜】大厂程序员,互联网行业新知,终身学习践行者。关注后回复「Java」、「Python」、「C++」、「大数据」、「机器学习」、「算法」、「AI」、「Android」、「前端」、「iOS」、「考研」、「BAT」、「校招」、「笔试」、「面试」、「面经」、「计算机基础」、「LeetCode」 等关键字能够获取对应的免费学习资料。 前端
纯干货:Hadoop核心架构HDFS+MapReduce+Hbase+Hive内部机理详解。mysql
经过这一阶段的调研总结,从内部机理的角度详细分析,HDFS、MapReduce、Hbase、Hive是如何运行,以及基于Hadoop数据仓库的构建和分布式数据库内部具体实现。若有不足,后续及时修改。程序员
整个Hadoop的体系结构主要是经过HDFS来实现对分布式存储的底层支持,并经过MR来实现对分布式并行任务处理的程序支持。面试
HDFS采用主从(Master/Slave)结构模型,一个HDFS集群是由一个NameNode和若干个DataNode组成的(在最新的Hadoop2.2版本已经实现多个NameNode的配置-这也是一些大公司经过修改hadoop源代码实现的功能,在最新的版本中就已经实现了)。NameNode做为主服务器,管理文件系统命名空间和客户端对文件的访问操做。DataNode管理存储的数据。HDFS支持文件形式的数据。算法
从内部来看,文件被分红若干个数据块,这若干个数据块存放在一组DataNode上。NameNode执行文件系统的命名空间,如打开、关闭、重命名文件或目录等,也负责数据块到具体DataNode的映射。DataNode负责处理文件系统客户端的文件读写,并在NameNode的统一调度下进行数据库的建立、删除和复制工做。NameNode是全部HDFS元数据的管理者,用户数据永远不会通过NameNode。sql
如图:HDFS体系结构图shell
图中涉及三个角色:NameNode、DataNode、Client。NameNode是管理者,DataNode是文件存储者、Client是须要获取分布式文件系统的应用程序。数据库
文件写入:编程
1) Client向NameNode发起文件写入的请求。缓存
2) NameNode根据文件大小和文件块配置状况,返回给Client它管理的DataNode的信息。
3) Client将文件划分为多个block,根据DataNode的地址,按顺序将block写入DataNode块中。
文件读取:
1) Client向NameNode发起读取文件的请求。
2) NameNode返回文件存储的DataNode信息。
3) Client读取文件信息。
HDFS做为分布式文件系统在数据管理方面可借鉴点:
文件块的放置:一个Block会有三份备份,一份在NameNode指定的DateNode上,一份放在与指定的DataNode不在同一台机器的DataNode上,一根在于指定的DataNode在同一Rack上的DataNode上。备份的目的是为了数据安全,采用这种方式是为了考虑到同一Rack失败的状况,以及不一样数据拷贝带来的性能的问题。
MR框架是由一个单独运行在主节点上的JobTracker和运行在每一个集群从节点上的TaskTracker共同组成。主节点负责调度构成一个做业的全部任务,这些任务分布在不一样的不一样的从节点上。主节点监视它们的执行状况,并从新执行以前失败的任务。从节点仅负责由主节点指派的任务。当一个Job被提交时,JobTracker接受到提交做业和配置信息以后,就会将配置信息等分发给从节点,同时调度任务并监控TaskTracker的执行。JobTracker能够运行于集群中的任意一台计算机上。TaskTracker负责执行任务,它必须运行在DataNode上,DataNode既是数据存储节点,也是计算节点。JobTracker将map任务和reduce任务分发给空闲的TaskTracker,这些任务并行运行,并监控任务运行的状况。若是JobTracker出了故障,JobTracker会把任务转交给另外一个空闲的TaskTracker从新运行。
HDFS和MR共同组成Hadoop分布式系统体系结构的核心。HDFS在集群上实现了分布式文件系统,MR在集群上实现了分布式计算和任务处理。HDFS在MR任务处理过程当中提供了文件操做和存储等支持,MR在HDFS的基础上实现了任务的分发、跟踪、执行等工做,并收集结果,两者相互做用,完成分布式集群的主要任务。
Hadoop上的并行应用程序开发是基于MR编程框架。MR编程模型原理:利用一个输入的key-value对集合来产生一个输出的key-value对集合。MR库经过Map和Reduce两个函数来实现这个框架。用户自定义的map函数接受一个输入的key-value对,而后产生一个中间的key-value对的集合。MR把全部具备相同的key值的value结合在一块儿,而后传递个reduce函数。Reduce函数接受key和相关的value结合,reduce函数合并这些value值,造成一个较小的value集合。一般咱们经过一个迭代器把中间的value值提供给reduce函数(迭代器的做用就是收集这些value值),这样就能够处理没法所有放在内存中的大量的value值集合了。
说明:(第三幅图为同伴本身画的)
流程简而言之,大数据集被分红众多小的数据集块,若干个数据集被分在集群中的一个节点进行处理并产生中间结果。单节点上的任务,map函数一行行读取数据得到数据的(k1,v1),数据进入缓存,经过map函数执行map(基于key-value)排序(框架会对map的输出进行排序)执行后输入(k2,v2)。每一台机器都执行一样的操做。不一样机器上的(k2,v2)经过merge排序的过程(shuffle的过程能够理解成reduce前的一个过程),最后reduce合并获得,(k3,v3),输出到HDFS文件中。
谈到reduce,在reduce以前,能够先对中间数据进行数据合并(Combine),即将中间有相同的key的<key,value>对合并。Combine的过程与reduce的过程相似,但Combine是做为map任务的一部分,在执行完map函数后仅接着执行。Combine能减小中间结果key-value对的数目,从而下降网络流量。
Map任务的中间结果在作完Combine和Partition后,以文件的形式存于本地磁盘上。中间结果文件的位置会通知主控JobTracker,JobTracker再通知reduce任务到哪个DataNode上去取中间结果。全部的map任务产生的中间结果均按其key值按hash函数划分红R份,R个reduce任务各自负责一段key区间。每一个reduce须要向许多个map任务节点取的落在其负责的key区间内的中间结果,而后执行reduce函数,最后造成一个最终结果。有R个reduce任务,就会有R个最终结果,不少状况下这R个最终结果并不须要合并成一个最终结果,由于这R个最终结果能够做为另外一个计算任务的输入,开始另外一个并行计算任务。这就造成了上面图中多个输出数据片断(HDFS副本)。
Hbase就是Hadoop database。与传统的MySQL、Oracle究竟有什么差异。即列式数据与行式数据由什么区别。NoSql数据库与传统关系型数据由什么区别:
一、 Hbase适合大量插入同时又有读的状况。输入一个Key获取一个value或输入一些key得到一些value。
二、 Hbase的瓶颈是硬盘传输速度。Hbase的操做,它能够往数据里面insert,也能够update一些数据,但update的实际上也是insert,只是插入一个新的时间戳的一行。Delete数据,也是insert,只是insert一行带有delete标记的一行。Hbase的全部操做都是追加插入操做。Hbase是一种日志集数据库。它的存储方式,像是日志文件同样。它是批量大量的往硬盘中写,一般都是以文件形式的读写。这个读写速度,就取决于硬盘与机器之间的传输有多快。而Oracle的瓶颈是硬盘寻道时间。它常常的操做时随机读写。要update一个数据,先要在硬盘中找到这个block,而后把它读入内存,在内存中的缓存中修改,过段时间再回写回去。因为你寻找的block不一样,这就存在一个随机的读。硬盘的寻道时间主要由转速来决定的。而寻道时间,技术基本没有改变,这就造成了寻道时间瓶颈。
三、 Hbase中数据能够保存许多不一样时间戳的版本(即同一数据能够复制许多不一样的版本,准许数据冗余,也是优点)。数据按时间排序,所以Hbase特别适合寻找按照时间排序寻找Top n的场景。找出某我的最近浏览的消息,最近写的N篇博客,N种行为等等,所以Hbase在互联网应用很是多。
四、 Hbase的局限。只能作很简单的Key-value查询。它适合有高速插入,同时又有大量读的操做场景。而这种场景又很极端,并非每个公司都有这种需求。在一些公司,就是普通的OLTP(联机事务处理)随机读写。在这种状况下,Oracle的可靠性,系统的负责程度又比Hbase低一些。并且Hbase局限还在于它只有主键索引,所以在建模的时候就遇到了问题。好比,在一张表中,不少的列我都想作某种条件的查询。但却只能在主键上建快速查询。因此说,不能笼统的说那种技术有优点。
五、 Oracle是行式数据库,而Hbase是列式数据库。列式数据库的优点在于数据分析这种场景。数据分析与传统的OLTP的区别。数据分析,常常是以某个列做为查询条件,返回的结果也常常是某一些列,不是所有的列。在这种状况下,行式数据库反应的性能就很低效。
行式数据库:Oracle为例,数据文件的基本组成单位:块/页。块中数据是按照一行行写入的。这就存在一个问题,当咱们要读一个块中的某些列的时候,不能只读这些列,必须把这个块整个的读入内存中,再把这些列的内容读出来。换句话就是:为了读表中的某些列,必需要把整个表的行所有读完,才能读到这些列。这就是行数据库最糟糕的地方。
列式数据库:是以列做为元素存储的。同一个列的元素会挤在一个块。当要读某些列,只须要把相关的列块读到内存中,这样读的IO量就会少不少。一般,同一个列的数据元素一般格式都是相近的。这就意味着,当数据格式相近的时候,数据就能够作大幅度的压缩。因此,列式数据库在数据压缩方面有很大的优点,压缩不只节省了存储空间,同时也节省了IO。(这一点,可利用在当数据达到百万、千万级别之后,数据查询之间的优化,提升性能,示场景而定)
Hive是创建在Hadoop上的数据仓库基础架构。它提供了一系列的工具,用来进行数据提取、转换、加载,这是一种能够存储、查询和分析存储在Hadoop中的大规模数据机制。能够把Hadoop下结构化数据文件映射为一张成Hive中的表,并提供类sql查询功能,除了不支持更新、索引和事务,sql其它功能都支持。能够将sql语句转换为MapReduce任务进行运行,做为sql到MapReduce的映射器。提供shell、JDBC/ODBC、Thrift、Web等接口。优势:成本低能够经过类sql语句快速实现简单的MapReduce统计。做为一个数据仓库,Hive的数据管理按照使用层次能够从元数据存储、数据存储和数据交换三个方面介绍。
Hive将元数据存储在RDBMS中,有三种方式能够链接到数据库:
·内嵌模式:元数据保持在内嵌数据库的Derby,通常用于单元测试,只容许一个会话链接
·多用户模式:在本地安装Mysql,把元数据放到Mysql内
·远程模式:元数据放置在远程的Mysql数据库
首先,Hive没有专门的数据存储格式,也没有为数据创建索引,用于能够很是自由的组织Hive中的表,只须要在建立表的时候告诉Hive数据中的列分隔符和行分隔符,这就能够解析数据了。
其次,Hive中全部的数据都存储在HDFS中,Hive中包含4中数据模型:Tabel、ExternalTable、Partition、Bucket。
Table:相似与传统数据库中的Table,每个Table在Hive中都有一个相应的目录来存储数据。例如:一个表zz,它在HDFS中的路径为:/wh/zz,其中wh是在hive-site.xml中由${hive.metastore.warehouse.dir}指定的数据仓库的目录,全部的Table数据(不含External Table)都保存在这个目录中。
Partition:相似于传统数据库中划分列的索引。在Hive中,表中的一个Partition对应于表下的一个目录,全部的Partition数据都存储在对应的目录中。例如:zz表中包含ds和city两个Partition,则对应于ds=20140214,city=beijing的HDFS子目录为:/wh/zz/ds=20140214/city=Beijing;
Buckets:对指定列计算的hash,根据hash值切分数据,目的是为了便于并行,每个Buckets对应一个文件。将user列分数至32个Bucket上,首先对user列的值计算hash,好比,对应hash=0的HDFS目录为:/wh/zz/ds=20140214/city=Beijing/part-00000;对应hash=20的,目录为:/wh/zz/ds=20140214/city=Beijing/part-00020。
ExternalTable指向已存在HDFS中的数据,可建立Partition。和Table在元数据组织结构相同,在实际存储上有较大差别。Table建立和数据加载过程,能够用统一语句实现,实际数据被转移到数据仓库目录中,以后对数据的访问将会直接在数据仓库的目录中完成。删除表时,表中的数据和元数据都会删除。ExternalTable只有一个过程,由于加载数据和建立表是同时完成。世界数据是存储在Location后面指定的HDFS路径中的,并不会移动到数据仓库中。
·用户接口:包括客户端、Web界面和数据库接口
·元数据存储:一般是存储在关系数据库中的,如Mysql,Derby等
·Hadoop:用HDFS进行存储,利用MapReduce进行计算。
关键点:Hive将元数据存储在数据库中,如Mysql、Derby中。Hive中的元数据包括表的名字、表的列和分区及其属性、表的属性(是否为外部表)、表数据所在的目录等。
Hive的数据存储在HDFS中,大部分的查询由MapReduce完成。
经过对Hadoop分布式计算平台最核心的分布式文件系统HDFS、MapReduce处理过程,以及数据仓库工具Hive和分布式数据库Hbase的介绍。基本涵盖了Hadoop分布式平台的全部技术核心。从体系架构到数据定义到数据存储再到数据处理,从宏观到微观的系统介绍,为Hadoop平台上大规模的数据存储和任务处理打下基础。
部分参考《Hadoop实战指南》