Hadoop生态系统中各组件关系与区别
2015-08-08 22:01:34 阿炯

初接触Hadoop技术的朋友肯定会对它体系下派生的多个开源项目所折服,这些开源技术组件会把人搞迷惑,这其中会包含大量的开源项目。本篇文章主要是对 Hadoop 生态系统有个初步的认识,以下的一些开源项目详情可以查看 hadoop ecosystem table


Map Reduce

MapReduce 是使用集群的并行,分布式算法处理大数据集的可编程模型。Apache MapReduce 是从 Google MapReduce 派生而来的:在大型集群中简化数据处理。当前的 Apache MapReduce 版本基于 Apache YARN 框架构建。YARN = “Yet-Another-Resource-Negotiator”。YARN 可以运行非 MapReduce 模型的应用,YARN 是 Apache Hadoop 想要超越 MapReduce 数据处理能力的一种尝试。

HDFS

The Hadoop Distributed File System (HDFS) 提供跨多个机器存储大型文件的一种解决方案。Hadoop 和 HDFS 都是从 Google File System (GFS) 中派生的。Hadoop 2.0.0 之前,NameNode 是 HDFS 集群的一个单点故障 (SPOF) 。利用 Zookeeper,HDFS 高可用性特性解决了这个问题,提供选项来运行两个重复的 NameNodes,在同一个集群中,同一个 Active/Passive 配置。

Pig

一种操作hadoop的轻量级脚本语言,最初又雅虎公司推出,不过现在正在走下坡路了。当初雅虎自己慢慢退出pig的维护之后将它开源贡献到开源社区由所有爱好者来维护。不过现在还是有些公司在用,不过我认为与其使用pig不如使用hive。

Pig是一种数据流语言,用来快速轻松的处理巨大的数据,Pig包含两个部分:Pig Interface,Pig Latin。Pig可以非常方便的处理HDFS和HBase的数据,和Hive一样,Pig可以非常高效的处理其需要做的,通过直接操作Pig查询可以节省大量的劳动和时间。当你想在你的数据上做一些转换,并且不想编写MapReduce jobs就可以用Pig。

Pig 提供一个引擎在 Hadoop 并行执行数据流。Pig 包含一个语言:Pig Latin,用来表达这些数据流。Pig Latin 包括大量的传统数据操作 (join, sort, filter, etc.), 也可以让用户开发他们自己的函数,用来查看,处理和编写数据。Pig 在 hadoop 上运行,在 Hadoop 分布式文件系统,HDFS 和 Hadoop 处理系统,MapReduce 中都有使用。Pig 使用 MapReduce 来执行所有的数据处理,编译 Pig Latin 脚本,用户可以编写到一个系列,一个或者多个的 MapReduce 作业,然后执行。Pig Latin 看起来跟大多数编程语言都不一样,没有 if 状态和 for 循环。

Hive

不想用程序语言开发MapReduce的朋友比如DB们,熟悉SQL的朋友可以使用Hive开离线的进行数据处理与分析工作。

注意Hive现在适合在离线下进行数据的操作,就是说不适合在挂在真实的生产环境中进行实时的在线查询或操作,因为一个字“慢”。相反起源于FaceBook,Hive在Hadoop中扮演数据仓库的角色。建立在Hadoop集群的最顶层,对存储在Hadoop群上的数据提供类SQL的接口进行操作。你可以用 HiveQL进行select,join等等操作。如果你有数据仓库的需求并且你擅长写SQL并且不想写MapReduce jobs就可以用Hive代替。

HBase

HBase作为面向列的数据库运行在HDFS之上,HDFS缺乏随即读写操作,HBase正是为此而出现。HBase以Google BigTable为蓝本,以键值对的形式存储。项目的目标就是快速在主机内数十亿行数据中定位所需的数据并访问它。它的灵感来源于 Google BigTable。HBase 是 Google Bigtable 的开源实现,类似 Google Bigtable 利用 GFS 作为其文件存储系统,HBase 利用 Hadoop HDFS 作为其文件存储系统;Google 运行 MapReduce 来处理 Bigtable 中的海量数据,HBase 同样利用 Hadoop MapReduce 来处理 HBase 中的海量数据;Google Bigtable 利用 Chubby 作为协同服务,HBase 利用 Zookeeper 作为对应。

HBase是一个数据库,一个NoSql的数据库,像其他数据库一样提供随即读写功能,Hadoop不能满足实时需要,HBase正可以满足。如果你需要实时访问一些数据,就把它存入HBase。

你可以用Hadoop作为静态数据仓库,HBase作为数据存储,放那些进行一些操作会改变的数据。

Zookeeper

ZooKeeper 是 Hadoop 的正式子项目,它是一个针对大型分布式系统的可靠协调系统,提供的功能包括:配置维护、名字服务、分布式同步、组服务等。ZooKeeper 的目标就是封装好复杂易出错的关键服务,将简单易用的接口和性能高效、功能稳定的系统提供给用户。Zookeeper 是 Google 的 Chubby 一个开源的实现.是高有效和可靠的协同工作系统。Zookeeper 能够用来 leader 选举,配置信息维护等,在一个分布式的环境中,我们需要一个 Master 实例或存储一些配置信息,确保文件写入的一致性等。

Pig VS Hive

Hive更适合于数据仓库的任务,Hive主要用于静态的结构以及需要经常分析的工作。Hive与SQL相似促使其成为Hadoop与其他BI工具结合的理想交集。

Pig赋予开发人员在大数据集领域更多的灵活性,并允许开发简洁的脚本用于转换数据流以便嵌入到较大的 应用程序。

Pig相比Hive相对轻量,它主要的优势是相比于直接使用Hadoop Java APIs可大幅削减代码量。正因为如此,Pig仍然是吸引大量的软件开发人员。

Hive和Pig都可以与HBase组合使用,Hive和Pig还为HBase提供了高层语言支持,使得在HBase上进行数据统计处理变的非常简单

Hive VS HBase

Hive是建立在Hadoop之上为了减少MapReduce jobs编写工作的批处理系统,HBase是为了支持弥补Hadoop对实时操作的缺陷的项目。

想象你在操作RMDB数据库,如果是全表扫描,就用Hive+Hadoop,如果是索引访问,就用HBase+Hadoop。Hive query就是MapReduce jobs可以从5分钟到数小时不止,HBase是非常高效的,肯定比Hive高效的多。

Mahout

基于 MapReduce 的机器学习库和数学库。

Hadoop生态组件选择

常见组件主要有Zookeeper、Hadoop(Hdfs、Yarn和Mapreduce)、Hive、Tez、Spark、Flink、Hbase、Kafka、Ranger、Ambari(已经回归),如果再结合现在的技术发展趋势,Ozone、Iceberg、Kyuubi等湖仓一体相关的组件也可纳入。这些只是表面上的组件,实际上深入分析,组件内还有嵌套关系,还会涉及Solr、Phoenix等被其他组件”藏“起来的,要有一定的技术功底才能比较全面掌控的。

Hadoop组件关联分析

估计相当一部分人觉得直接采用Apache开源版本是一件很简单的事情,毕竟源码和大部分二进制包都摆在那里,但是其实真正做起来,就比较困难了,因为各个组件是存在很多版本依赖关系的,当所有组件都放在一起的时候,必然存在兼容性的问题,尤其是当以官宣首个支持ARM的Hadoop3.3.*为主进行其他组件集成的时候就会很快发现其他组件在拖后腿!下图为一个简单的分析。


且后续每新增一个组件,都需要做一个分析,不然就会出现版本不匹配引发兼容性问题,为后续生产运行埋下风险隐患。所以想把这个工作做好,这就要求技术人员对每个组件都具备至少高级以上的掌握程度。

Ambari作为Hadoop集群管理的开源软件,目前尚没有较好的替换软件,有很多号称有自己发行版的公司都是把Ambari换个UI售卖的。在Hadoop3.3.4这个主版本选定后,首先,Ambari自身的编译就需要调整很多jar包版本,没有一定技术能力,其实也难以搞定。其次,虽然Ambari目前已经集成了很多组件,但是还需要根据版本特性调整相关的配置。最后,对于尚未支持的Ozone、Kyuubi、Flink等组件,虽然可以找到一些公开资料和样例,但是很多开源项目都是最多算“学习版本",例如某电信领域的技术公司公开的Kyuubi组件集成到Ambari的资料和代码,就是残缺不全的,所以只有自己动手实践才会发现问题,但也确实需要足够的技术能力。


同时可以访问 Big Data Insights Page,学习更多关于 Hadoop 生态系统的 Red Hat 产品。



生态圈安全相关组件

大数据集群最基本的就是数据以及用于计算的资源,是宝贵数据资产,要防止被窃取、被破坏等,就涉及到大数据安全。主要安全需求有以下几个方面:
支持多组件,最好能支持当前公司技术栈的主要组件,HDFS、HBASE、HIVE、YARN、STORM、KAFKA等;
支持细粒度的权限控制,可以达到HIVE列,HDFS目录,HBASE列,YARN队列,STORM拓扑,KAKFA的TOPIC;
开源,社区活跃,按照现有的集群改情况造改动尽可能的小,而且要符合业界的趋势。

安全组件介绍与对比

目前比较常见的安全方案主要有三种:
Kerberos(业界比较常用的方案)
Apache Sentry(Cloudera选用的方案,Cdh版本中集成)
Apache Ranger(Hortonworks选用的方案,Hdp发行版中集成)


1、Kerberos

Kerberos是一种基于对称密钥的身份认证协议,它作为一个独立的第三方的身份认证服务,可以为其它服务提供身份认证功能,且支持SSO(即客户端身份认证后,可以访问多个服务如HBase/HDFS等)。


服务名作用
KDCKerberos的服务端程序,用于验证各个模块
Client需要访问服务的用户,KDC和Service会对用户的身份进行认证
Service即集成了Kerberos的服务,如HDFS/YARN/HBase等

Kerberos协议过程主要有三个阶段,第一个阶段Client向KDC申请TGT,第二阶段Client通过获得的TGT向KDC申请用于访问Service的Ticket,第三个阶段是Client用返回的Ticket访问Service。

优点:
服务认证,防止broker datanode regionserver等组件冒充加入集群
解决了服务端到服务端的认证,也解决了客户端到服务端的认证

缺点:
kerberos为了安全性使用临时ticket,认证信息会失效,用户多的情况下重新认证繁琐
kerberos只能控制你访问或者拒绝访问一个服务,不能控制到很细的粒度,比如hdfs的某一个路径,hive的某一个表,对用户级别上的认证并没有实现(需要配合LDAP)

2、Apache Sentry

Apache Sentry是Cloudera公司发布的一个Hadoop安全开源组件,它提供了细粒度级、基于角色的授权。

优点:
支持细粒度的hdfs元数据访问控制,对hive支持列级别的访问控制
通过基于角色的授权简化了管理,将访问同一数据集的不同特权级别授予多个角色
提供了一个统一平台方便管理
支持集成Kerberos

缺点:
组件只支持hive,hdfs,impala 不支持hbase,yarn,kafka,storm等

3、Apache Ranger

Apache Ranger是Hortonworks公司发布的一个Hadoop安全组件开源组件。

优点:
提供了细粒度级(hive列级别)
基于访问策略的权限模型
权限控制插件式,统一方便的策略管理
支持审计日志,可以记录各种操作的审计日志,提供统一的查询接口和界面
丰富的组件支持(HDFS,HBASE,HIVE,YARN,KAFKA,STORM)
支持和kerberos的集成
提供了Rest接口供二次开发


CDH和CM

由于Apache版本的组件兼容性和部署复杂性,绝大部分公司在当时产品选型时选择了某种Hadoop发行版,据信通院在2019年6月数据整理,当时国内有39家基于Hadoop的平台供应商,这些供应商里面有70%多是基于Cloudera的CDH和HDP的社区版封装成产品来提供给用户的,有24%是基于Apache封装,还有一家自研的产品。大部分供应商基本都是在CDH/HDP社区版进一步封装,同时替换掉CDH/HDP的Logo,就发布出来自己的版本。也就是说CDH/HDP的发行版基本上“垄断”了Hadoop市场,分析其原因,主要是免费(CDH分为免费版和商业版,HDP为开源免费版),很多公司并没有像互联网大厂那样的技术能力,使用免费的Hadoop发行版无疑是“最佳”选择。

正是由于免费,可能大部分用户可能只是知道CDH或者HDP,而不知道Cloudera或者Hortonworks,实际上CDH是Cloudera公司的代表产品,HDP是Hortonworks公司的代表产品。两家公司都是围绕着大数据平台去做发行版,他们在2019年1月进行了合并,形成了新的Cloudera公司。然后Cloudera选择进行平台整合,形成新的产品CDP,以往的CDH和HDP两大产品线不再提供社区版,用户无法获取新的功能。自2021年1月31日开始,所有Cloudera软件都需要有效的订阅,且订阅费昂贵。此外,CDH6和HDP3将是CDH和HDP的最后企业版本,原有企业版用户无法继续获取新的功能和性能提升。至2022年3月份,CDH/HDP全部停止服务(EoS),用户没办法获取售后支持。

目前CDP(CDH/HDP)发行版只支持Intel芯片(x86 64),Apache开源社区目前官宣支持aarch64架构的只有hadoop3.3系列版本,目前市场上还没有基于这个版本的Hadoop发行版。

CDH(Cloudera's Distribution Including Apache Hadoop)是Hadoop发行版的一种,是一套目前比较完整的、充分测试的Hadoop及其相关项目的发行版。CDH的基础组件均基于Apache开源协议,无论是个人学习还是企业使用都比较有保障。

CDH提供以下特性:
灵活性:能够存储各种类型的数据,并使用各种不同的计算框架进行操作,包括批处理、交互式sql、文本搜索、机器学习和统计计算。

集成性:能够快速集成和运行一个完整的Hadoop平台,适用于各种不同的硬件和软件。

安全性:处理和控制敏感数据。

扩展性:能够部署多种应用,并扩展和扩充它们以满足你的需求。

高可用性:可以放心地用于关键的商业任务。

兼容性:可以利用你现有的IT基础设施和资源。

CDH的主要功能模块如下图所示:


CM(cloudera Manager)是一种管理CDH集群的端到端的应用。CM通过对CDH集群的各部分提供精细的可视化和控制,建立了企业级部署的标准,增强了操作人员的能力以提升性能、提升服务质量、提高合规性、降低管理成本。通过CM,技术人员可以很容易地部署和集中化操作CDH技术栈和其他可托管的服务。它使安装过程自动化,使部署时间从几个星期减少到几分钟;提供了一个集群范围、实时的主机和服务运行情况的视图;提供了一个单一的中央控制台,以对集群配置进行变更;并采用全方位的报告和诊断工具来帮助你优化性能和利用率。

CM架构

CM的核心是cloudera Manager Server。Server承载了管理员控制台(Admin Console Web Server)和应用逻辑,并负责安装软件、配置、启动、停止服务,以及管理运行有服务的集群。

Cloudera Manager Server与以下几个组件一同工作:
代理:在每个主机上安装,负责启动和停止进行、解包配置、触发安装、监控主机。

管理服务:由一组角色组成的服务,执行各种监视、告警、报告功能。

数据库:存储配置和监控信息。通常,多个逻辑数据库在一个或多个数据库服务器上运行。例如CMS和监控服务使用不同的逻辑数据库。

Cloudera仓库:CM提供的用于软件分发的仓库。

客户端:与服务器交互的借口,包括

管理控制台,管理员使用该基于web的界面以管理集群和CM。

API,开发者可使用API创建自定义的CM应用。


心跳

心跳是CM的主要通信机制。默认情况下,代理每15秒发送心跳给CMS。然而为了减少用户等待时间,当状态发生变化时,频率会增加。心跳的交换过程中,代理通知CMS其自身的活性。反过来,CMS使用该消息对应执行的操作进行响应。代理和CMS两者最终会达成一致,例如当启动一个服务时,代理会尝试启动相关的进程;如果一个进程启动失败,CMS会将启动命令标记为失败。

CM 功能

状态管理:
CMS维护了集群的各种状态。状态可分为两类:模块和运行时,两者都存储于CMS的数据库中。模块中包含集群、主机、服务、角色、配置;运行时包含进程、命令。

1.配置管理
CM在多个层面定义了配置,如:
服务层面,可定义整个服务实例层面的配置,如HDFS服务的默认副本因子。
角色组层面,可定义某个角色组的配置,如DataNode的处理线程数量,可根据DataNodes的不同分组进行不同的配置。
角色层面,可覆盖从角色组层面继承的配置。这种配置需要谨慎使用,因为会造成角色组中的配置差异。如因为排错需求临时启用某个角色实例的DEBUG日志。
主机层面,根据监控、软件管理、资源管理的不同有不同的配置。
CM自身也有很多与管理操作相关的配置。

2.进程管理
非CM管理的集群使用脚本进行角色进程的启动,但在CM管理的集群中这类脚本不起作用。
CM管理的集群中,只能使用CM进行角色进程的启停。CM使用开源的进程管理工具名为supervisord,其会启动进程、重定向日志、通知进程失败、为进程设置正确的用户ID等等。CM支持自动重启一个崩溃的进程。 如果一个进程在启动后频繁崩溃,还会被打上非健康标记。
停止CMS和CM代理不会使正在运行的进程被中止。

3.软件包管理
CM支持两种软件分发格式:packages和parcels。
package是一种二进制分发格式,包含编译的代码和元数据如包述、版本、依赖项。包管理系统评估此元数据以允许包搜索、执行升级、确保包的所有依赖关系得到满足。CM使用本地操作系统支持的包管理程序。
parcel也是一种二进制分发格式,包含CM需要使用的附加元数据。其与package的区别有:可安装同一个parcel的多个版本,并激活其中一个。parcel可安装到任何路径,通过parcel安装,CM会自动下载并激活和每 个节点操作系统版本匹配的parcel包,解决某些操作系统版本不一致问题。

4.主机管理
CM 供了多种功能以管理Hadoop集群的主机。第一次运行CM管理员控制台时,可搜索主机并添加到集群,一旦选中了主机就可以为其分配CDH 角色。CM会在主机上自动部署作为集群托管节点的所有软件:JDK,CM 代理,CDH,Impala,Solr等等。
服务部署并运行后,管理员控制台中的“Hosts”区域显示集群中托管 主机的总体状态。 供的信息包括主机上的CDH版本、主机所属的集群、运行在主机上的角色的数量。Cloudera管理服务中的主机监控角色执行健康检查并收集主机的统计信息,以允许你监控主机的健康和性能。

5.资源管理
CM允许使用两种资源管理方式:
静态资源池:使用Linux cgroups在多个服务间静态地进行资源隔离,如 HBase、Impala、YARN分别使用一定百分比的资源。静态资源池默认不启用。
动态资源池:用于某些服务内部的资源管理,如YARN的各种资源调度器; Impala也可对不同池中的查询动态分配资源。

6.用户管理
访问CM通过用户账户进行控制。用户账户标识如何对用户进行身份验证,并确定授予用户的权限。
CM供了多种用户认证机制。可以配置CM使用CM数据库认证用户,或使用某种外部认证服务。外部认证服务可以是LDAP服务器,或者指定的其它服务。CM还支持使用安全断言标记语言(SAML)来实现单点登录。

7.安全管理
认证:认证是指用户或服务证明其有访问某种系统资源的权限。Cloudera集群支持操作系统账号认证、LDAP、Kerberos等认证方式。LDAP和Kerberos并不是互斥的,很多时候可以一起使用。
授权:授权关注谁可以存取或控制指定的资源或服务。CDH目前支持以 下几种权限控制:传统的POSIX形式的目录和文件权限控制;HDFS扩展的ACL细粒度权限控制;HBase可对用户和组设置各种操作的ACL;使用Apache Sentry进行基于角色的权限控制。
加密:集群不同层面存储和传输的数据支持不同的加密方式。

8.管理服务
Cloudera Management Service实现了多种管理特性,包括活动监控、主机监控、服务监控、事件服务、告警发布、报表管理等。