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 条评论
登录 后参与评论

相关文章

来自专栏开源项目

实用的国产优秀开源中间件 | 码云周刊第 52 期

在系统软件之中,操作系统、数据库、中间件的三驾马车,中间件是最神秘的,而且是一个专业化非常强的细分产业。中间件技术主要用来支撑分布式软件的开发,在大型分布式软件...

3918
来自专栏IT技术精选文摘

窥探Nginx内部实现:如何为性能和规模进行设计

NGINX在网络性能方面处于领先地位,这一切都是由于软件的设计方式。尽管许多Web服务器和应用程序服务器使用简单的线程或基于进程的架构,但NGINX具有复杂的事...

1935
来自专栏云原生架构实践

微服务架构风格

通过将一个应用程序设计构建为一组松散耦合的协作服务。每个服务都实现了一部分的相关功能。对应于Scale Cube(参考分布式系统三维可缩放模型)的Y轴。

1308
来自专栏即时通讯技术

腾讯资深架构师干货总结:一文读懂大型分布式系统设计的方方面面

我们常常会听说,某个互联网应用的服务器端系统多么牛逼,比如QQ、微信、淘宝。那么,一个大型互联网应用的服务器端系统,到底牛逼在什么地方?为什么海量的用户访问,会...

1052
来自专栏芋道源码1024

一个简单的分布式事务系统的实现(订单系统)

背景:公司最早的一个版本的订单管理,是通过PHP+mysql的方案去实现的,这样会有什么问题呢,假设如果放到一个实例里面,全部用一个单机事务去解决...

1002
来自专栏Java技术栈

高可用高并发的 9 种技术架构!

分层是企业应用系统中最常见的一种架构模式,将系统在横向维度上切分成几个部分,每个部分负责一部分相对简单并比较单一的职责,然后通过上层对下层的依赖和调度组成一个完...

1365
来自专栏Java帮帮-微信公众号-技术文章全总结

Java在游戏服务器开发中应用【面试+提高】

Java在游戏服务器开发中的应用 随着游戏市场的兴起,特别是网页游戏、手机游戏的崛起,对游戏开发技术的需求越来越多。网络游戏开发是一个庞大的体系,总体来说是客户...

43411
来自专栏CSDN技术头条

架构师于小波:魅族实时消息推送架构

【编者按】此文是根据魅族架构师于小波在msup和魅族联合举办的#魅族技术开放日#的演讲中的分享内容整理而成,于小波分享了魅族实时消息推送架构的其中遇到的坑和一些...

2557
来自专栏蓝天

成功的 Web 应用系统性能测试

基于Web服务器的应用系统由于提供浏览器界面而无须安装,大大降低了系统部署和升级成本,得以普遍应用。目前,很多企业的核心业务系统均是Web应用,但当Web应用的...

874
来自专栏架构说

同程凤凰缓存系统基于Redis的设计与实践

2012~2014年,我们的业务开始使用一种新的互联网销售模式——秒杀抢购,一时间,各个产品线开始纷纷加入进来,今天秒杀门票,明天秒杀酒店,等等。各种活动是轮番...

703

扫码关注云+社区