目录
HAWQ 是一个 Hadoop 原生的 SQL 查询引擎,它结合了 MPP 数据库的关键技术和 Hadoop 的可扩展性。HAWQ 在原生的 HDFS 上读写数据,MPP 架构使 HAWQ 表现出超越其他 SQL on Hadoop 解决方案的查询性能,Hadoop 又为 HAWQ 提供了传统数据库所不具备的线性扩展能力。
一、HAWQ 的架构
在一个典型的 HAWQ 部署中,每个 slave 节点上会安装有一个 HAWQ 物理段,一个 HDFS 的 DataNode 和一个 NodeManager,而 HAWQ Master、HDFS NameNode 和 YARN 的主机则安装在(与 slave)分离的节点上。
下图提供了一个 HAWQ 典型部署的高级别架构视图。
HAWQ 与 Hadoop 的资源管理框架 YARN 紧密结合,为查询提供资源管理。HAWQ 在一个资源池中缓存 YARN 容器,然后利用 HAWQ 自身的细粒度资源管理,为用户或组在本地管理这些资源。当执行一个查询时,HAWQ 根据查询成本、资源队列定义、数据局部化和当前系统中的资源使用情况,为查询分配一组虚拟段。之后查询被分发到相应的物理主机,可能是节点子集或整个集群。每个 HAWQ 节点上的资源实施器监控着查询对资源的实时使用情况,避免违规的资源使用。
下图提供了构成 HAWQ 软件组件的另一个视图。
1. HAWQ 主节点(master)
HAWQ 主节点是系统的入口点,有一个接受客户端连接,并处理 SQL 命令的数据库进程。HAWQ 主节点解析查询,优化查询,向段分发查询,并协调查询执行。
最终用户通过主节点与 HAWQ 交互。可以使用如 psql 的客户端程序,或者类似 JDBC、ODBC 的应用程序接口(APIs)连接到数据库。
“全局系统目录”是一组系统表的集合,包含 HAWQ 系统自身的元数据,存储在主节点中。主节点本身不含任何用户数据,数据只存储在 HDFS 上。主节点对客户端连接请求进行鉴权,处理输入的 SQL 命令,在段间分发任务,协调每个段返回的结果,向客户端程序输出最终结果。
2. HAWQ 段(segment)
在 HAWQ 中,段是并行数据处理单元。每个主机上只有一个物理段,每个段可以为一个查询片段启动多个查询执行器(Query Executors ,QEs)。这使得单一的物理段表现得像多个虚拟段,从而使 HAWQ 能够更好地利用所有可用资源。注意:在本文档中,当我们提到段本身时,指的就是物理段。
一个虚拟段就像是 QE 的一个容器,每个虚拟段含有为查询片段启动的一个 QE。虚拟段的数量被用于确定一个查询的并行度(degree of parallelism,DOP)。段有别于主节点,原因是段:
- 无状态。
- 不存储数据库表元数据。
- 不存储本地文件系统中的数据。
主节点将 SQL 请求连同相关的元数据信息分发给段进行处理。元数据中包含所请求表的 HDFS url 地址,段使用该 URL 访问相应的数据。
3. HAWQ 互联
“互联”是 HAWQ 的网络层。当一个用户连接到数据库并发出了一个查询,每个处理查询的段上会创建多个进程。“互联”指的是段之间的进程间通信,以及通信所依赖的底层网络架构。互联使用标准的以太网交换结构。
缺省情况下,互联使用 UDP(User Datagram Protocol)在网络间传输消息。HAWQ 软件在 UDP 的功能之上执行附加的包验证,这就意味着 HAWQ 网络传输的可靠性相当于 TCP(Transmission Control Protocol),而在性能和可扩展性上却优于 TCP。如果使用 TCP 互联,HAWQ 有一个 1000 个段实例的扩展上限,而 UDP 作为当前互联使用的缺省协议,则没有这个限制。
4. HAWQ 资源管理器
HAWQ 资源管理器从 YARN 获取资源,并响应资源请求。资源被 HAWQ 资源管理器缓存,以支持低延时查询。HAWQ 资源管理器也能够以独立模式运行。在这种部署中,HAWQ 自己管理资源而不需要 YARN。
5. HAWQ 目录服务
HAWQ 目录服务存储全部元数据,例如 UDF/UDT 信息,表信息,安全信息和数据文件位置信息等。
6. HAWQ 容错服务
HAWQ 容错服务(FTS)负责接收从 segment 发来的心跳信息,并负责检测段是否失效。
7. HAWQ 分发器
HAWQ 分发器将查询计划分发到选择的段的子集上,并协调查询的执行。分发器和资源管理器是 HAWQ 的主要组件,分发器负责查询的动态调度。资源管理器负责执行查询资源需求。
原文:
http://hdb.docs.pivotal.io/211/hawq/overview/HAWQArchitecture.html
二、表的分布与存储
除系统表外,HAWQ 将其他所有表数据存储到 HDFS 中。当用户创建了一个表,其元数据存储到 master 主机上的本地文件系统中,表的数据存储到 HDFS 中。为了简化表数据管理,一个表中的所有数据都保存在一个 HDFS 目录中。对于所有 HAWQ 表存储格式,AO(Append-Only)和 Parquet,数据文件是可拆分的,因此 HAWQ 可以赋予多个虚拟段并发处理同一个数据文件,这提高了查询执行的并行度。
1. 表分布策略
HAWQ 缺省的表分布策略是随机分布。相对于使用表的哈希分布策略,随机分布有一些好处。例如,当集群扩容后,HAWQ 可以自动使用更多的资源,而不再需要重新分布数据。对于大表,重新分布数据的代价是很高的,当底层 HDFS 在执行 rebalance 操作,或者某些 DataNode 失效后,随机分布表的数据本地化会更好,而且集群规模越大,这种策略的优势越明显。
另一方面,对于某些查询,哈希分布的表会比随机分布快。例如,在一些 TPC-H 查询中,哈希分布表的查询性能更好。你应该依据你的应用场景选择最合适的分布策略。
2. 数据本地化
数据是跨越 HDFS 的 DataNode 分布存储的。由于远程读取会引入网络 I/O,HAWQ 使用一个数据本地化算法提升本地数据读取比例。当 HAWQ 给虚拟段分配数据块时,它考虑三个方面的因素:
- 本地读取比例。
- 数据文件连续读。
- 保持虚拟段间的数据平衡。
3. 外部数据访问
HAWQ 可以使用 Pivotal eXtension Framework(PXF)访问外部文件。PXF 是 HAWQ 的扩展框架,它允许 HAWQ 象读写 HAWQ 表一样来访问外部数据源的数据。PXF 中已经内建了多个连接器,用于访问 HDFS 文件,Hive 表和 HBase 表,并且 PXF 还与 HCatalog 集成,直接查询 Hive 表。
用户可以使用 PXF API 开发的 Java 插件,创建自己定制的 PXF 连接器,访问其他并行数据存储或处理引擎。
原文:
http://hdb.docs.pivotal.io/211/hawq/overview/TableDistributionStorage.html
三、运行时弹性查询
HAWQ 使用动态分配虚拟段为执行查询提供资源。HAWQ 1.x 时,用于执行一个查询的段(计算资源容器)的个数是固定的,无论底层查询是一个需要很多资源的大查询,还是一个需要很少资源的小查询。这种架构虽然简单,但资源使用低效。
为了解决这个问题,HAWQ 现在使用基于虚拟段的运行时弹性查询特性。HAWQ 会根据查询的成本,按需分配虚拟段。换言之,对于大查询,HAWQ 分配很多虚拟段,而只给小查询分配少数虚拟段。
1. 存储
在 HAWQ 里,虚拟段的个数会依据查询的成本而有所不同。为了简化表管理,与一个表相关的所有数据都存储到一个 HDFS 目录下。
对于所有 HAWQ 表存储格式,AO(Append-Only)和 Parquet,数据文件是可拆分的,因此 HAWQ 可以赋予多个虚拟段并发处理同一个数据文件,这提高了查询执行的并行度。
2. 物理段与虚拟段
在 HAWQ 里,每个主机只安装一个物理段,但运行查询时可以启动多个虚拟段。HAWQ 为查询按需分配多个分布于不同主机上的虚拟段。虚拟段是内存、CPU 等资源的容器。查询就是在虚拟段中被查询执行器所执行。
注意:在本文档中,当我们提到段本身时,指的就是物理段。
3. 虚拟段分配策略
依据虚拟段分配策略分配不同数量的虚拟段,以下因素决定了一个查询所使用的虚拟段个数:
- 查询运行时的可用资源。
- 查询成本。
- 表的分布策略,就是说,是随机分布表还是哈希分布表。
- 查询是否引入了 UDF 或外部表。
- 特定的服务器配置参数,比如针对哈希表查询的“default_hash_table_bucket_number”,以及“hawq_rm_nvseg_perquery_limit”等。
原文:
http://hdb.docs.pivotal.io/211/hawq/overview/ElasticSegments.html
四、资源管理
HAWQ 提供多种方法管理资源,包含多个用户配置选项,与 YARN 资源管理器的集成等。HAWQ 使用下面的机制进行资源管理:
- 全局资源管理。你可以将 HAWQ 与 YARN 资源管理器集成,在需要时请求或回收资源。如果不与 YARN 集成,HAWQ 可以管理它自己的资源,并排他地使用集群资源。如果你将 YARN 集成到 HAWQ,则 HAWQ 自动地从 YARN 获取资源,并通过内部定义的资源队列管理这些获得的资源。当资源不再使用时,被自动返回给 YARN。
- 用户定义资源队列等级。HAWQ 管理员或者超级用户设计和定义资源队列,用于为查询组织和分发资源。
- 查询运行时动态资源分配。HAWQ 根据资源队列的定义动态分配资源。HAWQ 会基于运行时(或排队中)的查询,以及当前资源队列的容量,自动分发资源。
- 虚拟段和查询的资源限制。你可以配置 HAWQ 强制虚拟段和用于查询的资源队列对 CPU 和内存的使用限制。
原文:
http://hdb.docs.pivotal.io/211/hawq/overview/ResourceManagement.html
五、HDFS 目录缓存
HDFS 目录缓存是 HAWQ 主节点用来确定 HDFS 上表数据分布信息的一种缓存服务。HDFS 在做 RPC 处理时会比较慢,尤其是当并发请求数很高时。
为了决定哪个段管理哪部分数据,HAWQ 需要从 HDFS 的 NameNode 获取数据的位置信息。HDFS 目录缓存就是用来缓存数据的位置信息,从而加快 HDFS 的 RPC 处理。
原文:
http://hdb.docs.pivotal.io/211/hawq/overview/HDFSCatalogCache.html
六、管理工具
HAWQ 的管理工具都被合并进一个 hawq 命令,该命令可以初始化、启动和停止每一个单独的段,并且支持集群的动态扩展。
原文:
http://hdb.docs.pivotal.io/211/hawq/overview/ManagementTools.html
hawq 命令的简要联机帮助如下图所示。
七、高可用、冗余和容错
HAWQ 通过系统冗余保证其集群的高可用性。HAWQ 的部署利用硬件平台的冗余,如用为主节点提供 RAID,为段提供 JBOD,为互联层提供网络冗余。在软件层面,HAWQ 通过主节点镜像和双集群维护提供冗余。另外,HAWQ 支持 HDFS 的 NameNode 高可用配置。
为了保持集群的健康,HAWQ 使用基于心跳和按需探查协议(on-demand probe protocols)的容错服务(Fault Tolerance Service,FTS)。它可以动态识别新加入的节点,也可以在节点变得不稳定时,将其从集群中删除。
1. 高可用
HAWQ 使用多种机制保证高可用性,其中对于 HAWQ 最重要的机制如下:
- 主节点镜像。万一主节点失效,集群还有一个备用主节点可用。
- 双重集群。管理员可以创建一个备用集群,并通过双重 ETL 或者备份与恢复机制同步主集群的数据。
除在 HAWQ 级别管理高可用外,你可以在 HDFS 中实现 NameNode 的高可用,从而为 HAWQ 提供高可用性。
2. 段容错
HAWQ 中的段是无状态的,这保证了段能够快速恢复,并且有更好的可用性。当一个段失效时,该段被从资源池中删除,查询不会再被分发到该段。当失效段重新可用时,容错服务验证该节点有效后,将它添加回资源池。
3. 互联冗余
互联指的是段和段之间的进程间通信,以及通信所依赖的网络架构。可以通过在网络中部署双重千兆以太网交换机,并部署与 HAWQ 主机服务器(主节点和段)冗余的千兆连接。为了在 HAWQ 中使用多个网卡,需要进行网卡绑定。
原文:
http://hdb.docs.pivotal.io/211/hawq/overview/RedundancyFailover.html