九、数据存储与管理
第3关:大数据处理架构 Hadoop
任务描述
本关任务:根据相关知识内容完成右边选择题。
相关知识
为了完成本关任务,你需要掌握:
1.Hadoop 生态系统。
Hadoop 生态系统
Hadoop 是一个能够对大量数据进行分布式处理的软件框架,并且是以一种可靠、高效、可伸缩的方式进行处理的,它具有以下几个方面的特性:
• 高可靠性
• 高效性
• 高可扩展性
• 高容错性
• 成本低
• 运行在 Linux 平台上
• 支持多种编程语言
经过多年的发展,Hadoop 生态系统不断完善和成熟,目前已经包含了多个子项目。除了核心的 HDFS 和 MapReduce 以外,Hadoop 生态系统还包括 Zookeeper、HBase、Hive、Pig、Mahout、Sqoop、Flume、Ambari 等功能组件。如下图所示:

Hadoop 生态系统
Ambari
Apache Ambari 是一种基于 Web 的工具,支持 Apache Hadoop 集群的供应、管理和监控。Ambari 已支持大多数 Hadoop 组件,包括 HDFS、MapReduce、Hive、Pig、 Hbase、Zookeeper、Sqoop 和 Hcatalog 等。
Apache Ambari 支持 HDFS、MapReduce、Hive、Pig、Hbase、Zookeepr、Sqoop 和Hcatalog 等的集中管理。也是 5 个顶级 hadoop 管理工具之一。
Zookeeper
ZooKeeper 是 Apache 软件基金会的一个软件项目,它为大型分布式计算提供开源的分布式配置服务、同步服务和命名注册。
ZooKeeper 的架构通过冗余服务实现高可用性。
Zookeeper 的设计目标是将那些复杂且容易出错的分布式一致性服务封装起来,构成一个高效可靠的原语集,并以一系列简单易用的接口提供给用户使用。
一个典型的分布式数据一致性的解决方案,分布式应用程序可以基于它实现诸如数据发布/订阅、负载均衡、命名服务、分布式协调/通知、集群管理、Master 选举、分布式锁和分布式队列等功能。
ZooKeeper service 之间互相通信,保证服务的高可用性和一致性。客户端连接到单个 ZooKeeper 服务器。客户端维护一个 TCP 连接,通过它发送请求、获取响应、获取监视事件并发送心跳。如果与服务器的 TCP 连接中断,客户端将连接到其他的服务器。
zookeeper 提供的名称空间非常类似于标准文件系统,key-value 的形式存储。名称 key 由斜线 / 分割的一系列路径元素,zookeeper 名称空间中的每个节点都是由一个路径标识。
HBase
HBase 是一个高可靠、高性能、面向列、可伸缩的分布式数据库,是谷歌 BigTable 的开源实现,主要用来存储非结构化和半结构化的松散数据。HBase 基于面列式存储,其中 RowKey 的设计,使得他能够提供快速的点查和范围查询,但是不支持复杂的 SQL 查询。HBase 的目标是处理非常庞大的表,可以通过水平扩展的方式,利用廉价计算机集群处理由超过 10 亿行数据和数百万列元素组成的数据表。
Hadoop 生态系统中 HBase 与其他部分的关系,如下图所示:

Hadoop 生态系统中 HBase 与其他部分的关系
HBase 数据模型
表:HBase 采用表来组织数据,表由行和列组成,列划分为若干个列族。
行:每个 HBase 表都由若干行组成,每个行由行键(row key)来标识。
列族:一个 HBase 表被分组成许多"列族"(Column Family)的集合,它是基本的访问控制单元。
列限定符:列族里的数据通过列限定符(或列)来定位。
单元格:在 HBase 表中,通过行、列族和列限定符确定一个"单元格"(cell),单元格中存储的数据没有数据类型,总被视为字节数组 byte\[\]。
时间戳:每个单元格都保存着同一份数据的多个版本,这些版本采用时间戳进行索引。
HBase 的系统架构,如下图所示:

HBase 的系统架构
Hive
架构于 Hadoop 之上,可以将结构化的 HDFS 文件映射成一张表,并提供了类似于 SQL 语法的 HQL 查询功能。毫不夸张的说正是因为有了 Hive 的诞生,Hadoop 才会被大面积推广和使用,并且经久不息。
核心本质:将 HQL 语句转换成 MapReduce 任务
Hive 的主要优点:
避免了开发人员去实现 Map 和 Reduce 的接口,大大降低了学习成本 HQL 语法类似于 SQL 语法,简单、容易上手。
Hive 的主要缺点:
执行效率比较低 Hive 生成的 MapReduce 任务,不够智能化,容易造成数据倾斜 Hive 的架构。
Hive 的基本架构,如下图所示:

Hive 架构
其中
Meta Store: 元数据,一般存储在 MySQL
Client: 客户端
Driver: 驱动器
HQL Parse: 解析器,HQL 解析和语法分析
Physical Plan: 编译生成逻辑执行计划
Query Optimizer: 对逻辑执行计划进行优化
Execution: 把逻辑执行计划转换成物理执行计划
Map Reduce: 执行计算
HDFS: 文件存储
Pig
Pig 是一个基于 Hadoop 的大规模数据分析平台,它提供的 SQL-LIKE 语言叫 Pig Latin,该语言的编译器会把类 SQL 的数据分析请求转换为一系列经过优化处理的 MapReduce 运算。
Pig 和 Hive 类似,也是基于 Hadoop 的封装计算,核心也是为了简化 MapReduce 的编程。不同的是 Pig 提供的语法更加类似于 Shell,所以导致两者的使用人群不一致。Hive 更多的面向开发人员,而 Pig 更多的面向与运维人员。
Mahout
Mahout 是 Apache Software Foundation(ASF) 旗下的一个开源项目,提供一些可扩展的机器学习领域经典算法的实现,旨在帮助开发人员更加方便快捷地创建智能应用程序。Mahout 包含许多实现,包括聚类、分类、推荐过滤、频繁子项挖掘。此外,通过使用 Apache Hadoop 库,Mahout 可以有效地扩展到云中。
MapReduce
MapReduce 是一种分布式计算模型,由 Map 和 Reduce 组成。 Map() 负责把一个大的 block 块进行切片并计算。 Reduce() 负责把 Map() 切片的数据进行汇总、计算。
执行的核心思想: 相同 key 的键值对为一组调用一次 Reduce 方法,方法内迭代这组数据进行计算。
MapReduce 在大数据计算领域的地位举足轻重,可以使用很多廉价的机器达到惊人的算力。
其大致的计算步骤与过程,如下图所示:

YARN
YARN 是一种新的 Hadoop 资源管理器,它是一个通用资源管理系统,可为上层应用提供统一的资源管理和调度,它的引入为集群在利用率、资源统一管理和数据共享等方面带来了巨大好处。
YARN 的基本思想是将 JobTracker 的两个主要功能(资源管理和作业调度/监控)分离,主要方法是创建一个全局的 ResourceManager(RM)和若干个针对应用程序的 ApplicationMaster(AM)。这里的应用程序是指传统的 MapReduce 作业或作业的 DAG(有向无环图)。
YARN 分层结构的本质是 ResourceManager。这个实体控制整个集群并管理应用程序向基础计算资源的分配。ResourceManager 将各个资源部分(计算、内存、带宽等)精心安排给基础 NodeManager(YARN 的每节点代理)。ResourceManager 还与 ApplicationMaster 一起分配资源,与 NodeManager 一起启动和监视它们的基础应用程序。ApplicationMaster 管理一个在 YARN 内运行的应用程序的每个实例。NodeManager 管理一个 YARN 集群中的每个节点。
HDFS
HDFS 是 Hadoop 分布式文件系统,是 Hadoop 上层组件的核心存储系统,HBASE、Hive 等都是基于 HDFS 的存储来构建的。HDFS 是一个高度容错性的系统,适合部署在廉价的机器上。HDFS 能提供高吞吐量的数据访问,非常适合大规模数据集上的应用。
HDFS 的设计目标
总体而言,HDFS 要实现以下目标:
(1)兼容廉价的硬件设备
(2)流数据读写
(3)大数据集
(4)简单的文件模型
(5)强大的跨平台兼容性
HDFS 特殊的设计,在实现上述优良特性的同时,也使得自身具有一些应用局限性,主要包括以下几个方面:
(1)不适合低延迟数据访问
(2)无法高效存储大量小文件
(3)不支持多用户写入及任意修改文件
HDFS 体系结构
HDFS 采用了主从(Master/Slave)结构模型,一个 HDFS 集群是由一个 NameNode 和若干个 DataNode 组成的。其体系结构,如下图所示:

HDFS 体系结构
其中 NameNode 作为主服务器,管理文件系统的命名空间和客户端对文件的访问操作;集群中的 DataNode 负责处理文件系统客户端的读/写请求,在名称节点的统一调度下进行数据块的创建、删除和复制等管理存储的数据。每个数据节点的数据实际上是保存在本地 Linux 文件系统中的。
Flume
Flume 是一个分布式、高可用的服务,用于高效收集、聚合和移动大量日志数据。
Flume 主要承载的作用是收集各个数据源的事件或日志数据,然后将其 Sink 到数据库。
Flume 的实现架构原理也非常简单,通过 Agent 代理来实现数据的收集,一个 Agent 包含了 Source,Channel,Sink 三个组件。
Source:采集的数据来源,不同的数据源对应不同的格式,Flume 支持的 Source 类型有很多,比如 avro、thrift、twitter、exec、jms 等。
所有的 Source 类型可参考 Flume 的官方文档:
https://flume.apache.org/FlumeUserGuide.html#flume-sources
Channel:缓冲区,将接收到的 Source 数据缓存起来,供下游的 Sink 消费,只有当数据被 Sink 消费或者进入下一个 Channel 的时候才会被删除。为了保证 Channel 的可用性,Flume 也提供了多种 Channel 类型,有 memory、JDBC、File、Spillable Memory (当内存队列满了会存储到磁盘上) 、还支持自定义 Channel。
Sink:消费 Channel 里的数据,将数据发送到目的地,比如 Hive、HBase 等。
Sqoop
Sqoop 是一款开源的工具,主要用于在 Hadoop (Hive) 与传统的数据库 (mysql、postgresql...) 间进行数据的传递,可以将一个关系型数据库(例如:MySQL,Oracle,Postgres 等)中的数据导进到 Hadoop 的 HDFS 中,也可以将 HDFS 的数据导进到关系型数据库中。
Sqoop 项目开始于 2009 年,最早是作为 Hadoop 的一个第三方模块存在,后来为了让使用者能够快速部署,也为了让开发人员能够更快速的迭代开发,Sqoop 独立成为一个 Apache 项目。
Sqoop 用户在 Hadoop 和各种关系型数据库直接高效的同步传输数据,如下图所示:

实现同样功能的还有阿里开源的 datax。
编程要求
根据相关知识完成右侧选择题
测试说明
若选择题答案与正确答案一致则可通关。
开始你的任务吧,祝你成功!


有任何问题都可以随时关注私信!