HDFS

HDFS 是构建在低成本机器上的大数据存储服务,其提供高容错以及高吞吐的数据访问。HDFS 暴露一个文件系统的组织形式,与一般的文件系统类似,可以对文件进行移动、重命名、删除、追加写等操作,但不支持随机写。

HDFS的优点:

  • 处理超大文件
  • 支持流式数据访问
  • 低成本运行

HDFS的缺点:

  • 不适合处理低延迟的数据访问
  • 不适合处理大量小文件
  • 不适合多用户写入以及任意修改文件

HDFS 的物理结构比较简单,在一个 HDFS 集群中拥有唯一一个 NameNode 以及多个 DataNode。 文件的数据会被拆分为一个或多个 Block,Block 实际存储在 DataNode 中。 NameNode 负责管理集群的元数据,包括文件系统的命名空间、副本个数以及 Block Id。为保证数据的安全性,HDFS 默认会把文件复制 3份,并通过一定的分配算法分配到不同的 DataNode。

文件写入

  1. 当客户端需要写数据时,会先从 NameNode 获取文件的元信息
  2. 客户端和 NameNode 返回的 DataNode 建立连接,多个 DataNode 会建立一个数据 Pipeline
  3. 客户端将数据写入第一个 DataNode,第一个DataNode 会将数据通过 Pipeline 传递下去
  4. 当所有数据写入完成后,客户端会通知 NameNode 写入成功

文件读取

文件的读取步骤和写入类似,会更简单

  1. 客户端从 NameNode 获取文件的元信息(DataNode 的地址等)
  2. 客户端连接 DataNode 获取指定 Block 数据

Hive

Hive 是一个基于 HDFS 存储的数据库工具,可以将结构化的文件映射为数据库表,并提供类似 SQL 的查询功能。为用户提供了一个简单可扩展的查询工具,降低 MapReduce 的学习和使用成本。

Hive 支持 HDFS 上的各种类型文件,只需要在建表过程指定行、列的分隔符。 Hive 表的元数据存储在传统的关系型数据库中,包括表的名字、列、分区以及目录等。Hive 在接收到 SQL 查询后,会通过解析、编译、优化最终通过 MapReduce 执行。

HBase

HBase 是基于 HDFS 的实时读写 NoSQL 数据库, 每个数据行都拥有唯一的 RowKey, 并且只能通过 RowKey 对数据进行查询和索引。 HBase 会根据 RowKey 对表进行水平拆分,划分为不同的 Region。 Region 存储在 RegionServer 上,单个 RegionServer 可以存储上千个 Region。

  • RegionServer 负责处理数据的读写操作,客户端直接与 RegionServer 交互
  • HMaster 负责 Region 的分配以及表的 DDL 操作
  • ZooKeeper 负责维护集群状态

数据表的元信息,包括 Region 的存放地址都存储在 HMaster 中。在一个 HBase 集群里会存在多个 HMaster,但同时只能有一个 Active HMaster。HBase 通过 Zookeeper 来实现选主操作,以及故障恢复。当 Active HMaster 失效后,其他备选的 HMaster 会重新参与选主。除此之外 Zookeeper 还会负责监控 RegionServer 的状态,当 RegionServer 不可用时 Active HMaster 会对故障数据进行恢复。

读写操作

在 HBase 集群中会将所有的 Region 元数据保存在一个 Meta Table 的表中,并且 Zookeeper 会记录这张表的地址。一个典型的读写操作流程如下:

  1. 客户端从 Zookeeper 获取 Meta Table 地址
  2. 客户端从对应 RegionServer 获取 Meta Table,并查找当前操作数据所在 RegionServer
  3. 客户端访问当前数据所在 RegionServer,并执行相关操作

特性

  • 读写强一致性,当数据成功写入后,所有查询均返回新数据
  • 自动分片,自动拆分 Region
  • 自动故障转移
  • 海量数据存储,单表可以存储上百亿行、百万列,支持 PB 级别数据
  • 稀疏的列存储,为空的列并不占用存储空间

参考