Hadoop是由Apache基金会开发的一种分布式系统基础架构,最初版本源自2003年Yahoo!工程师Doug Cutting根据Google发布的学术论文进行的研究。借助Hadoop,用户无需深入了解分布式底层细节,便能轻松开发和运行处理海量数据的应用程序。由于其低成本、高可靠性、高扩展性和高容错性,Hadoop成为了最流行的大数据分析系统。然而,Hadoop依赖的HDFS和MapReduce组件使得其在实时性方面表现不佳,仅适用于离线数据处理。
为此,一系列基于Hadoop的工具应运而生,下面将重点介绍Hadoop生态系统中常用的13个开源工具,涵盖资源调度、流计算和各类业务场景的应用。
在公司和机构中,服务器通常会因业务需求被分割成多个集群,而数据密集型处理框架也层出不穷,如支持离线处理的MapReduce、支持在线处理的Storm和Impala、支持迭代计算的Spark及流处理框架S4。这些框架诞生于不同的实验室,各自具备独特的优势。为了降低管理成本并提升资源利用率,一个共同的目标是让这些框架在同一集群上运行。当前,许多资源统一管理/调度系统应运而生,以下是两个重要的例子:Apache Mesos和YARN。
Apache Mesos提供了一种高效、跨分布式应用程序和框架的资源隔离和共享机制,支持包括Hadoop、MPI、Hypertable、Spark在内的多种框架。Mesos是一个在Apache孵化器中的开源项目,使用ZooKeeper实现容错复制,利用Linux Containers来隔离任务,支持多种资源规划分配(如内存和CPU),并提供Java、Python和C++ APIs来开发新的并行应用程序,同时提供基于Web的用户界面以查看集群状态。
YARN(Yet Another Resource Negotiator)也被称作MapReduce2.0,借鉴了Mesos的设计理念,提出了资源隔离解决方案Container。虽然YARN在某些方面尚不成熟,但已实现了Java虚拟机内存的隔离。与MapReduce1.x相比,YARN架构在客户端层面变化不大,仍保持大部分API和接口的兼容性。但在YARN中,开发人员使用ResourceManager、ApplicationMaster和NodeManager来替代原有的JobTracker和TaskTracker角色。其中,ResourceManager负责调度和启动每个Job所属的ApplicationMaster,并监控ApplicationMaster的状态;NodeManager则负责Container状态的维护并向ResourceManager报告心跳。ApplicationMaster负责Job生命周期内的所有工作。
在互联网公司中,基于业务需求,企业通常需要采用多种计算框架。例如,从事搜索业务的公司可能会使用MapReduce进行网页索引建立,而使用Spark进行自然语言处理等。
Cloudera Impala是一个开源的MPP(Massively Parallel Processing)查询引擎,与Hive具有相同的元数据、SQL语法、ODBC驱动程序和用户界面(如Hue Beeswax),能够在HDFS或HBase上提供快速、交互式的SQL查询。Impala摒弃了Hive+MapReduce批处理的缓慢模式,通过类似于商用并行关系数据库的分布式查询引擎(由Query Planner、Query Coordinator和Query Exec Engine三部分组成),能够直接从HDFS或HBase中通过SELECT、JOIN和统计函数查询数据,从而大幅降低延迟。
Spark是一个开源的数据分析集群计算框架,最初由加州大学伯克利分校的AMPLab开发,建立在HDFS之上。Spark用于构建大规模、低延迟的数据分析应用。Spark采用Scala语言实现,并使用Scala作为应用框架。Spark利用基于内存的分布式数据集优化迭代式工作负载和交互式查询。与Hadoop不同,Spark和Scala紧密结合,Scala像管理本地集体对象那样管理分布式数据集。Spark支持分布式数据集上的迭代任务,并且能够在Hadoop文件系统上与Hadoop一起运行(通过YARN、Mesos等实现)。
Storm是一个分布式的、容错的实时计算系统,由BackType开发,后来被Twitter收购。Storm属于流处理平台,主要用于实时计算并更新数据库。Storm也可用于“连续计算”(continuous computation),即在计算时就将结果以流的形式输出给用户。此外,它还可以用于“分布式RPC”,以并行方式运行昂贵的运算。
除了实时处理工具,还有一些其他开源解决方案,旨在改善Hadoop上的性能、兼容性和数据处理类型。其中包括Shark、Phoenix、Apache Accumulo、Apache Drill、Apache Giraph、Apache Hama、Apache Tez和Apache Ambari。
Shark是一个专门为Spark打造的大规模数据仓库系统,兼容Apache Hive。无需修改现有的数据或查询,就能用100倍的速度执行HiveQL。Shark支持Hive查询语言、元存储、序列化格式及自定义函数,与现有Hive部署无缝集成,是一个更快、更强大的替代方案。
Phoenix是构建在Apache HBase之上的一个SQL中间层,完全使用Java编写,提供了一个客户端可嵌入的JDBC驱动。Phoenix查询引擎会将SQL查询转换为一个或多个HBase扫描,并编排执行以生成标准的JDBC结果集。Phoenix的主要特性包括:嵌入式的JDBC驱动,实现了大部分的java.sql接口,包括元数据API;支持通过多个行键或键/值单元对列进行建模;DDL支持;版本化的模式仓库;DML支持;通过客户端批处理实现的有限事务支持;以及紧跟ANSI SQL标准。
Apache Accumulo是一个可靠的、可伸缩的、高性能、排序分布式的键值存储解决方案,基于单元访问控制以及可定制的服务器端处理。使用Google BigTable的设计思路,基于Apache Hadoop、ZooKeeper和Thrift构建。Accumulo最早由NSA开发,后来被捐献给了Apache基金会。相较于Google BigTable,Accumulo在单元访问和服务器端编程机制上有显著提升,后者允许Accumulo在数据处理过程中任意点修改键值对。
Apache Drill本质上是Google Dremel的开源实现,是一个分布式MPP查询层,支持SQL及一些用于NoSQL和Hadoop数据存储系统上的语言。它旨在帮助Hadoop用户更快地查询海量数据集。尽管目前Drill还只是一个框架,但其愿景是支持更广泛的数据源、数据格式及查询语言,通过快速扫描PB字节数据(大约几秒内),实现对大数据集的高效分析。
Apache Giraph是一个可伸缩的分布式迭代图处理系统,灵感来自BSP(Bulk Synchronous Parallel)和Google的Pregel。Giraph与前者区别在于它是开源的、基于Hadoop的架构。Giraph适用于运行大规模的逻辑计算,如页面排名、社交网络链接分析等。Giraph专注于社交图计算,被Facebook作为其Open Graph工具的核心,几分钟内即可处理数万亿次用户及其行为之间的连接。
Apache Hama是一个建立在Hadoop上的基于BSP(Bulk Synchronous Parallel)的计算框架,模仿了Google的Pregel。它用于处理大规模的科学计算,特别是矩阵和图计算。集群环境中的系统架构由BSP Master/Groom Server(Computation Engine)、ZooKeeper(Distributed Locking)、HDFS/HBase(Storage Systems)三大部分组成。
Apache Tez是一个基于Hadoop YARN之上的DAG(有向无环图,Directed Acyclic Graph)计算框架。它将Map/Reduce过程拆分成若干子过程,并能将多个Map/Reduce任务组合成一个更大的DAG任务,从而减少Map/Reduce之间的文件存储。合理组合其子过程,可以减少任务的运行时间。Tez由Hortonworks开发并提供主要支持。
Apache Ambari是一个开源框架,用于供应、管理和监控Apache Hadoop集群。它提供一个直观的操作工具和一个健壮的Hadoop API,以隐藏复杂的Hadoop操作,使集群操作大大简化。Ambari首个版本发布于2012年6月,现已发展成为一个Apache顶级项目。Ambari用户群一直在稳步增长,许多机构依靠Ambari在其大型数据中心大规模部署和管理Hadoop集群。目前,Apache Ambari支持的Hadoop组件包括:HDFS、MapReduce、Hive、HCatalog、HBase、ZooKeeper、Oozie、Pig及Sqoop。