Hadoop不是一个简单的工具,它有自己的生态体系,这就是本节将要介绍的内容。
如果读者之前听说过大数据,那么几乎都应该听过Hadoop这个词。在大数据领域,Hadoop可以说是一个绕不开的话题。那么什么是Hadoop呢?
Hadoop是一个开源的大数据软件框架,主要用于分布式数据存储和大数据集处理。Hadoop在大数据领域使用广泛,其中一个重要的原因是开源,这就意味着使用Hadoop的成本很低,软件本身是免费的。另一方面,还可以研究其内部的实现原理,并根据自身的业务需求,进行代码层面的定制。
2003年,谷歌公司推出了Nutch项目,用来处理数十亿次的网页搜索和用于数百万网页的索引。2003年10月,谷歌公司公开发表了GFS(Google File System)论文。2004年,谷歌公司又公开发表了关于MapReduce细节的论文。2005年,Nutch项目使用GFS和MapReduce来执行操作,性能飙升。
2006年,计算机科学家Doug Cutting和Mike Cafarella共同开发出Hadoop。2006年2月,Doug Cutting为了让Hadoop有更好的发展,加入雅虎。此时Hadoop在雅虎公司经过专业团队的打造,已经变成一个可在Web规模上运行的企业级大数据系统。2007年,雅虎公司开始在100个节点的集群上使用Hadoop。
到2008年1月,Hadoop成为Apache顶级项目,并迎来了它的快速发展期,这无疑也证实了Hadoop的价值。此时,除了雅虎公司,世界上还有许多其他公司也使用Hadoop来构建大数据系统,如《纽约时报》和Facebook。2008年4月,Hadoop打破了一项世界纪录,成为对1T数据进行排序的最快系统。这个排序系统运行在910个节点的集群上,在209秒内完成对1TB的数据的排序。此消息也让Hadoop名声大噪。
2011年12月,Apache Hadoop发布了1.0版本。2013年8月,Apache Hadoop发布了2.0.6版本,其中Hadoop2.x对Hadoop1.x重构较多。2017年6月,Apache Hadoop3.0.0-alpha4版本发布。截至到本书撰写时,最新的Hadoop版本为3.2.1。
根据官方的介绍,Apache Hadoop 3.2.0是Hadoop 3.x系列中最大的一个版本,带来了许多新功能和1000多个修改,通过Hadoop 3.0.0的云连接器的增强功能进一步丰富了平台,并服务于深度学习用例和长期运行的应用。
目前Apache Hadoop已经部署在很多大型公司的生产环境中,例如Adobe、AWS、Apple、Cloudera、eBay、Facebook、Google、Hortonworks、IBM、Intel、LinkedIn、Microsoft、Netflix和Teradata等企业。此外,Apache Hadoop还促进了Spark、HBase和Hive等相关项目的发展。
经过大量企业的生产环境验证,Hadoop可以在具有数千个节点的分布式系统上稳定运行。它的分布式文件系统不但提供了节点间进行数据快速传输的能力,还允许系统在个别节点出现故障时,保证整个系统可以继续运行。
一般来说,在非高可用架构下,如果Hadoop集群中的NameNode节点出现故障,那么整个Hadoop系统将无法提供服务。
一般来说,Hadoop的定义有狭义和广义之分。从狭义上来说,Hadoop就是单独指代Hadoop这个软件。而从广义上来说,Hadoop指代大数据的一个生态圈,包括很多其他的大数据软件,比如HBase、Hive、Spark、Sqoop和Flume等。
一般我们所说的Hadoop,指的是Hadoop这个软件,即狭义的概念。当提到Hadoop生态系统或者生态圈的时候,往往指的是广义的Hadoop概念。
目前而言,Hadoop主要有三个发行版本:Apache Hadoop、Cloudera版本(简称CDH)和Hortonworks版本(简称HDP)。
前面提到,Hadoop当前最新版本为3.2.1,其中Hadoop2.x和Hadoop1.x差异比较大,而Hadoop3.x和Hadoop2.x从架构上区别并不大,更多是性能的提升以及整合了许多重要的增强功能。
Hadoop1.x作为第一个大版本,起初的设计并不完善,因此Hadoop1.x中的HDFS和MapReduce在高可用、扩展性等方面存在不足。如NameNode存在单点故障,且内存受限,影响扩展性,难以应用于在线场景。
另外,Hadoop1.x难以支持除MapReduce之外的计算框架,如Spark等。Hadoop2.x和Hadoop1.x在架构上的区别如图2.1所示。
图2.1 Hadoop2.x和Hadoop1.x架构区别图
从图2.1中可以看出,Hadoop1.x主要由HDFS(Hadoop Distributed File System)和MapReduce两个组件组成,其中MapReduce组件除了负责数据处理外,还负责集群的资源管理。而Hadoop2.x由HDFS、MapReduce和YARN三个组件组成,MapReduce只负责数据处理,且运行在YARN之上,YARN负责集群资源调度。这样单独分离出来的YARN组件还可以作为其他数据处理框架的集群资源管理。
Hadoop2.x的主要组件说明如下:
· HDFS:分布式文件系统,提供对应用程序数据的高吞吐量、高伸缩性、高容错性的访问。它是Hadoop体系中数据存储管理的基础,也是一个高度容错的系统,能检测和应对硬件故障,可在低配置的硬件上运行。
· YARN:用于任务调度和集群资源管理。
· MapReduce:基于YARN的大型数据集并行处理系统,是一种分布式计算模型,用于进行大数据量的分布式计算。
相对于之前的主要发布版本Hadoop2.x, Apache Hadoop3.x整合许多重要的增强功能。Hadoop3.x是一个可用版本,提供了稳定性和高质量的API,可以用于实际的产品开发。下面介绍Hadoop3.x的主要变化:
· 最低Java版本变为JDK 1.8:所有Hadoop的jar都是基于JDK 1.8进行编译的。
· HDFS支持纠删码:纠删码(erasure coding)是一种比副本存储更节省存储空间的数据持久化存储方法。
· YARN时间线服务增强:提高时间线服务的可扩展性、可靠性。
· 重写Shell脚本:修补了许多长期存在的bug,并增加了一些新的特性。
· 覆盖客户端的jar:将Hadoop的依赖隔离在单一jar包中,从而达到避免依赖渗透到应用程序的类路径中的问题,避免包冲突。
· MapReduce任务级本地优化:添加了映射输出收集器的本地化实现的支持,可以带来30%的性能提升。
· 支持2个以上的NameNode:通过多个NameNode来提供更高的容错性。
· 数据节点内置平衡器。
· YARN增强:YARN资源模型已经被一般化,可以支持用户自定义的可计算资源类型,而不仅仅是CPU和内存。
前面对Hadoop进行了简要的介绍,下面将介绍为什么要学习Hadoop,或者说Hadoop能解决大数据什么问题。
· 大数据存储
首先,大数据要解决的问题是如何方便地存取海量的数据,而Hadoop的HDFS组件可以解决这个问题。HDFS以分布式方式存储数据,并将每个文件存储为块(block)。块是文件系统中最小的数据单元。
假设有一个512MB大小的文件需要存储,由于HDFS默认创建数据块大小是128MB,因此HDFS将文件数据分成4个块(512/128=4),并将其存储在不同的数据节点上。同时为了保证可靠性,还会复制块数据到不同数据节点上。因此,Hadoop拆分数据的模式,可以胜任大数据的分布式存储。
· 可扩展性
其次,大数据需要解决的问题就是需要进行资源扩展,比如通过增加服务器节点来提升存储空间和计算资源。Hadoop采取主从架构,支持横向扩展的方式来扩展资源,当存储空间或者计算资源不够的情况下,用户可以向HDFS集群中添加额外的数据节点(服务器)来解决。
· 存储各种数据
再次,大数据需要解决存储各种数据的问题,大数据系统中很大一部分都是非结构化数据,结构化的数据可能只占很少的比例。HDFS可以存储所有类型的数据,包括结构化、半结构化和非结构化数据。Hadoop适合一次写入、多次读取的业务场景。
· 数据处理问题
大数据还有一个重要的问题就是如何对数据进行分布式计算。一般来说,传统的应用程序都是拉取数据,应用程序是固定的,将需要处理的数据从存储的地方移动到计算程序所在的计算机上,即移动数据。
大数据计算往往需要处理的数据量非常大,而程序一般比较小,因此在这种情况下,更好的解决办法是移动程序到各个数据节点上。Hadoop就是将计算移到数据节点上,而不是将数据移到计算程序所在的节点上。
Hadoop的主要优势如下:
· 可扩展性:通过添加数据节点,可以扩展系统以处理更多数据。
· 灵活性:可以存储任意多的数据,且数据支持各种类型。
· 低成本:开源免费,且可以运行在低廉的硬件上。
· 容错机制:如果某个数据节点宕机,则作业将自动重定向到其他节点。
· 计算能力:数据节点越多,处理数据的能力就越强。
Hadoop的缺点如下:
· 安全问题:Hadoop数据并没有加密,因此如果数据需要在互联网上传输,则存在数据泄漏的风险。
· 小文件问题:Hadoop缺乏有效支持随机读取小文件的能力,因此不适合小文件的存储。
在生产环境中,Hadoop在选择版本时,应该优先选择最新的稳定版本。
HDFS支持跨多台服务器进行数据存储,且数据会自动复制到不同的数据节点上,以防止数据丢失。HDFS采用主从(Master/Slave)架构。
一般来说,一个HDFS集群是由一个NameNode节点(主节点)和多个DataNode节点(从节点)组成。其中,NameNode是一个中心服务器,负责管理文件系统的各种元数据(Metadata)和客户端对文件的访问。DataNode在集群中一般负责管理节点上的数据读取和计算。Hadoop的架构设计图如图2.2所示。
图2.2 HDFS架构图
· NameNode:存储文件系统的元数据,即文件名、文件块信息、块位置、权限等,也管理数据节点。
· DataNode:存储实际业务数据(文件块)的从节点,根据NameNode指令为客户端读/写请求提供服务。
NameNode负责管理block的复制,它周期性地接收HDFS集群中所有DataNode的心跳数据包(heartbeats)和block报告。心跳包表示DataNode正常工作,block报告描述了该DataNode上所有的block组成的列表,并根据需要更新NameNode上的状态信息。
当文件读取时,客户端向NameNode节点发起文件读取的请求。NameNode返回文件存储的block块信息及其block块所在DataNode的信息。客户端根据这些信息,即可到具体的DataNode上进行文件读取。
由于数据流分散在HDFS集群中的所有DataNode节点上,且NameNode只响应块位置的请求(存储在内存中,速度很快),而无须响应数据请求,所以这种设计能适应大量的并发访问。
当文件写入时,客户端向NameNode节点发起文件写入的请求。NameNode根据文件大小和文件块配置的情况,返回给客户端它所管理部分DataNode的信息。客户端将文件划分为多个block块,并根据DataNode的地址信息,按顺序写入到每一个DataNode块中。HDFS中的文件默认规则是一次写、多次读,并且严格要求在任何时候只有一个写操作(writer)。
除了最后一个block,所有的block大小都是一样的(128MB)。当一个1MB的文件存储在一个128MB的block中时,文件只使用1MB的磁盘空间,而不是128MB。
备份数据的存放是HDFS可靠性和性能的关键。HDFS采用一种称为Rack-Aware的策略来决定备份数据的存放。通过Rack Awareness过程,NameNode给每个DataNode分配Rack Id。比如,DataNode1属于Rack1,DataNode4属于Rack2。
HDFS在默认情况下,一个block会有3个备份,一个在NameNode指定的DataNode上(假如是Rack1下的DataNode1),一个在指定DataNode非同一Rack的DataNode上(假如是Rack2下的DataNode4),一个在指定DataNode同一Rack的DataNode上(假如是Rack1下的DataNode2)。这种策略综合考虑了同一Rack失效,以及不同Rack之间数据复制的性能问题。
在读取副本数据时,为了降低带宽消耗和读取延时,HDFS会尽量读取最近的副本。如果在同一个Rack上有一个副本,那么就读该副本。
Hadoop服务启动后先进入安全模式,此时系统中的内容不允许修改和删除,直到安全模式结束。
Hadoop可以说是奠定了大数据开源解决方案的基础,因此,不少大数据工具都被纳入Hadoop生态系统。随着Hadoop与各种各样的Apache开源大数据项目的融合,Hadoop生态系统也在不断地变化。
Hadoop正在不断地将其核心组件HDFS和YARN扩展为一个更为复杂的开源大数据系统,也就是Hadoop生态系统。图2.3给出了Hadoop生态系统中的工具集,其中包含形成Hadoop生态系统的各种功能。
图2.3 Hadoop生态系统图
· Hadoop HDFS
HDFS是一个容错、分布式、水平可扩展的存储系统,可跨多个服务器工作。它可以用作Hadoop集群的一部分,也可以用作独立的通用文件系统,它是很多大数据工具的默认数据存储系统,起到非常重要的作用。
另外,Hadoop是开源的,这意味着一个组织可以运行这个文件系统来处理数PB级别的数据,而无须支付软件成本。
· Hadoop MapReduce
MapReduce是一个分布式编程框架,它可以以并行方式处理TB级别的数据。因此非常适合处理离线的数据,而且非常稳定。
· Flume
Flume是一个分布式的海量日志采集、聚合和传输的系统,它支持在日志系统中定制各类数据发送方,用于收集数据。同时,Flume提供对数据进行简单处理,并具有写入各种数据存储系统的能力。
· Sqoop
Sqoop支持HDFS、Hive、HBase与关系型数据库之间的批量数据双向传输(导入/导出)。与Flume不同,Sqoop在结构化数据的传输上操作更加方便。
· Pig
Pig是一个基于Hadoop的大数据分析平台,它提供的SQL-like语言叫Pig Latin(其实并不好用),该语言的编译器会把类SQL的数据分析请求,转换为一系列经过优化处理的MapReduce运算。Pig为复杂的海量数据并行计算提供了一个简单的操作和编程接口。
目前Pig用得也比较少,更多的是通过Hive SQL、Spark SQL或者Flink SQL来编写数据分析任务。
· Mahout
Mahout是在MapReduce之上实现的一套可扩展的机器学习库。不过当前随着Spark和Flink等软件的流行,Mahout逐步被其他机器学习库所替代。
· Hive
Hive是一个SQL翻译器,可以基于类似SQL语言的HiveQL来编写查询。Hive可以将HDFS和HBase中的数据集映射到表上。虽然Hive对于一些复杂SQL还不能很好地支持,但是常用的数据查询任务基本都可以用SQL来解决,这让开发人员只需用SQL就可以完成MapReduce作业。
· HBase
HBase是一个NoSQL分布式的面向列的数据库,它运行在HDFS之上,可以对HDFS执行随机读/写操作,它是Google Big Table的开源实现。HBase能够近实时地存储和检索随机数据。这就很好地弥补了Hadoop在实时应用上的不足。
· ZooKeeper
ZooKeeper是一个开源的分布式应用程序协调服务,是Google Chubby的一个开源实现。它是一个为分布式应用提供一致性服务的软件,提供的功能包括:配置维护、域名服务、分布式同步和组服务等。
· Spark
Spark是专为大规模数据处理而设计的、快速的通用计算引擎。它目前已经可以对大数据中的批处理和流处理进行处理,且Spark计算速度比Hadoop MapReduce要更快。
· Drill
Drill是一个用于Hadoop和NoSQL数据库的低延迟SQL查询引擎,它支持Parquet、JSON或XML等数据格式。Drill响应速度可达到亚秒级,适合交互式数据分析。
· Apache Superset
Superset是一个开源的可视化工具,可以接入多种数据源。开发人员或者业务人员可以借助它快速构建出美观的管理面板。
Hadoop生态系统有不同的版本,是一个不断发展的工具集,并没有一个统一的标准。