大数据技术: Hadoop 架构, HDFS, YARN, Map Reduce, Hive 和 HBase
Hadoop
Hadoop 是一套开源程序和过程, 可用作大数据操作的框架. 它用于处理连接在一起的分布式文件系统中的海量数据. 它允许在集群上运行应用程序. (集群是指在同一时间共同执行任务的计算机集合). 需要注意的是, Hadoop 并不是一个数据库, 而是一个可以并行或并发处理进程和作业的生态系统.
Hadoop 经过优化, 可以处理海量数据, 这些数据可以是:
- 结构化的表格数据
- 非结构化数据, 如图像和视频, 或
- 半结构化数据, 使用相对廉价的计算机.
Hadoop 的核心组件包括:
- Hadoop Common是Apache Hadoop框架的重要组成部分, 指的是支持其他Hadoop模块的通用实用程序和库的集合.
- 有一个名为Hadoop 分布式文件系统或 HDFS 的存储组件. 它可以处理在商品硬件上运行的大型数据集. (商品硬件是低规格的工业级硬件, 可将单个 Hadoop 集群扩展到数百甚至数千个).
- 下一个组件是MapReduce, 它是 Hadoop 的一个处理单元, 也是 Hadoop 框架的一个重要核心组件. MapReduce 处理数据的方式是将大量数据分割成更小的单元, 并同时对它们进行处理. 有一段时间, MapReduce 是访问存储在 HDFS 中的数据的唯一方法. 现在还有其他系统, 如 Hive 和 Pig.
- 最后一个组件是YARN, 它是“Yet Another Resource Negotiator”的缩写. YARN 是一个非常重要的组件, 因为它为 Hadoop 准备了 RAM 和 CPU, 以便在批处理, 流处理, 交互式处理和图处理中运行数据, 这些数据都存储在 HDFS 中.
Hadoop 的缺点:
虽然乍一看效率很高, 但 Hadoop 在执行简单任务时却很失败.
- 由于缺乏随机访问, Hadoop 不适合处理事务.
- 当工作无法并行完成或数据存在依赖关系时, Hadoop 就不适合. 当记录一必须在记录二之前处理时, 就会出现依赖关系.
- Hadoop 也不适合低延迟数据访问.“低延迟 "允许在处理输入和提供实时特性的相应输出之间出现人类无法察觉的微小延迟. 这对于使用交易, 在线游戏和 IP 语音等服务的互联网连接尤为重要.
- Hadoop 也不适合处理大量小文件, 尽管在这方面正在开展工作, 如 IBM 的自适应 MapReduce.
- 最后, Hadoop 也不适合用少量数据进行密集计算.
为了解决 Hadoop 的不足, 人们在 Hadoop 的基础上开发了新的工具, 如Hive. Hive 提供类似 SQL 的查询, 并为用户提供强大的统计功能. Pig 因其多重查询方法减少了数据扫描次数而广受欢迎.
HDFS
HDFS 是 Hadoop 分布式文件系统(Hadoop Distributed File System)的缩写. 分布式文件系统是分布在多个文件服务器上的文件系统, 允许程序员从任何网络或计算机访问或存储文件. HDFS 是 Hadoop 的存储层. HDFS 的工作原理是将文件分割成块(当 HDFS 接收文件时, 文件会被分割成更小的块, 称为块. 块是可读取或写入的最小数据量, 并提供容错功能), 然后创建块的副本, 并将它们存储在不同的机器上.
例如, 如果我们有一个 500 兆字节的文件, 默认块大小为 128 兆字节, 那么该文件将被分为 3 个 128 兆字节的块和 1 个 116 兆字节的块(共 4 个块). 只有当文件大小是默认块大小的倍数时, 才会出现相同的分割. 因此, 你可以看到, 存储的每个文件不必占用预设块大小的存储空间.
HDFS 可无缝访问流式数据. 流式传输意味着 HDFS 在传输数据时提供恒定的比特率, 而不是让数据以波浪式传输.
HDFS 使用命令行界面与 Hadoop 交互.
HDFS 的主要特点有:
- 存储数据的商品硬件并不昂贵, 因此可降低存储成本.
- HDFS 可以存储任何格式(表格和非表格)的海量数据, 最大可达 PB 级. 它将这些海量数据分割成小块, 称为块.
- HDFS 的一大特点是, 当其中一个硬件单元发生故障时, 它能够复制数据并最大限度地降低与数据丢失相关的成本. 这种能力使 HDFS 成为容错. 如果其中一台计算机发生数据丢失, 可以在另一台计算机上找到数据, 然后继续工作.
- HDFS 还具有高度可扩展性. 一个集群可以扩展到数百个节点.
- 可移植性也是其主要特点之一, 因为 HDFS 可以轻松地从一个平台移动到另一个平台.
Hadoop 遵循主/次节点架构的概念. HDFS 有两种类型的节点:
- 主节点(又称名称节点)负责管理客户端的文件访问, 并维护, 管理和分配任务给辅助节点(又称数据节点). (名称节点负责监督文件的打开, 关闭, 重命名操作, 并将文件块映射到数据节点).
- 数据节点: 数据节点负责客户端的读写请求, 并根据名称节点的指令创建, 复制和删除文件块.
HDFS 中可以有数百个数据节点来管理存储系统. 它们根据名称节点的指令执行读写请求. 在执行读写等操作时, 名称节点必须选择离自己最近的数据节点, 从而最大限度地提高性能. 这可以是选择同一机架或附近机架上的数据节点. 这就是所谓的机架意识. (机架是指使用同一网络交换机的大约 40 到 50 个数据节点的集合). 机架感知用于减少网络流量和提高群集性能. 为实现机架感知, 名称节点会保留机架 ID 信息. 复制也是通过机架感知完成的. 其方法是确保数据节点的副本位于不同的机架上. 因此, 如果一个机架宕机, 你仍然可以从另一个机架获取数据. HDFS 以优化复制而著称. HDFS 使用机架感知概念来创建副本, 以确保数据的可靠性和可用性, 以及网络带宽的合理利用.
复制因子的定义是复制数据块的次数. 根据你的配置, 你可以设置你想要的复制次数. 让我们以 500 兆字节的文件为例进行说明:
如果我们的复制因子是 2, 它将为每个数据块创建两个副本. 这意味着我们将有 4 乘以 2, 即 8 份文件块副本用于备份. HDFS 使用机架感知概念, 将数据块保存在不同的机架中, 以确保在另一个机架中也有副本可用.
例如, 你可以有四个机架, 每个机架有两个副本. 如果其中一个机架宕机或崩溃, 在另一个机架中仍有数据块的副本, 你仍然可以处理数据.
另一个重要概念是如何在 HDFS 中执行读写操作. HDFS 允许“一写多读”操作. 这意味着, 你不能编辑已经存储在 HDFS 中的文件, 但可以向其中添加新数据.
读取操作
假设我们有一个文本文件, 客户端将向主节点(即名称节点)发送一个请求, 以获取包含区块的数据节点的位置. 名称节点将验证客户端是否拥有正确的权限, 并向客户端提供位置信息. HDFS 中的客户端与主节点和辅助节点交互, 以满足用户的请求. 然后, 客户端将通过 FS 数据输入流对象调用 read 方法读取所有文件, 从而向最近的数据节点发送请求. 读取完成后, 客户端将使用 close 方法结束会话.
写操作
与读取操作一样, 名称节点会确认客户端拥有正确的权限. 名称节点会确保检查系统中是否存在文件. 如果文件已经存在, 客户端将收到 IO 异常. 如果文件不存在, 客户端将与数据节点一起获得写入权限. 客户端完成后, 数据节点开始创建副本, 并向客户端发送确认信息.
Map Reduce
MapReduce 是一种编程模式, 可在 Hadoop 集群中的成百上千台服务器之间实现大规模扩展. 作为处理组件, MapReduce 是 Apache Hadoop 的核心. MapReduce 是分布式计算的一种处理技术和程序模式, 它基于 Java. (分布式计算是指一个系统或一台机器上有多个位于不同机器上的组件. 每个组件都有自己的工作, 但组件之间相互通信, 作为一个系统运行, 供最终用户使用).
MapReduce 算法包括两个重要任务--Map 和 Reduce.
Map接收输入文件, 通过处理和提取重要的数据信息并将其转换成键值对来执行一些映射任务, 这些就是初步的输出列表. 在将初步输出发送给Reducer之前, 还要进行一些重组.
Reducer使用多个映射函数, 并使用键值对数据进行聚合, 从而产生最终输出. MapReduce 通过创建唯一的键来跟踪任务, 以确保所有进程都在解决同一个问题.
MapReduce 有几个使用案例, 我们在此展示其中一些.
- MapReduce 可用于 LinkedIn 和 Instagram 等社交媒体平台, 分析谁访问, 查看了你的个人主页并与之互动.
- Netflix 使用 MapReduce, 根据用户的兴趣爱好推荐过去观看过的电影.
- 银行和信用卡公司等金融机构也使用它来标记和检测用户交易中的异常情况.
- 它还可用于广告行业, 通过用户参与广告的方式了解他们的行为. 谷歌广告通过使用 MapReduce 来了解用户对广告的参与情况.
Hive
Hive 是 Hadoop 中的一款数据仓库软件, 用于读写和管理大型表格型数据集和数据分析. Hive 具有可扩展性和快速性, 因为它是为处理 PB 级数据而设计的. 如果你熟悉 SQL, 就能轻松使用它, 因为 Hive 查询语言(或 Hive QL)基于 SQL. Hive 允许根据用户的要求执行数据清理和过滤任务.
数据仓库存储了来自许多不同来源的历史数据, 因此你可以从中分析和提取洞察力. 这些见解可用于报告.
Hive 支持以下文件格式:
- 由二进制键值对组成的序列文件, 在列式数据库中存储表列的记录列式文件以及文本或平面文件.
- RC 文件.
让我们来看看传统 RDBMS 和 Hive 之间的区别:
- 传统 RDBMS 用于维护数据库, 使用结构化查询语言 SQL. Hive 用于维护数据仓库, 使用 Hive 查询语言(一种受 SQL 启发的语言).
- 传统的 RDBMS 适合实时数据分析, 如来自传感器的数据. Hive 适合静态数据分析.
- 传统的 RDBMS 允许用户进行任意次数的读写操作. Hive 基于“一次写入, 多次读取”的方法.
- 传统的 RDBMS 可以处理多达 TB 的数据. Hive 可处理多达 PB 的数据.
- 另一个区别是, 传统的 RDBMS 强制要求在加载数据前必须验证模式. Hive 不强制要求模式验证加载数据.
- 最后, 传统的 RDBMS 可能并不总是内置支持数据分区的功能. Hive 支持分区. (分区指的是根据特定列(如日期或城市)的值将表分成几个部分).
该架构有三个主要部分:
- Hive 客户端: Hive 根据应用程序的类型提供不同的通信驱动程序. 例如, 对于基于 Java 的应用程序, 它使用 JDBC 驱动程序, 而其他类型的应用程序将使用 ODBC 驱动程序. 这些驱动程序与服务器进行通信.
- Hive 服务: 客户端交互通过 Hive 服务完成. 任何查询操作都在这里完成. 命令行界面是 Hive 服务的接口.
- 驱动程序接收查询语句, 监控每个会话的进度和生命周期, 并存储查询语句生成的元数据. 元存储存储元数据, 数据和每个表的相关信息, 如位置和模式. 元存储, 文件系统和作业客户端反过来与 Hive 存储和计算进行通信, 以执行以下操作: 表的元数据信息存储在某种数据库中, 查询结果和表中加载的数据存储在 Hadoop 集群或 HDFS 中.
Hive 架构详情:
- JDBC 客户端允许基于 Java 的应用程序连接到 Hive, ODBC 客户端允许基于 ODBC 协议的应用程序连接到 Hive.
- 架构中的 Hive 服务部分负责执行查询.
- Hive 服务器用于运行查询, 并允许多个客户端提交请求. 它支持 JDBC 和 ODBC 客户端.
- 驱动程序接收通过命令行提交的查询语句, 并在启动会话后将查询发送给编译器.
- 优化器对执行计划进行转换, 并拆分任务, 以帮助加快速度和提高效率.
- 执行器在优化器分割任务后执行任务.
- 元存储是元数据的存储空间, 也就是表的相关信息. 元存储负责将这些信息集中保存.
HBase
HBase 是在 HDFS 上运行的面向列的非关系型数据库管理系统. 它提供了一种存储稀疏数据集的容错方式. 它能很好地处理实时数据和对大数据的随机读写访问. HBase 用于写入量大的应用程序, 以存储大量数据集, 并实时处理和提供分析. 它被称为线性可扩展性, 因为它支持线性和模块形式的可扩展性. HBase 是 MapReduce 作业的备份支持. HBase 可以满足高速需求, 因为它提供一致的读写.
HBase 没有固定的列, 只由列族定义. 它为客户端访问提供了易于使用的 Java API. HBase 支持跨集群数据复制. HBase 列代表对象的属性.
举例说明:
如果表中存储的是来自医院心脏监护仪的传感器, 那么每一行都可能是一条日志记录. 典型的列可能包含病人的详细信息或记录日志的时间.
HBase 允许将许多属性组合到列族中, 这样列族中的所有元素都会被存储在一起. 例如, “患者姓名”和“患者年龄”将被存储为“患者详情”. HBase 中的列将看起来像:“患者详情”,“心率”和“时间戳”.
在 HBase 中创建模式时, 必须预先定义表模式并指定列族. 新列可随时添加到族中, 从而使模式灵活并适应不断变化的应用需求. 正如 HDFS 有名称节点和辅助节点一样, HBase 也是基于类似的概念构建的.
- 在 HBase 中, 一个主节点管理集群, 一个HRegionserver存储表的一部分并执行数据工作.
- 虽然 HBase 和 HDFS 都用于存储海量数据, 但其中一个主要区别是, HBase 以列和行的形式在表中存储数据, 而 HDFS 则以分布式的方式在网络上的不同节点上存储数据.
- HBase 允许动态更改, 而 HDFS 的僵化架构不允许更改. HBase 适用于记录级别的读, 写, 更新和删除类型的工作负载. HDFS 只是一个底层, 类似于文件系统的属性, 因此更适合一次写入和批量读取的工作负载.
- HBase 可用于存储和处理大数据, 而 HDFS 仅用于存储.
HBase 架构主要由四个部分组成:
-
HMaster(主服务器): 它监控HRegionserver实例, 将HRegion分配给HRegionserver, 并将服务分配给不同的HRegionserver, 同时管理对模式和元数据操作所做的任何更改.
-
HRegionserver: HRegionserver从客户端接收读写请求, 并将请求分配给列族所在的特定HRegion. 它们负责服务和管理分布式集群中的HRegion. HRegionserver无需一直通过 HMaster, 而是可以直接与客户端通信, 为请求提供便利.
-
HRegion: HRegion是 HBase 集群的基本构建元素和最小单位, 由列族组成. 它包含多个存储, 每个列族一个, 并有两个组件--HFile 和 Memstore.
-
ZooKeeper: ZooKeeper 是一种集中式服务, 用于维护配置信息, 以保持节点之间的健康链接. 它提供跨分布式应用程序的同步, 并通过触发错误消息来跟踪服务器故障和网络分区, 然后开始修复故障节点.
从架构中, 我们可以看到 HBase 是在 HDFS 的基础上运行的.
YARN
一个数据集 -> 多个应用程序
YARN 是一个资源管理层, 位于存储层 HDFS 的上方. YARN 与应用程序交互, 并调度资源供其使用. YARN 可以在 HDFS 上运行多个应用程序, 提高资源效率, 让你超越映射还原, 甚至超越数据并行编程模型.
Hadoop 最大的局限之一是无法支持非映射还原应用程序. 它的资源利用率很低. 这意味着, 对于图形分析等需要以不同方式建模和查看数据的高级应用, 你需要将数据转移到另一个平台. 如果数据量很大, 这将是一项艰巨的工作. 在 HDFS 和应用程序之间添加 YARN, 就可以构建新的系统, 专注于不同类型的大数据应用程序, 如用于图形数据分析的 Giraph, 用于流式数据分析的 Storm 和用于内存分析的 Spark. YARN 通过提供一个标准框架来支持 HADOOP 生态系统中的定制应用开发. YARN 可让你使用你认为最适合大数据的工具, 从而让你从数据集中获取最大收益.
在这张图片中, 请注意中间的资源管理器和右侧三个节点上的节点管理器.
- 资源管理器控制所有资源, 并决定谁获得什么.
- 节点管理器在机器级别运行, 负责管理单台机器.
资源管理器和节点管理器共同组成数据计算框架. 每个应用程序都有一个应用程序主控器. 它与资源管理器协商资源, 并与节点管理器对话以完成任务.
- 容器是一个抽象概念, 表示一种资源, 是 CPU 内存磁盘网络和其他计算资源的集合.
总结一下
今天的内容主要是设计并实现一个简单的分布式文件处理系统,该系统能够处理大规模数据文件,并将处理结果存储回HDFS. 实现文件的分布式读取、处理和存储功能,能编写MapReduce任务,对文件内容进行特定格式的解析和统计分析等。
好吧,今天的内容就分享到这里啦!
一家之言, 欢迎斧正!
Happy Coding! Stay GOLDEN!