Hadoop 体系(二)

上文简单介绍了Hadoop,以及Hadoop体系成员。接下来将对每个成员进行简单的介绍。

HBase

HBase是一个分布式的、面向列的开源数据库,该技术来源于 Fay Chang 所撰写的Google论文“Bigtable:一个结构化数据的分布式存储系统”。就像Bigtable利用了Google文件系统(File System)所提供的分布式数据存储一样,HBase在Hadoop之上提供了类似于Bigtable的能力。HBase是Apache的Hadoop项目的子项目。HBase不同于一般的关系数据库,它是一个适合于非结构化数据存储的数据库。另一个不同的是HBase基于列的而不是基于行的模式。

高并发、实时处理

Hadoop是一个高容错、高延时的分布式文件系统和高并发的批处理系统,不适用于提供实时计算;HBase是可以提供实时计算的分布式数据库,数据被保存在HDFS分布式文件系统上,由HDFS保证高容错性。

可以直接或通过HBase的存储HDFS数据。使用HBase在HDFS读取消费/随机访问数据。 HBase在Hadoop的文件系统之上,并提供了读写访问。HBase HRegion servers集群中的所有的region的数据在服务器启动时都是被打开的,并且在内冲初始化一些memstore,相应的这就在一定程度上加快系统响 应;而Hadoop中的block中的数据文件默认是关闭的,只有在需要的时候才打开,处理完数据后就关闭,这在一定程度上就增加了响应时间

HBase和HDFS

HBase HDFS
HDFS是适于存储大容量文件的分布式文件系统 HBase是建立在HDFS之上的数据库
HDFS不支持快速单独记录查找 HBase提供在较大的表快速查找
提供了高延迟批量处理 供了数十亿条记录低延迟访问单个行记录(随机存取)
提供的数据只能顺序访问 HBase内部使用哈希表和提供随机接入,并且其存储索引,可将在HDFS文件中的数据进行快速查找

HBase和RDBMS

HBase RDBMS
HBase无模式,它不具有固定列模式的概念;仅定义列族 RDBMS有它的模式,描述表的整体结构的约束
宽表、横向扩展 细而专为小表
没有任何事务 RDBMS是事务性的
反规范化的数据 规范化的数据
半结构以及结构化数据 结构化数据

Cassandra

Cassandra是一个开源的分布式NoSQL数据存储系统,在实现了BigTable的数据模型的同时,使用了基于Amazon的Dynamo的系统架构来存储数据。

数据模型

Cassandra使用了Google 设计的 BigTable的数据模型,与面向行(row)的传统的关系型数据库或键值存储的key-value数据库不同,Cassandra使用的是宽列存储模型(Wide Column Stores),每行数据由row key唯一标识之后,可以有最多20亿个列,每个列由一个column key标识,每个column key下对应若干value。

存储模型

Cassandra的数据并不存储在分布式文件系统如GFS或HDFS中,而是直接存于本地。与BigTable一样,Cassandra也是日志型数据库,即把新写入的数据存储在内存的Memtable中并通过磁盘中的CommitLog来做持久化,内存填满后将数据按照key的顺序写进一个只读文件SSTable中,每次读取数据时将所有SSTable和内存中的数据进行查找和合并。这种系统的特点是写入比读取更快,因为写入一条数据是顺序计入commit log中,不需要随机读取磁盘以及搜索。

与HBase比较

Cassandra HBase
只有一种节点,存储在本地 有多种角色,架构在HDFS上,需要ZooKeeper同步集群状态
数据一致性策略是可配置的,可选择是强一致性还是性能更高的最终一致性 总是强一致性的
一致性哈希实现负载均衡 每段数据由一个节点处理,由master动态分配实现负载均衡
无单点问题 有单点问题

Chukwa

chukwa 是一个开源的用于监控大型分布式系统的数据收集系统。这是构建在 hadoop 的 hdfs 和 map/reduce 框架之上的。还包含了一个强大和灵活的工具集,可用于展示、监控和分析已收集的数据。

架构

Chukwa架构

Chukwa整体架构

  • agents : 负责采集最原始的数据,并发送给 collectors
  • adaptor : 直接采集数据的接口和工具,一个 agent 可以管理多个 adaptor 的数据采集
  • collectors 负责收集 agents 收送来的数据,并定时写入集群中
  • map/reduce jobs 定时启动,负责把集群中的数据分类、排序、去重和合并
  • HICC 负责数据的展示

Flume

Flume是一个分布式、可靠、和高可用的海量日志聚合的系统,支持在系统中定制各类数据发送方,用于收集数据;同时,Flume提供对数据进行简单处理,并写到各种数据接受方(可定制)的能力。

可靠性

当节点出现故障时,日志能够被传送到其他节点上而不会丢失。Flume提供了三种级别的可靠性保障,从强到弱依次分别为:end-to-end(收到数据agent首先将event写到磁盘上,当数据传送成功后,再删除;如果数据发送失败,可以重新发送。),Store on failure(这也是scribe采用的策略,当数据接收方crash时,将数据写到本地,待恢复后,继续发送),Best effort(数据发送到接收方后,不会进行确认)。

可扩展性

Flume采用了三层架构,分别为agent,collector和storage,每一层均可以水平扩展。其中,所有agent和collector由master统一管理,这使得系统容易监控和维护,且master允许有多个(使用ZooKeeper进行管理和负载均衡),这就避免了单点故障问题。

可管理性

所有agent和colletor由master统一管理,这使得系统便于维护。多master情况,Flume利用ZooKeeper和gossip,保证动态配置数据的一致性。用户可以在master上查看各个数据源或者数据流执行情况,且可以对各个数据源配置和动态加载。Flume提供了web 和shell script command两种形式对数据流进行管理。

功能可扩展性

用户可以根据需要添加自己的agent,collector或者storage。此外,Flume自带了很多组件,包括各种agent(file, syslog等),collector和storage(file,HDFS等)。

Giraph

Giraph是一个迭代的图计算系统。Giraph计算的输入是由点和直连的边组成的图。是基于Hadoop建立的。

现在的大数据的图问题又很多,例如表达人与人之间的关系的有社交网络,搜索引擎需要经常计算网页与网页之间的关系,而map-reduce接口不太适合实现图算法。

Giraph

Hama

Apache Hama是一个建立在Hadoop上基于BSP(Bulk Synchronous Parallel)的计算框架,模仿了Google的Pregel。用来处理大规模的科学计算,特别是矩阵和图计算。集群环境中的系统架构由 BSPMaster/GroomServer(Computation Engine)、Zookeeper(Distributed Locking)、HDFS/HBase(Storage Systems)这3大块组成。

BSP

整体同步并行计算模型(Bulk Synchronous Parallel Computing Model,简称BSP模型),又名大同步模型或BSP模型。

BSP模型最早作为一 个并行计算领域中软件和硬件之间 的“ 过渡模型” 而提 出的。它的设计目标是为 现有 和未来 可能出现的各种 并行体系结构提供一个独立于具体体系结构、具有可扩展并行性能的软件开发的良好的理论模型基础。
一个BSP计算机由一组通过通讯网络互连的处理器——内存单元组成。它主要有三个部分:

  • 一组具有局部内存的分布式处理器
  • 全局数据通讯网络
  • 支持所有处理单元间全局路障同步的机制

Hama的BSP实现原理

Hama可以说是一个利用Hadoop的基础设施自封装的一个BSP计算模型的实现,它虽然跟Hadoop有关但是不使用Hadoop集群,而是用的自身的集群。依赖ZooKeeper分布式锁作为作业的调度控制,可以用HDFS/Local/HBase等文件系统作输入输出。

HCatalog

HCatalog是Hadoop的元数据和数据表的管理系统。它基于Hive中的元数据层,通过类似SQL的语言展现Hadoop数据的关联关系。 HCatalog允许用户通过Hive,Pig,MapReduce共享数据和元数据。它的另一特点就是在用户编写应用程序时无需关心数据怎么存储,在哪里存储,还避免用户因schema和存储格式的改变而受到影响。

Hive

Hive是基于Hadoop的一个数据仓库工具,可以将结构化的数据文件映射为一张数据库表,并提供简单的sql查询功能,可以将sql语句转换为MapReduce任务进行运行。

它提供了一系列的工具,可以用来进行数据提取转化加载(ETL),这是一种可以存储、查询和分析存储在 Hadoop 中的大规模数据的机制。Hive 定义了简单的类 SQL 查询语言,称为 HQL,它允许熟悉 SQL 的用户查询数据。Hive 并不适合那些需要低延迟的应用,例如,联机事务处理(OLTP)。

技术架构

Hive技术架构图

Driver组件

该组件包括Complier、Optimizer和Executor,它的作用是将HQL语句进行解析、编译优化,生成执行计划,然后调用底层的mapreduce计算框架。

Metastore组件

元数据服务组件,这个组件存储hive的元数据,hive的元数据存储在关系数据库里,hive支持的关系数据库有derby、mysql。元数据对于hive十分重要,因此hive支持把metastore服务独立出来,安装到远程的服务器集群里,从而解耦hive服务和metastore服务,保证hive运行的健壮性。

Thrift服务

thrift是facebook开发的一个软件框架,它用来进行可扩展且跨语言的服务的开发,hive集成了该服务,能让不同的编程语言调用hive的接口。

CLI

命令行。

Thrift client

hive架构的许多客户端接口是建立在thrift客户端之上,包括JDBC和ODBC接口。

Web GUI

一种通过网页的方式访问hive所提供的服务。

Hive执行流程

Hive执行流程

Hue

HUE(Hadoop User Experience)是一个开源的Apache Hadoop UI系统,由Cloudera Desktop演化而来,最后Cloudera公司将其贡献给Apache基金会的Hadoop社区,它是基于Python Web框架Django实现的。

通过使用Hue我们可以在浏览器端的Web控制台上与Hadoop集群进行交互来分析处理数据,例如操作HDFS上的数据,运行MapReduce Job,执行Hive的SQL语句,浏览HBase数据库等等。

核心功能

  • SQL编辑器,支持Hive, Impala, MySQL, Oracle, PostgreSQL, SparkSQL, Solr SQL, Phoenix…
  • 搜索引擎Solr的各种图表
  • Spark和Hadoop的友好界面支持
  • 支持调度系统Apache Oozie,可进行workflow的编辑、查看

Oozie

在Hadoop中执行的任务有时候需要把多个Map/Reduce作业连接到一起,这样才能够达到目的。Oozie可以把多个Map/Reduce作业组合到一个逻辑工作单元中,从而完成更大型的任务。

Oozie是一种Java Web应用程序,它运行在Java servlet容器——即Tomcat——中,并使用数据库来存储以下内容:工作流定义;当前运行的工作流实例,包括实例的状态和变量。

Sqoop

主要用来在Hadoop和关系数据库中传递数据。通过sqoop,我们可以方便的将数据从关系数据库导入到HDFS,或者将数据从HDFS导出到关系数据库。

架构

sqoop架构

Yarn

Apache Hadoop YARN (Yet Another Resource Negotiator,另一种资源协调者)是一种新的 Hadoop 资源管理器,它是一个通用资源管理系统,可为上层应用提供统一的资源管理和调度,它的引入为集群在利用率、资源统一管理和数据共享等方面带来了巨大好处。

Mesos

不同的分布式运算框架(spark,hadoop,ES,MPI,Cassandra,etc.)中的任务往往需要的不同的资源(内存,CPU,网络IO等),它们运行在同一个集群中,会相互干扰,为此,应该提供一种资源隔离机制避免任务之间由资源争用导致效率下降,考虑到资源利用率,运维成本,数据共享等因素,便诞生了资源统一管理与调度平台,典型的代表就是mesos和yarn。

Mesos的目标就是在不同的framework之间高效的共享硬件资源,同时简化自身的调度逻辑,使其具有尽可能大的兼容性和可扩展性,以保证在大规模集群使用环境下的健壮性和对各种可能的运算框架的普遍适用性。

Mesos最大的好处是能够对分布式集群做细粒度资源分配。Mesos的分配逻辑很简单,只要不停地报告哪些是可用资源就可以了。Mesos资源分配方法也有一个潜在的缺点,就是无中心化的分配方式,所以有可能不会带来全局最优的方式。

Mesos sharing

Mesos-master

协调全部的slave,并确定每个节点的可用资源,聚合计算跨节点的所有可用资源的报告,然后向注册到Master的Framework发出资源邀约。

Mesos-slave

向master汇报自己的空闲资源和任务的状态,负责管理本节点上的各个mesos-task,在framework成功向Master申请资源后,收到消息的slave会启动相应framework的exexutor。

Framework

Hadoop,Spark等,通过 MesosSchedulerDiver 接入Mesos。

Executor

执行器,用于启动计算框架中的task。

Yarn和Mesos比较

  • Mesos只负责offer资源给framework,而Yarn自己来分配资源。
  • Yarn局限在Hadoop上,没法作为别的机器管理。
  • Mesos管理CPU,Memory,Disk;而Yarn只管理Memory和CPU。
  • Mesos用lxc隔离,Yarn用进程来进行隔离(性能可能更好)。
  • 部署Mesos以后,再跑Spark或Hadoop MapReduce的时候,就不需要部署Spark和Hadoop了,直接在Mesos上运行Spark或Hadoop任务(在文件系统中指定运行所需要的框架二进制包位置)。
  • 两种系统都采用了双层调度机制,即,第一层是源管理系统(mesos/YARN)将资源分配给应用程序(或框架),第二层,应用程序将收到的资源进一步分配给内部的任务。但是资源分配器智能化程度不同,mesos是基于resource offer的调度机制,包含非常少的调度语义,他只是简单的将资源推给各个应用程序,由应用程序选择是否接受资源,而mesos本身并不知道各个应用程序资源需求;YARN则不同,应用程序的ApplicationMaster会把各个任务的资源要求汇报给YARN,YARN则根据需要为应用程序分配资源。
  • 从功能上讲YARN和Mesos相似,只是Mesos更通用,可以支持在线和离线任务。一般YARN用于调度离线任务。