Hadoop构建数据仓库与实战分析(txt+pdf+epub+mobi电子书下载)


发布时间:2021-08-02 14:23:06

点击下载

作者:小牛学堂

出版社:电子工业出版社

格式: AZW3, DOCX, EPUB, MOBI, PDF, TXT

Hadoop构建数据仓库与实战分析

Hadoop构建数据仓库与实战分析试读:

前言

Hadoop是一个由Apache基金会开发的分布式计算平台。用户可以在不了解分布式底层细节的情况下开发分布式程序,充分利用集群的优势实现高速运算和存储。

Hadoop实现了一个分布式文件系统(Hadoop Distributed File System,HDFS)。HDFS具有高容错性的特点,可以用来设计、部署在价格低廉的硬件上,同时它可提供高吞吐量来访问应用程序中的数据,适合有超大数据集的应用程序。HDFS放宽了可移植操作系统接口(Portable Operating System Interface of Unix,POSIX)的要求,可以用流的形式访问文件系统中的数据。

本书从Hadoop背景、特性、安装等开始,逐步讲解其配置、解决方案、元数据解析等内容。第1、2章对Hadoop的历史、功能与应用、体系结构等方面进行简要介绍,并且详细地介绍在Linux、Windows等多个操作系统环境下安装与配置Hadoop集群的步骤,便于读者借鉴。从第3章开始,依次讲解HDFS HA及解决方案、HDFS元数据解析、Hadoop的元数据备份方案、Hadoop的BackupNode方案等,主要结合具体实例,使读者对Hadoop有一定了解。从第7章开始,进一步讲解MapReduce及YARN的相关知识,包括MapReduce设计理念与基本架构、MapReduce编程模型、YARN设计理念与基本架构、YARN基础库等。

本书结合实例对Hadoop进行讲解,从Hadoop基础知识着手,引导读者了解及搭建基本环境,由浅入深地引导读者开展Hadoop的相关学习。本书结合实例,给出详细的代码,实例代码演示中所涉及的环境在相关章节中有多处说明,读者可根据自身实际情况进行参考。

由于写作仓促且作者水平有限,本书难免存在不足,恳请各位专家、学者、读者批评指正。作 者2019年4月第1章Hadoop简介1.1 Hadoop相关介绍1.1.1 Hadoop概述

Hadoop是Apache基金会旗下的一个开源分布式计算平台。以Hadoop分布式文件系统(Hadoop Distributed File System,HDFS)和MapReduce(Google MapReduce的开源实现)为核心的Hadoop为用户提供了系统底层细节透明的分布式系统基础架构。HDFS的高容错性、高伸缩性等优点允许用户将Hadoop部署在价格低廉的硬件上,形成分布式系统;MapReduce分布式编程模型允许用户在不了解分布式系统底层细节的情况下开发并行应用程序。因此,用户可以利用Hadoop轻松地组织计算机资源,从而搭建自己的分布式计算平台,并且可以充分利用集群的计算和存储能力,完成对海量数据的处理。经过业界和学术界长达10年的锤炼,目前的Hadoop已经趋于完善,在实际的数据处理和分析任务中担任着不可替代的角色。1.1.2 Hadoop的历史

Hadoop的源头是Apache Nutch,该项目始于2002年,是Apache Lucene的子项目之一。2004年,Google在“操作系统设计与实现”(Operating System Design and Implementation,OSDI)会议上公开发表了题为MapReduce : Simplified Data Processing on Large Clusters(《MapReduce:简化大规模集群上的数据处理》)的论文之后,Doug Cutting等人受到启发,开始尝试实现MapReduce计算框架,并将它与NDFS(Nutch Distributed File System)结合,用以支持Nutch引擎的主要算法。由于NDFS和MapReduce在Nutch引擎中有着良好的应用,所以它们于2006年2月被分离出来,成为一套完整而独立的软件,并命名为Hadoop。到2008年年初,Hadoop已成为Apache的顶级项目,包含众多子项目,它被包括Yahoo在内的很多互联网公司采用。现在的Hadoop 1.0.1包含HDFS、MapReduce子项目,且与Pig、ZooKeeper、Hive、HBase等项目相关。1.1.3 Hadoop的功能与作用

我们为什么需要Hadoop呢?众所周知,现代社会的信息增长速度很快,这些信息积累了大量数据,包括个人数据和工业数据。预计到2020年,每年产生的数字信息中将会有超过1/3的内容驻留在云平台中或借助云平台处理。我们需要对这些数据进行分析处理,以获取更多有价值的信息。那么如何高效地存储管理这些数据、如何分析这些数据呢?这时可以选用Hadoop系统。在处理这类问题时,它采用分布式存储方式来提高读/写速度和扩大存储容量;采用MapReduce整合分布式文件系统中的数据,保证高速地分析处理数据;与此同时,还采用存储冗余数据的方式来保证数据的安全性。

Hadoop中的HDFS具有高容错性,并且是基于Java语言开发的,这使得Hadoop可以部署在价格低廉的计算机集群中,同时不限于某个操作系统。HDFS的数据管理能力、MapReduce处理任务时的高效率及它的开源特性,使Hadoop在同类分布式系统中大放异彩,并在众多行业和科研领域中被广泛应用。1.1.4 Hadoop的优势

Hadoop是一个能够让用户轻松构建和使用的分布式计算平台。用户可以轻松地在Hadoop上开发、运行需要处理海量数据的应用程序。它主要有以下几个优点。(1)高可靠性。Hadoop按位存储和处理数据的能力值得信赖。(2)高扩展性。Hadoop通过在可用的计算机集簇间分配数据来完成计算任务,这些集簇可以方便地扩展到数以千计的节点中。(3)高效性。Hadoop能够在节点之间动态地移动数据,以保证各个节点的动态平衡,因此其处理速度非常快。(4)高容错性。Hadoop能够自动保存数据的多份副本,并且能够自动将失败的任务重新分配。1.1.5 Hadoop的应用现状与趋势

由于Hadoop优势突出,因此基于Hadoop的应用已经遍地开花,尤其是在互联网领域。Yahoo通过集群运行Hadoop,用以支持广告系统和Web搜索的研究;Facebook借助集群运行Hadoop,来支持数据分析和机器学习;百度搜索引擎则使用Hadoop进行搜索日志分析和网页数据挖掘工作;淘宝的Hadoop系统用于存储并处理电子商务交易的相关数据;中国移动研究院基于Hadoop的“大云”(BigCloud)系统对数据进行分析并对外提供服务。

2008年2月,作为Hadoop最大贡献者的Yahoo构建了当时最大规模的Hadoop应用。它们在2000个节点上使用了超过一万个Hadoop虚拟机器来处理超过5PB的网页内容,分析大约一百万个网络连接之间的网页索引资料。这些网页索引资料压缩后超过300TB。Yahoo基于这些为用户提供了高质量的搜索服务。

Hadoop目前已经取得了非常突出的成绩。随着互联网的发展,新的业务模式还将不断涌现,Hadoop的应用也会从互联网领域向电信、电子商务、银行、生物制药等领域拓展。相信在未来,Hadoop将会在更多的领域中扮演幕后英雄,为我们提供更加快捷、优质的服务。1.2 Hadoop的项目

现在Hadoop已经发展成为包含很多项目的集合。虽然其核心内容是MapReduce和HDFS,但与Hadoop相关的Common、Avro、Chukwa、Hive、HBase等项目也是不可或缺的。它们提供了互补性服务或在核心层上提供了更高层的服务。图1-1所示为Hadoop的项目结构图。图1-1 Hadoop的项目结构图

下面将对Hadoop的各个关联项目进行详细介绍。(1)Common:Common是为Hadoop其他子项目提供支持的常用工具,它主要包括FileSystem、RPC和串行化库。它们为在廉价硬件上搭建云计算环境提供基础的服务,并且会为运行在该平台上的软件开发提供所需的API。(2)Avro:Avro是用于数据序列化的系统。它提供了丰富的数据结构类型、快速可压缩的二进制数据格式、存储持久性数据的文件集,具有远程调用RPC的功能和简单的动态语言集成功能。其中代码生成器既不需要读/写文件数据,又不需要使用或实现RPC协议。Avro系统依赖于模式,数据的读和写是在模式之下完成的。这样可以减少写入数据的开销,提高序列化的速度并缩减其大小;同时,也可以方便动态脚本语言的使用,因为数据连同其模式都是自描述的。在RPC中,Avro系统的客户端和服务端通过握手协议进行模式的交换,因此当客户端和服务端拥有彼此全部的模式时,不同模式下相同命名字段、丢失字段和附加字段等信息的一致性问题就得到了很好的解决。(3)MapReduce:MapReduce是一种编程模型,用于大规模数据集(大于 1TB)的并行运算。映射(Map)、化简(Reduce)的概念和它们的主要思想都是从函数式编程语言中借鉴而来的。它极大地方便了编程人员,使他们即使在不了解分布式并行编程的情况下,也可以将自己的程序运行在分布式系统上。MapReduce在执行时先指定一个Map函数,把输入key/value对映射成一组新的key/value对,经过一定处理后交给Reduce,Reduce对相同key下的所有value进行处理后再输出key/value对,作为最终的结果。

图1-2所示为MapReduce的任务处理流程图,它展示了MapReduce程序将输入划分到不同的Map上,再将Map的结果合并到Reduce中,然后进行处理的输出过程。图1-2 MapReduce的任务处理流程图(4)HDFS:HDFS是一个分布式文件系统。因为HDFS具有高容错性的特点,所以它可以设计部署在价格低廉的硬件上。它可以提供高吞吐量(high throughput)来访问应用程序的数据,适用于有着超大数据集的应用程序。HDFS放宽了对可移植操作系统接口(POSIX,Portable Operating System Interface)的要求,这样可以以流的形式访问文件系统中的数据。HDFS原本是开源的Apache项目Nutch的基础结构,最后却成为Hadoop的基础架构之一。以下是HDFS的设计目标。

① 检测和快速恢复硬件故障。硬件故障是计算机常见的问题。整个HDFS由数百甚至数千个存储着数据文件的服务器组成。而如此多的服务器则意味着高故障率,因此,故障的检测和快速恢复是HDFS的一个核心目标。

② 流式的数据访问。HDFS使应用程序流式地访问它们的数据集。HDFS被设计为适合进行批量处理,而不适合用户交互式处理。所以它重视数据吞吐量,而不是数据访问的反应速度。

③ 简化一致性模型。大部分HDFS程序对文件的操作需要一次写入,多次读取。一个文件一旦经过创建、写入、关闭,就不需要修改了。这个假设简化了数据一致性问题和高吞吐量的数据访问问题。

④ 通信协议。所有的通信协议都是在TCP/IP协议之上的。在一个客户端和明确配置了端口的名字节点(NameNode)建立连接之后,它和名字节点的协议便是客户端协议(Client Protocal)。数据节点(DataNode)和名字节点之间则用数据节点协议(Data Node Protocal)。(5)Chukwa:Chukwa是开源的数据收集系统,用于监控和分析大型分布式系统的数据。Chukwa是在Hadoop的HDFS和MapReduce框架之上搭建的,它继承了Hadoop的可扩展性和健壮性。Chukwa通过HDFS来存储数据,并依赖MapReduce任务处理数据。Chukwa也附带了灵活且强大的工具,用于显示、监视和分析数据结果,以便更好地使用所收集的数据。(6)Hive:Hive最早是由Facebook设计的,是一个建立在Hadoop基础之上的数据仓库,它提供了一些用于对Hadoop文件中的数据集进行数据整理、特殊查询和分析存储的工具。Hive提供的是一种结构化数据的机制,它支持类似于传统RDBMS中的SQL的查询语言,来帮助那些熟悉SQL的用户查询Hadoop中的数据,该查询语言称为HiveQL。与此同时,传统的MapReduce编程人员也可以在Mapper或Reducer中通过HiveQL来查询数据。Hive编译器会把HiveQL编译成一组MapReduce任务,从而方便MapReduce编程人员进行Hadoop系统开发。(7)HBase:HBase是一个分布式的、面向列的开源数据库,该技术来源于Google论文《Bigtable:一个结构化数据的分布式存储系统》。如同Bigtable利用了Google文件系统(Google File System)提供的分布式数据存储方式一样,HBase在Hadoop的基础上具有类似于Bigtable的能力。HBase不同于一般的关系数据库,原因有两个:其一,HBase是一个适合非结构化数据存储的数据库;其二,HBase是基于列而不是基于行的模式。HBase和Bigtable使用相同的数据模型。用户将数据存储在一个表中,一个数据行拥有一个可选择的键和任意数量的列。由于HBase表是疏松的,因此用户可以为行定义各种不同的列。HBase主要用于需要随机访问、实时读/写的大数据。(8)Pig:Pig是一个对大型数据集进行分析、评估的平台。Pig最突出的优势是它的结构能够经受住高度并行化的检验,这个特性使得它能够处理大型的数据集。目前,Pig的底层由一个编译器组成,它在运行时会产生一些MapReduce程序序列。Pig的语言层由一种称为PigLatin的正文型语言组成。(9)ZooKeeper:ZooKeeper是一个为分布式应用所设计的开源协调服务。它主要为用户提供同步、配置管理、分组和命名等服务,减轻分布式应用程序所承担的协调任务。ZooKeeper的文件系统使用了我们所熟悉的目录树结构。ZooKeeper是使用Java编写的,可支持Java和C这两种编程语言。1.3 Hadoop的体系结构

HDFS和MapReduce是Hadoop的两大核心。而整个Hadoop的体系结构主要是通过HDFS来实现分布式存储的底层支持的,并且它会通过MapReduce来实现分布式并行任务处理的程序支持。

HDFS(如图1-3所示)采用了主从(Master/Slave)结构模型,一个HDFS是由一个NameNode和若干DataNode组成的。其中NameNode作为主服务器,管理文件系统的命名空间(Namespace)和客户端(Client)对文件的访问操作;集群中的DataNode管理存储的数据。HDFS允许用户以文件的形式存储数据。从内部来看,文件被分成若干数据块(Block),而且这些数据块存放在一组DataNode上。NameNode执行文件系统的命名空间操作,比如打开、关闭、重命名文件或目录等,它也负责数据块到具体DataNode的映射。DataNode负责处理文件系统客户端的文件读/写请求,并在NameNode的统一调度下进行数据块的创建、删除和复制工作。图1-3 HDFS体系结构图

NameNode和DataNode都可以在普通商用计算机上运行。这些计算机中通常运行的是GNU/Linux操作系统。HDFS采用Java语言开发,因此任何支持Java的机器都可以部署NameNode和DataNode。一个典型的部署场景是,集群中的一台机器运行一个NameNode实例,其他机器分别运行一个DataNode实例。当然,并不排除一台机器运行多个DataNode实例的情况。集群中单一NameNode的设计大大简化了系统的架构。NameNode是所有HDFS元数据的管理者。用户需要保存的数据不会经过NameNode,而是直接流向存储数据的DataNode。

MapReduce是一种并行编程模式,利用这种模式,软件开发者可以轻松地编写分布式并行程序。在Hadoop的体系结构中,MapReduce是一个简单易用的软件框架,基于它可以将任务分发到由上千台商用机器组成的集群上,并以一种可靠容错的方式并行处理大量的数据集,实现Hadoop的并行任务处理功能。MapReduce框架是由一个单独运行在主节点上的JobTracker和运行在每个集群从节点上的TaskTracker共同组成的。主节点负责调度构成一个作业的所有任务,这些任务分布在不同的从节点上。主节点监控它们的执行情况,并且重新执行之前失败的任务。从节点仅负责执行由主节点指派的任务。当一个Job被提交时,JobTracker接收到提交作业和其配置信息之后,就会将配置信息等分发给从节点,同时调度任务并监控TaskTracker的执行。

HDFS和MapReduce共同组成了Hadoop分布式系统体系结构的核心。HDFS在集群上实现了分布式文件系统,MapReduce在集群上实现了分布式计算和任务处理。HDFS在MapReduce任务处理过程中提供了对文件操作和存储等的支持,MapReduce在HDFS的基础上完成了任务的分发、跟踪、执行等工作,并收集结果,二者相互作用,完成了Hadoop分布式集群的主要任务。1.4 Hadoop与分布式开发

通常所说的分布式系统其实是分布式软件系统,即支持分布式处理的软件系统。它是在通信网络互联的多处理机体系结构上执行任务的系统,包括分布式操作系统、分布式程序设计语言及其编译(解释)系统、分布式文件系统和分布式数据库系统等。Hadoop是分布式软件系统中文件系统的软件,它实现了分布式文件系统和部分分布式数据库系统的功能。Hadoop中的分布式文件系统HDFS能够实现数据在计算机集群组成的云上的高效存储和管理,Hadoop中的并行编程框架MapReduce能够使用户编写的Hadoop并行应用程序的运行得以简化。

Hadoop上并行应用程序的开发是基于MapReduce编程模型的。MapReduce编程模型的原理是:利用一个输入的key/value对集合来产生一个输出的key/value对集合。MapReduce库的用户用两个函数来表达这个计算:Map和Reduce。

用户自定义的Map函数接收一个输入的key/value对,然后产生一个中间key/value对的集合。MapReduce把所有具有相同key值的value集合在一起,然后传递给Reduce函数。

用户自定义的Reduce函数接收key和相关的value集合,Reduce函数合并这些value值,形成一个较小的value集合。一般来说,每次调用Reduce函数只产生0或1个输出的value值。通常通过一个迭代器把中间value值提供给Reduce函数,这样就可以处理无法全部放入内存中的大量的value值集合了。

图1-4所示为MapReduce的数据流图,体现了MapReduce处理大数据集的过程。简而言之,这个过程就是将大数据集分解为成百上千个小数据集,每个(或若干)数据集分别由集群中的一个节点(一般就是一台普通的计算机)进行处理并生成中间结果,然后这些中间结果又通过大量的节点合并,形成最终结果。图1-4也说明了MapReduce框架下并行程序中的两个主要函数:Map和Reduce。在这个结构中,用户需要完成的工作是根据任务编写Map和Reduce函数。图1-4 MapReduce的数据流图

MapReduce编程模型非常适合在由大量计算机组成的大规模集群上并行运行。图1-4中的每个Map任务和每个Reduce任务均可以同时运行于一个单独的计算节点上,可想而知,其运算效率是很高的,那么这样的并行计算是如何做到的呢?下面将简单介绍其原理。

1.数据分布存储

Hadoop 分布式文件系统(HDFS)由一个名字节点(NameNode)和多个数据节点(DataNode)组成,每个节点都是一台普通的计算机。在使用方式上,HDFS与我们熟悉的单机文件系统非常类似,利用它可以创建目录,创建、复制、删除文件,并且可以查看文件内容等。但文件在HDFS底层被切割成了数据块,这些数据块分散地存储在不同的DataNode上,每个数据块还可以复制数份数据存储在不同的DataNode上,达到容错容灾的目的。NameNode则是整个HDFS的核心,它通过维护一些数据结构来记录每个文件被切割成了多少个数据块、这些数据块可以从哪些DataNode中获得,以及各个DataNode的状态等重要信息。

2.分布式并行计算

Hadoop中有一个作为主控的JobTracker,用于调度和管理其他TaskTracker。JobTracker可以运行于集群中的任意一台计算机上;TaskTracker则负责执行任务,它必须运行于DataNode上,也就是说DataNode既是数据存储节点,又是计算节点。JobTracker将Map任务和Reduce任务分发给空闲的TaskTracker,让这些任务并行运行,并负责监控任务的运行情况。如果某一个TaskTracker出了故障,JobTracker会将其负责的任务转交给另一个空闲的TaskTracker重新执行。

3.本地计算

数据存储在哪台计算机上,就由哪台计算机进行这部分数据的计算,这样可以减少数据在网络上的传输量,降低对网络带宽的需求。在Hadoop这类基于集群的分布式并行系统中,计算节点可以很方便地扩充,因此它所能够提供的计算能力近乎无限。但是数据需要在不同的计算机之间流动,故而网络带宽变成了瓶颈。“本地计算”是一种最有效的节约网络带宽的手段,业界将此形容为“移动计算比移动数据更经济”。

4.任务粒度

在把原始大数据集切割成小数据集时,通常让小数据集小于或等于HDFS中一个数据块的大小(默认是64MB),这样能够保证一个小数据集是位于一台计算机上的,便于本地计算。假设有M个小数据集待处理,就启动M个Map任务。注意这M个Map任务分布于N台计算机上,它们将并行运行,Reduce任务的数量R则可由用户指定。

5.数据分割(Partition)

把Map任务输出的中间结果按key的范围划分成R份(R是预先定义的Reduce任务的个数),划分时通常使用Hash函数(如Hash(key)mod R),这样可以保证某一段范围内的key一定是由一个Reduce任务来处理的,可以简化Reduce的过程。

6.数据合并(Combine)

在数据分割之前,还可以先对中间结果进行数据合并,即将中间结果中有相同key的对合并成一对。Combine的过程与Reduce的过程类似,在很多情况下可以直接使用Reduce函数,但Combine是作为Map任务的一部分,在执行完Map函数后紧接着执行的。Combine能够减少中间结果中对的数目,从而降低网络流量。

7.Reduce

Map任务的中间结果在执行完Combine和Partition之后,以文件形式存储于本地磁盘中。中间结果文件的位置会通知主控JobTracker,JobTracker再通知Reduce任务到哪个TaskTracker上取中间结果。注意,所有的Map任务产生的中间结果均按其key值通过同一个Hash函数划分成了R份,R个Reduce任务各自负责一段key区间。每个Reduce需要从许多Map任务节点中取得落在其负责的key区间内的中间结果,然后执行Reduce函数,形成一个最终的结果文件。

8.任务管道

有R个Reduce任务,就会有R个最终结果。很多情况下,这R个最终结果并不需要合并成一个最终结果,因为这R个最终结果又可以作为另一个计算任务的输入,开始另一个并行计算任务,这就形成了任务管道。1.5 Hadoop计算模型

MapReduce是Google公司的核心计算模型,它将运行于大规模集群上的复杂的并行计算过程高度地抽象为两个函数:Map和Reduce。Hadoop中的MapReduce是一个简易的软件框架,基于它写出来的应用程序能够运行在由上千台商用机器组成的大型集群上,并以一种可靠容错的方式并行处理TB级别的数据集,实现了Hadoop在集群上的数据和任务的并行计算与处理。

一个Map/Reduce作业(Job)通常会把输入的数据集切分为若干独立的数据块,由Map任务(Task)以完全并行的方式处理它们。框架会先对Map的输出进行排序,然后把结果输入给Reduce任务。通常作业的输入和输出都会被存储在文件系统中。整个框架负责任务的调度和监控,以及重新执行已经失败的任务。

通常,Map/Reduce框架和分布式文件系统是运行在一组相同的节点上的,也就是说,计算节点和存储节点在一起。这种配置允许框架在那些已经存好数据的节点上高效地调度任务,这样可以使整个集群的网络带宽得到非常高效的利用。

Map/Reduce框架由一个单独的Master JobTracker和集群节点上的Slave TaskTracker共同组成。Master负责调度构成一个作业的所有任务,这些任务分布在不同的Slave上。Master监控它们的执行情况,并重新执行已经失败的任务,而Slave仅负责执行由Master指派的任务。

在Hadoop上运行的作业需要指明程序的输入/输出位置(路径),并通过实现合适的接口或抽象类来提供Map和Reduce函数;同时还需要指定作业的其他参数,构成作业配置(JobConfiguration)。在Hadoop的JobClient提交作业(JAR包、可执行程序等)和配置信息给JobTracker之后,JobTracker会负责分发这些作业和配置信息给Slave及调度任务,并监控它们的执行,同时提供状态和诊断信息给JobClient。1.6 Hadoop的数据管理

Hadoop的数据管理主要涉及Hadoop的分布式文件系统HDFS、分布式数据库HBase和数据仓库工具Hive。1.6.1 HDFS的数据管理

HDFS是分布式计算的存储基石,Hadoop分布式文件系统和其他分布式文件系统有很多类似的特性:(1)对于整个集群有单一的命名空间;(2)具有数据一致性,适合一次写入、多次读取的模型,客户端在文件没有被成功创建时是无法看到文件存在的;(3)文件会被分割成多个数据块,每个数据块被分配存储到数据节点上,而且会根据配置由复制数据块来保证数据的安全性。

通过前面的介绍和图1-3可以看出,HDFS通过三个重要的角色来进行文件系统的管理:NameNode、DataNode和Client。NameNode可以视为分布式文件系统中的管理者,主要负责管理文件系统的命名空间、集群配置信息和存储块的复制等。NameNode 会将文件系统的Metadata存储在内存中,这些信息主要包括文件信息、每个文件对应的数据块的信息和每个数据块在DataNode中的信息等。DataNode是文件存储的基本单元,它将数据块存储在本地文件系统中,保存了所有数据块的Metadata,同时周期性地将所有存在的数据块信息发送给NameNode。

1.文件写入(1)Client向NameNode发起文件写入的请求。(2)NameNode根据文件大小和数据块的配置情况,Client将所管理的DataNode的信息返回。(3)Client将文件划分为多个数据块,根据DataNode的地址信息,按顺序将其写入每个数据块中。

2.文件读取(1)Client向NameNode发起文件读取的请求。(2)NameNode返回文件存储的DataNode信息。(3)Client读取文件信息。

3.数据块(Block)复制(1)NameNode发现部分文件的Block不符合最小复制数这一要求或部分DataNode失效。(2)通知DataNode相互复制Block。(3)DataNode开始直接相互复制。

作为分布式文件系统,HDFS在数据管理方面还有值得借鉴的几个功能。

Block的放置:一个Block有三份备份,一份放在NameNode指定的DataNode上,另一份放在与指定DataNode不在同一台机器上的DataNode上,最后一份放在与指定DataNode有同一Rack的DataNode上。备份的目的是数据安全,采用这种配置方式主要是考虑同一Rack失败的情况,以及不同Rack之间进行数据复制所带来的性能问题。

心跳检测:用心跳检测DataNode的健康状况,如果发现问题,就采取数据备份的方式来保证数据的安全性。

数据复制(场景为DataNode失败、需要平衡DataNode的存储利用率和平衡DataNode数据交互压力等情况):使用Hadoop时,可以用HDFS的balancer命令配置Threshold来平衡每个DataNode的磁盘利用率。假设设置了Threshold为10%,那么在执行balancer命令时,首先会统计所有DataNode的磁盘利用率的平均值,然后判断,如果某个DataNode的磁盘利用率超过这个平均值,那么将会把这个DataNode的Block转移到磁盘利用率低的DataNode上,这对于新节点的加入十分有用。

数据校验:采用CRC32做数据校验。在写入Block时,除会写入数据外,还会写入校验信息,在读取时则需要先校验后读入。

单个NameNode:如果单个NameNode失败,任务处理信息将会记录在本地文件系统和远端的文件系统中。

数据管道性的写入:当客户端要写入文件到DataNode上时,首先会读取一个Block,然后将其写到第一个DataNode上,接着由第一个DataNode将其传递到备份的DataNode上,直到所有需要写入这个Block的DataNode都成功写入,客户端才会开始写下一个Block。

安全模式:分布式文件系统启动时会进入安全模式(系统运行期间也可以通过命令进入安全模式),当分布式文件系统处于安全模式时,文件系统中的内容不允许修改也不允许删除,直到安全模式结束。安全模式主要用于在系统启动时检查各个DataNode上Block的有效性,同时根据策略对部分Block进行必要的复制或删除。在实际操作过程中,如果在系统启动时修改和删除文件,会出现安全模式不允许修改的错误提示,只需要等待片刻即可。1.6.2 HBase的数据管理

HBase是一个类似于Bigtable的分布式数据库。它的大部分特性和Bigtable一样,是一个稀疏的、长期存储的(存在硬盘上)、多维度的排序映射表。这张表的索引是行关键字、列关键字和时间戳。表中的每个值是一个纯字符数组,数据都是字符串,没有类型。用户在表格中存储数据,每行都有一个可排序的主键和任意数量的列。由于是稀疏存储的,所以同一张表中的每行数据都可以有截然不同的列。列名字的格式是“:

HBase把同一个family集合中的数据存储在同一个目录下,而HBase的写操作是锁行的,每行都是一个原子元素,都可以加锁。所有数据库的更新都有一个时间戳标记,每次更新都会生成一个新的版本,而HBase会保留一定数量的版本,这个值是可以设定的。客户端可以选择获取距离某个时间点最近的版本,或者一次获取所有版本。HBase 在分布式集群上主要依靠由HRegion、HMaster、HClient组成的体系结构,从整体上管理数据。HBase体系结构有三个重要组成部分。(1)HBaseMaster:HBase主服务器,与Bigtable的主服务器类似。(2)HRegionServer:HBase域服务器,与Bigtable的Tablet服务器类似。(3)HBaseClient:HBase客户端是由org.apache.hadoop.HBase.client.HTable定义的。

1.HBase主服务器

一个HBase只部署一台主服务器,它通过领导选举算法(Leader Election Algorithm)确保只有唯一的主服务器是活跃的。ZooKeeper保存主服务器的服务器地址信息。如果主服务器瘫痪,那么可以通过领导选举算法从备用服务器中选择新的主服务器。

主服务器承担着初始化集群的任务。当主服务器第一次启动时,会试图从HDFS中获取根或根域目录。如果获取失败,那么创建根或根域目录,以及第一个元域目录。在下次启动时,主服务器就可以获取集群和集群中所有域的信息了。同时,主服务器还负责集群中域的分配、域服务器运行状态的监视、表格的管理等工作。

2.HBase域服务器

HBase域服务器的主要职责是服务于主服务器分配的域、处理客户端的读/写请求、本地缓冲区回写、本地数据压缩和分割域等。

每个域只能由一台域服务器来提供服务。当它开始服务于某域时,它会从HDFS文件系统中读取该域的日志和所有存储文件,同时还会管理操作HDFS文件的持久性存储工作。客户端通过与主服务器通信,来获取域和域所在域服务器的列表信息后,就可以直接向域服务器发送域读/写请求,来完成操作了。

3.HBase客户端

HBase客户端负责查找用户域所在的域服务器地址。HBase客户端会与HBase主服务器交换消息以查找根域的位置,这是两者之间唯一的交流。

定位根域后,客户端连接根域所在的域服务器,并扫描根域获取元域信息。元域信息包含所需用户域的域服务器地址。客户端再连接元域所在的域服务器,扫描元域以获取所需用户域所在的域服务器地址。定位用户域后,客户端连接用户域所在的域服务器并发出读/写请求。用户域的地址将在客户端被缓存,后续的请求无须重复上述过程。

综上所述,在HBase的体系结构中,HBase主要由主服务器、域服务器和客户端三部分组成。主服务器作为HBase的中心,管理整个集群中的所有域,监控每台域服务器的运行情况;域服务器接收来自主服务器的分配域,处理客户端的域读/写请求并回写映射文件等;客户端主要用来查找用户域所在的域服务器地址信息。1.6.3 Hive的数据管理

Hive是建立在Hadoop上的数据仓库基础构架。它提供了一系列工具,用来进行数据提取、转化、加载,这是一种可以存储、查询和分析存储在Hadoop中的大规模数据的机制。Hive定义了简单的类SQL的查询语言,称为HiveQL,它允许熟悉SQL的用户用SQL语句查询数据。作为一个数据仓库,Hive的数据管理按照使用层次,可以从元数据存储、数据存储和数据交换三方面来介绍。(1)元数据存储。Hive将元数据存储在RDBMS中,通过三种模式可以连接数据库。

①Single User Mode:此模式连接一个In-memory的数据库Derby,一般用于UnitTest。

②Multi User Mode:通过网络连接一个数据库,这是最常用的模式。

③Remote Server Mode:用于非Java客户端访问元数据库,在服务器端启动一个MetaStoreServer,客户端利用Thrift协议通过MetaStoreServer来访问元数据库。(2)数据存储。首先,Hive没有专门的数据存储格式,也没有为数据建立索引,用户可以非常自由地组织Hive中的表,只需在创建表时告诉Hive数据中的列分隔符和行分隔符,就可以解析数据了。其次,Hive中的所有数据都存储在HDFS中。Hive包含4种数据模型:Table、ExternalTable、Partition和Bucket。Hive中的Table和数据库中的Table在概念上是类似的,每个Table在Hive中都有一个相应的目录来存储数据。例如,一个表pvs,它在HDFS中的路径为/wh/pvs,其中,wh是在hive-site.xml中由${hive.metastore.warehouse.dir}指定的数据仓库的目录。所有Table数据(不包括ExternalTable)都保存在这个目录中。(3)数据交换。数据交换主要分为以下几部分,如图1-5所示。

①用户接口:包括客户端、Web界面和数据库接口。

②元数据存储:通常存储在关系数据库中,如MySQL、Derby等。

③解释器、编译器、优化器、执行器。

④Hadoop:利用HDFS进行存储,利用MapReduce进行计算。

用户接口主要有三个:客户端、Web界面和数据库接口,其中最常用的是客户端。Client是Hive的客户端。当启动Client模式时,用户会想要连接HiveServer。这时需要指出HiveServer所在的节点,并且在该节点启动HiveServer。Web界面是通过浏览器访问Hive的。图1-5 Hive数据交换

Hive将元数据存储在数据库中,如MySQL、Derby中。Hive中的元数据包括表的名字、表的列、表的分区、表分区的属性、表的属性(是否为外部表等)、表的数据所在目录等。

解释器、编译器、优化器等完成HiveQL查询语句从词法分析、语法分析、编译、优化到查询计划的生成。生成的查询计划存储在HDFS中,并且随后由MapReduce调用执行。

Hive的数据存储在HDFS中,大部分查询由MapReduce完成(包含*的查询不会生成MapRedcue任务,如select*fromtbl)。

以上从Hadoop的分布式文件系统HDFS、分布式数据库HBase和数据仓库工具Hive入手,介绍了Hadoop的数据管理,它们都通过自己的数据定义、体系结构实现了数据从宏观到微观的立体化管理,完成了Hadoop平台上大规模的数据存储和任务处理。1.7 Hadoop集群安全策略

Hadoop的优势在于其能够将廉价的普通PC组织成能高效、稳定处理事务的大型集群,企业正是利用这一特点来构架Hadoop集群、获取海量数据的高效处理能力的。但是,Hadoop集群搭建起来后,如何保证它安全稳定地运行呢?旧版本的Hadoop中没有完善的安全策略,导致Hadoop集群面临很多风险,例如,用户可以以任何身份访问HDFS或MapReduce集群,可以在Hadoop集群上运行自己的代码来冒充Hadoop集群的服务,任何未被授权的用户都可以访问DataNode节点的数据块等。经过Hadoop安全小组的努力,在Hadoop 1.0.0版本中已经加入安全机制和授权机制(Simple和Kerberos),使Hadoop集群更加安全和稳定。下面从用户权限管理、HDFS安全策略和MapReduce安全策略三个方面简要介绍Hadoop的集群安全策略。有关安全方面的基础知识(如Kerberos认证等),读者可自行查阅相关资料。

1.用户权限管理

Hadoop的用户权限管理主要涉及用户分组管理,为更高层的HDFS访问、服务访问、Job提交和配置Job等操作提供认证和控制基础。

Hadoop的用户和用户组名均由用户自己指定。如果用户没有指定,那么Hadoop会调用Linux的whoami命令获取当前Linux系统的用户名和用户组名作为当前用户的对应名,并将其保存在Job的user.name和group.name两个属性中。这样用户所提交Job的后续认证、授权及集群服务的访问都将基于此用户和用户组的权限与认证信息进行。例如,在用户提交Job到JobTracker时,JobTracker会读取保存在Job路径下的用户信息并进行认证,在认证成功并获取令牌之后,JobTracker会根据用户和用户组的权限信息将Job提交到Job队列(具体细节参见本节的HDFS安全策略和MapReduce安全策略)。

Hadoop集群的管理员可以创建和配置Hadoop集群的用户,可以配置集群,使用Kerberos机制进行认证和授权。同时管理员可以在集群的服务(集群的服务主要包括NameNode、DataNode、JobTracker和TaskTracker)授权列表中添加或更改某确定的用户和用户组,系统管理员同时负责Job队列和队列的访问控制矩阵的创建。

2.HDFS安全策略

用户和HDFS服务之间的交互主要有两种情况:用户机和NameNode之间的RPC交互获取待通信的DataNode位置,客户机和DataNode交互传输数据块。

RPC交互可以通过Kerberos或授权令牌来认证。在认证与NameNode的连接时,用户需要使用Kerberos证书来通过初始认证,获取授权令牌。授权令牌可以在后续用户Job与NameNode连接的认证过程中使用,而不必再次访问KerberosKeyServer。授权令牌实际上是用户机与NameNode之间共享的密钥。当授权令牌在不安全的网络上传输时,应给予足够的保护,防止被其他用户恶意窃取。因为获取授权令牌的任何人都可以假扮成认证用户与NameNode进行不安全的交互。需要注意的是,每个用户只能通过Kerberos认证获取唯一的新的授权令牌。用户从NameNode获取授权令牌之后,需要告诉NameNode:谁是指定的令牌更新者。指定的令牌更新者在为用户更新令牌时,应通过认证确定自己就是NameNode。更新令牌意味着延长令牌在NameNode上的有效期。为了使MapReduceJob使用一个授权令牌,用户应将JobTracker指定为令牌更新者。这样同一个Job的所有Task都会使用同一个令牌。JobTracker需要保证这一令牌在整个任务的执行过程中都是可用的,在任务结束之后,它可以选择取消令牌。

数据块的传输可以通过块访问令牌来认证,每个块访问令牌都由NameNode生成,它们都是特定的。块访问令牌代表数据访问容量,一个块访问令牌可以保证用户访问指定的数据块。块访问令牌由NameNode签发,被用在DataNode上,其传输过程就是将NameNode上的认证信息传输到DataNode上。块访问令牌是基于对称加密模式生成的,NameNode和DataNode共享密钥。对于每个块访问令牌,NameNode基于共享密钥计算出一个消息认证码(Message Authentication Code,MAC)。接下来,这个消息认证码就会作为令牌验证器成为块访问令牌的主要组成部分。当一个DataNode接收到一个块访问令牌时,它会使用自己的共享密钥重新计算一个消息认证码。如果这个认证码同块访问令牌中的认证码匹配,那么认证成功。

3.MapReduce安全策略

MapReduce安全策略主要涉及Job提交、Task和Shuffle三个方面。对于Job提交,用户需要将Job配置、输入文件和输入文件的元数据等写入用户home文件夹。这个文件夹只能由该用户读、写和执行。接下来用户将home文件夹的位置和认证信息发送给JobTracker。在执行过程中,Job可能需要访问多个HDFS节点或其他服务,因此,Job的安全凭证将以的形式保存在一个Map数据结构中。在物理存储介质上,将保存在HDFS中JobTracker的系统目录下,并分发给每个TaskTracker。Job的授权令牌将NameNode的URL作为其关键信息。为了防止授权令牌过期,JobTracker会定期更新授权令牌。Job结束之后,所有令牌都会失效。为了获取保存在HDFS上的配置信息,JobTracker需要使用用户的授权令牌访问HDFS,读取必需的配置信息。

任务(Task)的用户信息沿用生成Task的Job的用户信息,因为这种方式能保证一个用户的Job不会向TaskTracker或其他用户Job的Task发送系统信号。这种方式还保证了本地文件有权限高效地保存私有信息。在用户提交Job后,TaskTracker会接收JobTracker分发的Job安全凭证,并将其保存在本地仅对该用户可见的Job文件夹下。在与TaskTracker通信时,Task会用到这个凭证。

当一个Map任务完成时,它的输出被发送给管理此任务的TaskTracker。每个Reduce将会与TaskTracker通信,以获取自己的那部分输出,此时,就需要MapReduce框架保证其他用户不会获取这些Map的输出。Reduce任务会根据Job凭证计算请求的URL和当前时间戳的消息认证码。这个消息认证码会和请求一起发送给TaskTracker,而TaskTracker只会在消息认证码正确并且在封装时间戳的N分钟之内提供服务。在TaskTracker返回数据时,为了防止数据被木马替换,应答消息的头部将会封装根据请求中的消息认证码计算得到的新消息认证码和Job凭证,从而保证Reduce能够验证应答消息是由正确的TaskTracker发送而来的。思考练习

1.请简述Hadoop的优势。

2.Hadoop的数据管理主要包括哪些?

3.Hadoop集群安全主要从哪几个方面着手?请简要叙述。第2章Hadoop的安装与配置2.1 在Linux上安装与配置Hadoop

在Linux上安装Hadoop之前,需要先安装两个程序。(1)JDK1.6(或其更高版本)。Hadoop是用Java编写的程序,Hadoop的编译及MapReduce的运行都需要使用JDK,因此在安装Hadoop前,必须安装JDK1.6或其更高版本。(2)SSH(安全外壳协议),推荐安装OpenSSH。Hadoop需要通过SSH来启动Slave列表中各台主机的守护进程,因此SSH是必须安装的。即使安装伪分布式版本(因为Hadoop并没有区分集群式和伪分布式),也是如此。对于伪分布式,Hadoop会采用与集群式相同的处理方式,即按次序启动文件conf/slaves中记载的主机上的进程。只不过在伪分布式中,Salve为localhost(自身),所以对于伪分布式Hadoop,SSH一样是必需的。2.1.1 安装JDK1.6

安装JDK1.6的具体步骤如下。(1)从http://www.oracle.com/technetwork/java/javase/downloads页面下载JDK1.6安装包(文件名类似jdk-***-linux-i586.bin,不建议安装JDK1.7版本,因为并不是所有软件都支持1.7版本)到JDK安装目录(本章假设JDK安装目录均为/usr/lib/jvm/jdk)中。(2)手动安装JDK1.6。进入JDK安装目录,并输入命令sudochmodu+xjdk-***-linux-i586.bin,修改完权限之后就可以进行安装了。输入命令sudo-s./jdk-***-linux- i586.bin,安装结束之后就可以开始配置环境变量了。(3)配置环境变量。

输入命令sudogedit/etc/profile,输入密码,打开profile文件。在文件最下面输入如下内容

这一步的作用是配置环境变量,使系统可以找到JDK。(4)验证JDK是否安装成功。

输入命令

会出现如下JDK版本信息

如果出现上述JDK版本信息,说明当前安装的JDK并未设置成Ubuntu系统默认的JDK,还需要手动将安装的JDK设置成系统默认的JDK。(5)手动设置系统默认的JDK。

在终端依次输入命令

接下来输入java-version,就可以看到所安装的JDK版本信息了。2.1.2 配置SSH免密码登录

同样以Ubuntu为例,假设用户名为u。(1)确认已经连接上互联网,然后输入命令(2)配置为可以免密码登录本机。首先查看在u用户下是否存在.ssh文件夹(注意ssh前面有“.”,这是一个隐藏文件夹),输入命令

一般来说,安装SSH时会自动在当前用户下创建这个隐藏文件夹,如果没有,可以手动创建。接下来输入命令(注意下面命令中不是双引号,是两个单引号)

ssh-keygen代表生成密钥;-t(注意区分大小写)指定生成的密钥类型;dsa是dsa密钥认证的意思,即密钥类型;-P用于提供密语;-f指定生成的密钥文件。

在Ubuntu中,~代表当前用户文件夹,此处即/home/u。

这个命令会在.ssh文件夹下创建id_dsa及id_dsa.pub两个文件,这是SSH的一对私钥和公钥,类似于钥匙和锁,把id_dsa.pub(公钥)加到授权的key中。输入命令

这条命令的功能是把公钥加到用于认证的公钥文件中,这里的authorized_keys是用于认证的公钥文件。至此,免密码登录本机已配置完毕。(3)验证SSH是否已安装成功,以及是否可以免密码登录本机。

输入命令

显示结果

显示SSH已经安装成功了。输入命令

会有如下显示

这说明已经安装成功,第一次登录时会询问是否继续链接,输入yes即可进入。实际上,在Hadoop的安装过程中,是否免密码登录是无关紧要的。但是如果不配置免密码登录,在每次启动Hadoop时都需要输入密码以登录每台机器的DataNode。考虑一般的Hadoop集群

试读结束[说明:试读内容隐藏了图片]

下载完整电子书


相关推荐

最新文章


© 2020 txtepub下载