HAWQ技术解析(三) —— 基本架构

        HAWQ是一个Hadoop原生的SQL查询引擎,它结合了MPP数据库的关键技术和Hadoop的可扩展性。HAWQ在原生的HDFS上读写数据,MPP架构使HAWQ表现出超越其它SQL on Hadoop解决方案的查询性能,Hadoop又为HAWQ提供了传统数据库所不具备的线性扩展能力。

一、HAWQ的架构

        在一个典型的HAWQ部署中,每个slave节点上会安装有一个HAWQ物理段,一个HDFS的DataNode和一个NodeManager。而HAWQ、HDFS和YARN的主机则安装在(与slave)分离的节点上。

        下图提供了一个HAWQ典型部署的高级别架构视图。

        HAWQ与Hadoop的资源管理框架YARN紧密结合,为查询提供资源管理。HAWQ在一个资源池中缓存YARN容器,然后利用HAWQ自身的细粒度资源管理,为用户或组在本地管理这些资源。当执行一个查询时,HAWQ根据查询成本、资源队列定义、数据局部化和当前系统中的资源使用情况,为查询分配一组虚拟段。之后查询被分发到相应的物理主机,可能是节点子集或整个集群。每个HAWQ节点上的资源实施器监控着查询对资源的实时使用情况,避免违规的资源使用。

        下图提供了构成HAWQ软件组件的另一个视图。

1. HAWQ主节点

        HAWQ主节点是系统的入口点,有一个接受客户端连接,并处理SQL命令的数据库进程。HAWQ主节点解析查询,优化查询,向段分发查询,并协调查询执行。

        最终用户通过主节点与HAWQ交互。可以使用如psql的客户端程序,或者类似JDBC、ODBC的应用程序接口(APIs)连接到数据库。

        “全局系统目录”是一组系统表的集合,包含HAWQ系统自身的元数据,存储在主节点中。主节点本身不含任何用户数据,数据只存储在HDFS上。主节点对客户端连接请求进行鉴权,处理输入的SQL命令,在段间分发任务,协调每个段返回的结果,向客户端程序输出最终结果。

2. HAWQ段

        在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

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏CSDN技术头条

日处理20亿数据,实时用户行为服务系统架构实践

携程实时用户行为服务作为基础服务,目前普遍应用在多个场景中,比如猜你喜欢(携程的推荐系统)、动态广告、用户画像、浏览历史等等。 以猜你喜欢为例,猜你喜欢为应用内...

29310
来自专栏运维前线

CentOS 6.8 安装JStorm集群(jstorm-2.1.1 )

Alibaba JStorm 是一个强大的企业级流式计算引擎,是Apache Storm 的4倍性能, 可以自由切换行模式或mini-batch 模式,JSto...

2556
来自专栏大数据和云计算技术

大数据和云计算技术周报(第40期):NoSQL特辑

本期有 HBase、HBase+ES、StreamSets、explain、Cassandra、Redis。 希望大家会喜欢!

962
来自专栏云加头条

CRS : 腾讯云 Redis 产品架构解析

Redis作为key-value数据库里的最热门的一员,在保持key-value数据库的简单快速的优点基础上,具有一些部分关系数据库的优点,例如数据结构丰富、操...

2.3K2
来自专栏杨建荣的学习笔记

明天,实现几个还不错的功能点

明天,计划实现几个还不错的功能,算是个自己这段时间的运维里程碑划上一个句号。里程碑是自己制定的,目的是督促自己做事情有一个预期目标,在糟糕的实现中不断迭...

1062
来自专栏UDNZ

软件系统的黑匣子:我们要怎样写日志

作为一个软件系统,需要写日志,这是不言而喻的,这是大家都会不假思索地说“那当然”的事。不论是什么语言,写日志的专用框架也不一而足,写到文本的,写到数据库的,写到...

4389
来自专栏人工智能

使用Apache Spark的微服务的实时性能分析和分析

作为一种架构风格,微服务因其极高的灵活性,越来越受欢迎。应用程序在功能上分解为一组松散耦合的协作服务,通过定义良好的(REST)API进行交互。通过采用这些设计...

2645
来自专栏Spark学习技巧

从零开始 Spark 性能调优

1683
来自专栏芋道源码1024

互联网后端基础设施

使用Java后端技术的目的就是构建业务应用,为用户提供在线或者离线服务。因此,一个业务应用需要哪些技术、依赖哪些基础设施就决定了需要掌握的后端技术有哪些。纵观整...

1242
来自专栏架构之路

大数据时代的技术hive:hive介绍

  我最近研究了hive的相关技术,有点心得,这里和大家分享下。   首先我们要知道hive到底是做什么的。下面这几段文字很好的描述了hive的特性:   1....

3024

扫码关注云+社区