认知和学习Hadoop,必须得了解Hadoop的构成,其中HDFS和MapReduce是Hadoop的核心组件,它们的产生都是基于Google的思想,Google的GFS(分布式文件系统)带来了我们现在所认识的HDFS。本章还将介绍其他几个不可或缺的Hadoop组件,如Hbase、Hive、ZooKeeper和Pig等。
Hadoop分布式文件系统(Hadoop Distributed File System,HDFS)是Hadoop核心组件之一。支持以流式数据访问模式来存取超大文件,活动在集群之上。
HDFS被设计成适合运行在通用硬件上的分布式文件系统。HDFS有着高容错性的特点,并且设计用来部署在低廉的硬件上。而且它提供高吞吐量来访问应用程序的数据,适合那些有着超大数据集的应用程序。HDFS放宽了POSIX的要求,这样可以实现流的形式访问文件系统中的数据。
HDFS的主要目标就是在存在故障的情况下也能可靠地存储数据。三种最常见的故障是名字节点故障、数据节点故障和网络断开。
一个数据节点周期性发送一个心跳包到名字节点。网络断开会造成一组数据节点子集和名字节点失去联系。名字节点根据缺失的心跳信息判断故障情况。名字节点将这些数据节点标记为死亡状态,不再将新的I/O请求转发到这些数据节点上,这些数据节点上的数据将对HDFS不再可用,可能会导致一些块的复制因子降低到指定的值。
名字节点检查所有需要复制的块,并开始复制它们到其他的数据节点上。重新复制在有些情况下是不可或缺的。从数据节点上取一个文件块有可能是坏块,坏块的出现可能是存储设备错误、网络错误或软件的漏洞。HDFS客户端实现了HDFS文件内容的校验。当一个客户端创建一个HDFS文件时,它会为每一个文件块计算一个校验码并将校验码存储在同一个HDFS命名空间下的一个单独的隐藏文件中。当客户端访问此文件时,它根据对应的校验文件来验证从数据节点接收到的数据。如果校验失败,客户端可以选择从其他拥有该块副本的数据节点获取这个块。HDFS的工作原理如图2-55所示。
图2-55 HDFS的工作流程
HBase是Hadoop Database的简称,是一个高可靠性、高性能、面向列、可伸缩的分布式存储系统,利用HBase技术可在廉价PC Server上搭建起大规模结构化存储集群。Hbase利用Hadoop HDFS作为其文件存储系统,利用Hadoop MapReduce来处理Hbase中的海量数据,利用ZooKeeper作为协调工具。图2-56为Hbase的商标。
图2-56 Hbase的商标
HBase有两个模型,分别是逻辑模型和物理模型。其中,逻辑模型主要是从用户角度考虑的,而物理模型则是从实现HBase的角度来讨论。HBase中的所有数据文件都存储在Hadoop HDFS上,主要包括两种文件类型,分别是Hfile、HLog File。
Hfile是HBase中Key Value数据的存储格式,HFile是Hadoop的二进制格式文件。HFile文件是不定长的,长度固定的只有Trailer和FileInfo。HFile里的每个KeyValue对都是一个简单的byte数组,有固定的结构。开始是两个固定长度的数值,分别表示Key的长度和Value的长度。Key部分有复杂的结构,主要包括RowKey、Family、Qualifier等,在这里不做过多介绍;Value部分没有这么复杂的结构,就是纯粹的二进制数据。
HLog File是HBase中WAL(Write Ahead Log)的存储格式。其实HLog文件就是一个普通的Hadoop Sequence File,Sequence File的Key是HLogKey对象,HLogKey中记录了写入数据的归属信息,除了table和region名字外,同时还包括sequence number和timestamp,timestamp是“写入时间”,sequence number的起始值为0。HLog Sequece File的Value是HBase的Key Value对象,即对应HFile中的Key Value。
MapReduce是Hadoop系统的核心组件,由Google的MapReduce系统经过演变而来,主要解决海量大数据计算,也是众多分布式计算模型中比较流行的一种,可以单独使用,一般配合HDFS一起使用。
MapReduce是一种编程模型,用于大规模数据集(大于1TB)的并行运算。它极大地方便了编程人员在没有掌握分布式并行编程的情况下,将自己的程序运行在分布式系统上。当前的软件实现是指定一个Map(映射)函数,用来把一组键值对映射成一组新的键值对,指定并发的Reduce(归约)函数,用来保证所有映射的每一个键值对共享相同的键组。
MapReduce的思想就是“分而治之”。比方说,1个人送100件货需要5天,而5个人一起送货就只需要1天,把货物分成5个部分同时派送,就能提高效率。Mapper负责“分”,即把复杂的任务分解为若干个“简单的任务”来处理。“简单的任务”包含三层含义:一是数据或计算的规模相对原任务要大大缩小;二是就近计算原则,即任务会分配到存放着所需数据的节点上进行计算;三是这些小任务可以并行计算,彼此间几乎没有依赖关系。Reducer负责对map阶段的结果进行汇总。至于需要多少个Reducer,用户可以根据具体问题,通过在mapred-site.xml配置文件里设置参数mapred.reduce.tasks的值,缺省值为1。
【例2-1】使用MapReduce完成简易的单词去重功能。
Hive是基于Hadoop的一个数据仓库工具,可以将结构化的数据文件映射为一张数据库表,并提供简单的SQL查询功能,可以将SQL语句转换为MapReduce任务运行,Hive在Hadoop之上提供了数据查询功能,主要解决非关系型数据查询问题。Hive定义了简单的类SQL查询语言,称为HQL,它允许熟悉SQL的用户查询数据。Hive学习成本低,可以通过类SQL语句快速实现简单的MapReduce统计,不必开发专门的MapReduce应用,十分适合数据仓库的统计分析。Hive在加载数据过程中不会对数据进行任何的修改,只是将数据移动到HDFS中Hive设定的目录下,因此Hive不支持对数据的改写和添加,所有的数据都是在加载的时候确定的。
Hive并不适合那些需要低延迟的应用,最佳使用场合是大数据集的批处理作业,例如,网络日志分析。Hive的设计很有特点,如支持索引,加快数据查询;有不同的存储类型(如纯文本文件、HBase中的文件);将元数据保存在关系数据库中等。图2-57为Hbase的架构图。
图2-57 Hbase架构图
Hive没有专门的数据格式。
Apache Pig是一个高级过程语言,适合于使用Hadoop和MapReduce平台来查询大型半结构化数据集。通过对分布式数据集进行类似SQL的查询,Pig可以简化Hadoop的使用。
如果业务比较复杂,用MapReduce进行数据分析会是一个很复杂的事情。Pig的出现简化了这一过程,用户只需要专注于数据及业务本身,不用再纠结于数据的格式转换以及MapReduce程序的编写。本质上来说,当你使用Pig进行处理时,Pig本身会在后台生成一系列的MapReduce操作来执行任务,但是这个过程对用户来说是透明的。图2-58为Pig在数据处理环节中的位置。
图2-58 Pig在数据处理环节的位置
Mahout简单来说就是一个提供可扩展的机器学习领域经典的算法库,旨在帮助开发人员更加方便快捷地创建智能应用程序。Mahout包含许多实现,包括聚类、分类、推荐过滤、频繁子项挖掘。通过使用Apache Hadoop库,Mahout可以有效地扩展到Hadoop集群。此外,通过使用Apache Hadoop库,Mahout可以有效地扩展到云中。
ZooKeeper是一种为分布式应用所设计的高可用、高性能且一致的开源协调服务,能使大型系统的分布式进程相互同步,这样所有提出请求的客户端就可以得到一致的数据。它是一个为分布式应用提供一致性服务的软件,提供的功能包括维护配置信息、名字服务、分布式同步、组服务等。这些服务都被应用在分布式应用程序或者其他形式上。
由于ZooKeeper的开源特性,后来开发者在分布式锁的基础上,摸索出了其他的使用方法,如配置维护、组服务、分布式消息队列、分布式通知/协调等。ZooKeeper服务是Hadoop的一个子项目,由一个服务器集群来提供,以避免单点故障。图2-59为ZooKeeper的工作架构。
图2-59 Zookeeper的工作架构
注意 :ZooKeeper性能上的特点决定了它能够被用在大型的、分布式的系统当中。从可靠性方面来说,它并不会因为一个节点的错误而崩溃。除此之外,它严格的序列访问控制意味着复杂的控制原语可以应用在客户端上。ZooKeeper在一致性、可用性、容错性上的保证,也是ZooKeeper的成功之处,它获得的一切成功都与它采用的协议——Zab协议是密不可分的。
Flume是Cloudera提供的一个高可用、高可靠、分布式的海量日志采集、聚合和传输的系统。Flume支持在日志系统中定制各类数据发送方,用于收集数据;同时,Flume具备对数据进行简单处理,并写到各种数据接受方的能力。
当前Flume有两个版本,Flume 0.9X版本的统称Flume-og,Flume1.X版本的统称Flume-ng。由于Flume-ng经过重大重构,与Flume-og有很大不同,使用时请注意区分。
Flume-og采用了多Master的方式。为了保证配置数据的一致性,Flume引入了ZooKeeper用于保存配置数据,ZooKeeper本身可保证配置数据的一致性和高可用性。另外,在配置数据发生变化时,ZooKeeper可以通知Flume Master节点。Flume Master间使用Gossip协议同步数据。
Flume-ng最明显的改动就是取消了集中管理配置的Master和ZooKeeper,变为一个纯粹的传输工具。Flume-ng另一个主要的不同点是读入数据和写出数据现在由不同的工作线程处理(称为Runner)。在Flume-og中,读入线程同样做写出工作,如果写出慢的话,它将阻塞Flume接收数据的能力。这种异步的设计使读入线程可以顺畅地工作而无需关注下游的任何问题。
Sqoop是一个用来将Hadoop和关系型数据库中的数据相互转移的工具,可以将一个关系型数据库(如MySQL、Oracle、Postgres等)中的数据导入Hadoop的HDFS中,也可以将HDFS的数据导入关系型数据库中。Sqoop专为大数据批量传输设计,能够分割数据集并创建Hadoop任务来处理每个区块。
尽管有以上的优点,在使用Sqoop的时候还有一些事情需要注意。
首先,对于默认的并行机制要小心。默认情况下的并行意味着Sqoop假设大数据在分区键范围内是均匀分布的,这在当你的源系统是使用一个序列号发生器来生成主键的时候工作效率是比较高的。比方说,当你有一个10个节点的集群,那么工作负载是在这10台服务器上平均分配的。但是,如果你的分割键是基于字母数字的,例如以“A”作为开头的键值的数量会是以“M”作为开头键值数量的20倍,那么工作负载就会变成从一台服务器倾斜到另一台服务器上。
如果担心性能,那么可以考虑直接加载。直接加载绕过通常的Java数据库连接导入,使用数据库本身提供的直接载入工具,比如MySQL的mysqldump。但是有特定数据库的限制。比如不能使用MySQL或者PostgreSQL的连接器来导入BLOB和CLOB类型。也没有驱动支持从视图的导入。
Ambari是Hortonworks开源的Hadoop平台的管理软件,具备Hadoop组件的安装、管理、运维等基本功能,提供Web UI进行可视化的集群管理,降低了大数据平台的安装、使用难度。
Ambari通过HDP将Hadoop的组件进行集成,通过栈的形式提供Service的组合使用,它主要解决的问题如下。
1)简化了部署过程。在HDP栈中支持的Service只需要图形化的安装即可,可以方便地指定Master所在的节点,使集群快速运行起来。
2)通过Ambari Metrics实现集群状态的监控,并通过集成Grafana进行数据的展示(CPU、内存、负载等)。
3)Service的高级配置。集群部署之后,可以方便地通过dashboard进行参数的修改(如HDFS的core-site等)。
4)快速链接。Ambari提供快速导向Hadoop组件原生管理界面的链接。
5)节点的扩展。
6)可定制的Alert功能。Ambari的报警信息可以自定义,使得用户可以根据自己的需要,设置哪些情况下需要报警,哪些不需要。
7)增值功能。如HDFS的Rebalance DataNode、NameNode的HA等。
8)Ambari自身的用户管理,基于RBAC赋予用户对Hadoop集群的管理权限。
Ambari并没有对Hadoop组件进行过多的功能集成,如日志分析等,只是提供了安装、配置、启停等功能,尽量保持了跟原生Hadoop组件的隔离性,对于该组件的具体操作,通过Quick Links直接导向原生的管理界面(如HBase Master UI),它的做法保持了对于Hadoop组件的低侵入性。