我们生活在大数据时代,企业日常需要处理的数据量超出了单个主机的存储和处理能力。大数据带来了两大基本挑战:存储和处理大量数据以及理解数据并将其转化为竞争优势。
通过高效存储和计算能力,Hadoop的出现填补了市场空白。Hadoop是一个由分布式文件系统组成的分布式系统,提供了在一组机器上并行化执行程序的方法(见图1.1)。目前,Hadoop已经成为大数据领域的事实标准,因为它已经被Yahoo、Facebook、Twitter、阿里巴巴、百度等大型企业采用,并且正在进军所有领域。
图1.1
本文作为《Hadoop从入门到精通》大型专题的第一章,主要介绍Hadoop基础概念、安装及运行MapReduce任务等方面的知识。本章适用于具备简单Hadoop实践经验,了解MapReduce和HDFS等组件的基本概念,并具备中级Java知识储备的工程师。
1.1 Hadoop是什么?
Hadoop是一个分布式存储和计算平台,其诞生之初是为了解决Nutch中存在的伸缩性问题。Nutch是一个开源Java实现的爬虫和搜索引擎,谷歌曾发表论文描述了其新颖的分布式文件系统——谷歌文件系统(GFS)和并行处理计算框架MapReduce,宣称可以解决Nutch的问题。在Nutch成功实现这些概念之后,它被分成了两个独立的项目,其中一个就是Hadoop,目前已经成为Apache顶尖项目。Nutch项目,以及Hadoop,均由Doug Cutting和Mike Cafarella主导。
本节将从架构角度介绍Hadoop,研究行业如何使用以及Hadoop的优劣。
图1.2 Hadoop分布式主从架构
如上图所示,Hadoop由以下部分组成:
一个通信模型,其中一个进程(称为主进程)控制一个或多个其他进程,称为从进程。用于存储数据的Hadoop分布式文件系统(HDFS)。在Hadoop 2中引入了资源调度器(YARN),它是通用调度程序和资源管理器,任何YARN应用程序都可在Hadoop集群上运行。MapReduce,基于批处理的计算引擎。在Hadoop 中,MapReduce是作为YARN应用程序实现的。Hadoop的固有特征是大数据集的数据分区和并行计算,其存储和计算能力随着主机添加到Hadoop集群而扩展,拥有数百台主机的集群可以轻松达到数PB级别的数据量。
1.1.1 Hadoop核心组件
要了解Hadoop基础架构,我们首先需要了解HDFS。
HDFS
HDFS是Hadoop存储组件,它是一个以Google文件系统(GFS)为模型的分布式文件系统。HDFS针对高吞吐量进行了优化,在读取和写入大文件(千兆字节或更大)时效果最佳。为了支持高吞吐量,HDFS通常使用较大的(对于文件系统)块和数据局部性优化来减少网络I/O。
可扩展性和可用性也是HDFS的关键特性,部分原因在于数据复制和容错。HDFS按配置的指定次数复制文件,容忍软件和硬件故障,并自动在已失败节点上重新复制数据块。
图1.3
上图显示了HDFS中组件的逻辑表示:Name-Node和DataNode。同时,它显示了使用Hadoop文件系统库访问HDFS的应用程序。
Hadoop 2为HDFS引入了两个重要的新功能 ——Federation和高可用(HA):
Federation允许在多个NameNode主机间共享HDFS元数据,这有助于HDFS扩展并提供数据隔离,允许不同应用程序或团队运行自己的NameNode,而不必担心影响同一集群上的其他NameNode。HDFS中的高可用性消除了Hadoop 1中存在的单点故障,其中,NameNode故障将导致集群中断。HDFS的高可用性提供故障转移功能(备用节点从失败的主NameNode接管工作的过程)以实现自动化。YARN
YARN是Hadoop分布式资源调度程序。YARN是Hadoop 2.0版本添加的功能,旨在应对Hadoop 1架构带来的如下挑战:
大于4,000个节点的部署遇到可伸缩性问题,添加其他节点并未产生预期的线性可伸缩性改进。仅支持MapReduce工作负载,这意味着不适合运行执行模型,例如通常需要迭代计算的机器学习算法。在之后的Hadoop版本中,这些问题通过从MapReduce提取调度函数并将其重新编写为通用应用程序调度程序(称为YARN)来解决。通过此更改,Hadoop集群不再局限于运行MapReduce工作负载,YARN允许在Hadoop本地支持一组新的工作负载,并允许其他处理模型(如图处理和流处理)与MapReduce共存。
YARN的架构很简单,因为它主要是调度和管理Hadoop集群中的资源。
图1.4
上图显示了YARN核心组件的逻辑表示:ResourceManager和NodeManager,显示了特定于YARN应用程序的组件,即YARN应用程序客户端、ApplicationMaster和容器。
Hadoop 1中有“插槽”(slot)的概念,允许在单个节点上运行固定数量的map和reduce进程。这在集群利用方面是浪费的,并且在MapReduce操作期间导致资源利用不足,对映射和任务施加了内存限制。使用YARN,ApplicationMaster请求的每个容器都可以具有不同的内存和CPU特性,这使YARN应用程序可以完全控制完成工作所需的资源。
MapReduce
MapReduce是一个批量分布式计算框架,可参考Google关于MapReduce的论文。MapReduce允许并行处理大量原始数据,例如将Web日志与来自OLTP数据库的关系数据相结合,以模拟用户与网站的交互方式。使用传统串行编程技术可能需要数天或更长时间来完成这类工作,使用Hadoop集群上的MapReduce几分钟内便可完成。MapReduce模型通过抽象出使用分布式系统所涉及的复杂性(例如计算并行化、工作分配以及不可靠的硬件和软件)来简化并行处理过程。
通过这种抽象,MapReduce允许程序员专注于解决业务需求,而不是陷入分布式系统的复杂性中,MapReduce将客户端提交的工作分解为小型并行化映射并减少任务。
图1.5
如上图所示,通过使用map和reduce结构,客户端向MapReduce提交作业,将任务分解为较小的map并处理。
MapReduce是从Lisp函数式编程语言中演变而来,使用无共享模型删除不需要的执行间依赖。程序员的工作是定义map和reduce函数,其中map函数输出键/值元组,由reduce函数处理以产生最终输出。
图1.6
上图显示了映射函数关于其输入和输出的伪代码定义,MapReduce的强大功能发生在shuffle和sort阶段的map输出和reduce输入之间。
图1.7 MapReduce的shuffle和排序阶段
图1.8 reduce函数的伪代码定义
随着YARN的出现,MapReduce已被重写为YARN应用程序,现在称为MapReduce 2(或MRv2)。从开发人员的角度来看,Hadoop后期版本中MapReduce的工作方式与Hadoop 1大致相同,为Hadoop 1编写的代码将在2.7及以后版本上执行而无需更改。
1.1.2 Hadoop生态系统
Hadoop生态系统是多样化且日益增长的,跟踪以某种形式与Hadoop交互的所有项目是不可能的。本节的重点是目前用户使用最多的工具,如图1.9所示。
图1.9
1.1.3硬件要求
商用硬件配置通常用于描述Hadoop在集群生产环境中的部署硬件要求。事实上,Hadoop可以运行在目前可挖掘到的任何旧服务器上,但如果希望集群运行良好且不把时间浪费在诊断和修复硬件问题上,我们自然需要更好的配置。商用硬件配置指的是具有双插槽的中级机架式服务器,尽可能多的错误校正RAM以及针对RAID存储优化的SATA驱动器。在DataNode上使用RAID强烈建议不要使用存储HDFS内容的文件系统,因为HDFS内置了复制和错误检查功能。在NameNode上,强烈建议使用RAID以提高安全性。
从网络拓扑角度来看,关于交换机和防火墙,所有主节点和从节点必须能够相互打开连接。对于小型集群,所有主机都将运行连接到单个高质量交换机的1 GB网卡。对于较大集群,请参考10 GB架顶式交换机,这些交换机至少具有多个1 GB上行链路到双中心交换机,客户端节点还需要能够与所有主节点和从节点通信。
1.1.4 Hadoop发行版
一旦决定使用Hadoop,我们必须选择一个发行版。Hadoop是Apache开源项目,可以直接从Apache项目网站(发行版是明智的。
选择合适的商用发行版需要与供应商合作,从功能、支持和成本角度了解各发行版是否符合企业需求。每个供应商都会突出其优势,同时暴露其竞争对手的劣势,因此与两个或更多供应商交谈将让你更加真实地了解各大供应商的优劣,确保下载并测试验证是否可在现有软件和硬件堆栈中集成和正常工作。目前,我们有许多发行版可供选择,本节只简要总结主流发行版的特点。
Apache
Apache是维护核心Hadoop代码和分发的组织,并且因为所有代码都是开源的,所以企业可以破解喜欢的IDE并浏览源代码以了解其工作原理。从历史上看,Apache发行版面临的挑战是仅靠开源社区成员的一点支持,无法保证用户问题及时响应和修复。话虽如此,但Hadoop社区依然是非常友好且活跃的社区,对问题的回答通常很快,即使实际修复时间可能超过用户的承受能力。
随着Apache Ambari的出现,管理流程被极大简化。Apache Hadoop发行版变得更加完善,Apache Ambari提供了GUI帮助配置和管理集群。相比于复杂的商业软件,Ambari更加简单易用。
Cloudera
Cloudera是最受期待的Hadoop发行版,公司雇佣了大量Hadoop(包括Hadoop生态系统)代码提交者。Doug Cutting与Mike Caferella最初创建了Hadoop,现在是Cloudera的首席架构师。总的来说,这意味着与具有较少提交者的Hadoop发行版相比,Cloudera的错误修复和功能请求响应更加及时。除了维护和支持Hadoop之外,Cloudera还通过开发解决了Hadoop的一些弱点,在Hadoop领域进行了创新,比如Impala,它提供了SQL-on-Hadoop系统,类似于Hive,但专注于近乎实时的用户体验,而传统上的Hive是一个高延迟系统。Cloudera还有许多其他项目,比如Flume,一个日志收集和分发系统;Sqoop,用于将关系数据移入和移出Hadoop;Cloudera Search,提供近实时搜索。
Hortonworks
Hortonworks同样由大量Hadoop提交者组成,在快速解决核心Hadoop及其生态系统问题和功能请求方面具备与Cloudera相同的优势。从创新角度来看,Hortonworks采用了与Cloudera略有不同的方法。比如Hive,Cloudera的方法是开发一个全新的SQL-on-Hadoop系统,但Hortonworks是考虑在Hive内部进行创新,以消除其高延迟的枷锁并添加新的功能,例如支持ACID。Hortonworks也是下一代YARN平台的主要驱动者,这是与Hadoop开源生态保持相关性的关键战略。同样,Hortonworks使用Apache Ambari作为其管理工具,而不是开发内部专有管理工具。Hortonworks专注于开发和扩展Apache生态系统工具,这对社区有直接好处,因为它让所有用户都可以使用其工具。
MapR
MapR团队中的Hadoop提交者数量少于其他发行版,因此其修复和塑造Hadoop未来的能力比同行更有限。从创新角度来看,MapR从一开始就决定弃用HDFS作为企业级文件系统,而开发了专有文件系统,并提供了一些新功能,如POSIX合规性(提供随机写入支持和原子操作),高可用性,NFS安装,数据镜像和快照。其中一些功能已经引入Hadoop 后续版本,可见这些功能非常强大。作为评估标准的一部分,MapR的部分内容(例如其文件系统和HBase产品)是封源和专有的,这会影响工程师向社区提供补丁的能力。相比之下,Cloudera和Hortonworks的大部分堆栈都是开源的,尤其是Hortonworks,它的独特之处在于整个堆栈(包括管理平台)都是开源的。MapR的一大亮点是在亚马逊云中提供,作为亚马逊Elastic MapReduce的替代品,并与Google的Compute Cloud集成。
星环科技
在国内,星环科技提供的Transwarp Data Hub(简称TDH)是国内落地案例最多的一站式Hadoop发行版,也是Gartner认可的Hadoop国际主流发行版本。TDH解决了Hadoop的性能问题,解决了企业需要MPP或混合架构的问题。对于现在还不太成熟的Spark生态而言,唯一的优势可能就是速度够快,但稳定性不足,企业很难尝试。TDH解决了Hadoop的速度问题,让Spark失去抗衡条件。
1.1.5 使用Hadoop的公司有哪些?
Hadoop在高科技公司具有很高渗透率,并且已经开始进入其他领域。Facebook使用Hadoop、Hive和HBase进行数据仓库和实时应用服务。Facebook的数据仓库集群规模为PB级,有数千个节点且使用单独的HBase驱动实时集群进行消息传递和分析。雅虎使用Hadoop进行数据分析、机器学习、搜索排名、垃圾邮件处理、广告优化、ETL等。雅虎内部有超过40,000台运行Hadoop和170 PB存储的服务器。Twitter是一个主要的大数据创新者,其通过Scalding,一个用于级联的Scala API等项目为Hadoop做出了显着贡献。Summingbird可用于实现Nathan Marz lambda架构部分组件。当然,还有各种其他公司在使用Hadoop,比如Bijection、Algebird、eBay、Rackspace、Groupon、LinkedIn、阿里巴巴、百度、腾讯等。
随着使用Hadoop的企业数量日益增长,如果在财富500强企业工作,几乎肯定会以某种身份使用Hadoop集群。与所有技术一样,能够与Hadoop有效合作的关键是了解其缺点,设计和构建适合企业的解决方案以尽可能规避这些缺点。
1.1.6 Hadoop的限制
高可用性和安全性通常是引用Hadoop的首要问题,其中许多问题已在Hadoop 2及后续版本中得到了解决。使用Hadoop 1及更早版本的企业可能需要担心高可用性和安全性,因为在Hadoop 1中,所有主进程都是单点故障,这意味着主进程故障会导致中断。在Hadoop的后续版本中,HDFS具有高可用性支持,并且使用YARN重新构建MapReduce已经消除了单点故障。
高可用性
高可用性通常在具有高正常运行时间SLA要求的企业中被强制要求,以确保系统始终处于开启状态,即使节点由于计划内或外的情况而发生故障也是如此。在Hadoop 2之前,主HDFS进程只能在单个节点上运行,导致单点故障。Hadoop 2便带来了NameNode高可用性(HA)支持,这意味着可以运行同一Hadoop集群的多个NameNode。目前,其中一个NameNode处于活动状态,另一个NameNode被指定为备用进程。如果活动NameNode意外中断,备用NameNode将接管活动NameNode,这被称为故障转移进程。此故障转移可以配置为自动,无需人为干预,发生NameNode故障转移对Hadoop客户端是透明的。MapReduce主进程(JobTracker)在Hadoop 2中没有HA支持,但现在每个MapReduce作业都有自己的JobTracker进程(一个单独的YARN ApplicationMaster),HA支持可能不那么重要了。但是,YARN主进程(ResourceManager)中的HA支持很重要。
多数据中心支持
多数据中心支持是企业软件设计预期中的一大关键功能,因为它保证了数据在多个数据中心之间复制而带来的安全等问题。Apache Hadoop及其大多数商业发行版从未支持多个数据中心,这对在多个数据中心运行软件的企业提出了挑战。WANdisco是目前唯一可用于Hadoop多数据中心支持的解决方案。Hadoop确实提供了安全模型,但默认情况下它被禁用。禁用安全模型后,Hadoop中唯一存在的安全功能是HDFS文件级和目录级所有权和权限,但对于恶意攻击来说,这很容易破解。
HDFS
HDFS的弱点主要是缺乏高可用性(在Hadoop 1.x及更早版本中),对小文件的处理效率较低,以及缺乏透明压缩。HDFS不支持随机写入文件(仅支持附加),并且通常设计为支持对大文件进行高吞吐量顺序读取和写入。
MapReduce
MapReduce是一种基于批处理的体系结构,这意味着它无法用于需要实时数据访问的案例。需要全局同步或共享可变数据的任务不适合MapReduce,因为它是一种无共享架构,可能会对某些算法带来挑战。
版本不兼容性
Hadoop 2版本带来了一些关于MapReduce API运行时兼容性的问题,特别是在org.hadoop.mapreduce包中。这些问题经常导致运行时出现问题,这些代码是针对Hadoop 1(及更早版本)编译的,解决方案通常是针对Hadoop 2重新编译,Hive可能也需要重新编译才能使用Hadoop版本而不是它所构建的版本。Pig也有兼容性问题,例如,Pig 0.8版本不适用于Hadoop 0.20.203,需要手动干预才能解决此问题。这是使用Apache之外的Hadoop发行版的优势之一,因为这些兼容性问题已得到修复。如果需要使用vanilla Apache发行版,那么值得一看Bigtop(生态系统组件,并运行集成测试,以确保彼此协同工作。
1.2 轻松使用MapReduce运行任务
假设想构建倒排索引,MapReduce是一个很好的选择,因为它可以并行创建索引(一个常见的MapReduce用例)。输入是文本文件,输出是元组列表,其中每个元组都是一个单词和包含该单词的文件列表。使用标准处理技术,这将要求找到将所有单词连接在一起的机制。一种简单的方法是在内存中执行此连接,但如果有大量唯一键,则可能会耗尽内存。你可以使用中间数据存储,例如数据库,但效率低下。更好的方法是标记每一行并生成一个包含每行单词的中间文件,然后对中间文件进行排序。最后一步是打开所有已排序的中间文件,并为每个唯一单词调用函数,这就是MapReduce所做的,尽管是以分布式的方式。
图1.10 MapReduce中简单倒排索引示例
以下是mapper代码:
此mapper的目的是为每个单词创建一个输出行,并显示单词出现的文档ID列表。MapReduce框架负责将每个映射器输出的唯一键调用reducer,以及文档ID列表。在reducer中需要做的就是将所有文档ID组合在一起,并在reducer中输出,如下面的代码所示:
最后一步是编写驱动程序代码,该代码将设置所有必要属性以保证MapReduce任务正常运行。你需要让框架知道应该为map使用哪些类并减少函数,并让它知道输入和输出数据位置。默认情况下,MapReduce假定正在处理文本。如果正在处理更复杂的文本结构或完全不同的数据存储技术,需要告诉MapReduce应该如何从这些数据源和接收器读取和写入。以下源代码显示完整的驱动程序代码:
首先,你需要在HDFS中创建两个简单的输入文件:
接下来,运行MapReduce代码,使用shell脚本来运行,提供两个输入文件作为参数以及任务输出目录:
$ hip hip.ch1.InvertedIndexJob --input hip1/input --output hip1/output在本章中,大多数示例都通过hip脚本启动,该脚本位于bin目录。任务完成后,你可以检查任务输出文件的HDFS并查看其内容:
Hadoop是一个分布式系统,用于处理、生成和存储大型数据集。其MapReduce实现提供了一种容错机制,用于异构结构化和非结构化数据源的大规模数据分析,YARN支持同一Hadoop集群上多租户的不同应用程序。本章,我们从功能和物理架构角度审视了Hadoop,并完成了安装Hadoop以及运行MapReduce任务。本专题的其余部分将介绍如何解决使用Hadoop时遇到的常见技术问题。