概览

【HAWQ】是一个Hadoop原生的大规模并行SQL分析引擎(SQL on Hadoop),针对的是分析性应用,和其他的关系型数据库类似:接收SQL,返回结果集。


其中,【原生】主要体现在以下几个方面:

  • 数据都存储在HDFS上面:不需要使用Connector模式
  • 高扩展性:和其他Hadoop组件一样,高扩展,并且具有高性能
  • 原生的代码存取:和其他的Hadoop项目一样,HAWQ是Apache项目,用户可以自由的下载、使用和贡献
  • 透明:用Apache的方式开发软件,所有共呢个的开发以及讨论都是公开的,用户可以自由参与
  • 原生的管理:可以通过Ambari部署,资源可以从YARN分配,与其他的Hadoop组件可以运行在同一个集群

HAWQ具有大规模并行处理很多传统数据库以及其他的数据库没有的特性与功能,如下:

  • 对标准的完善支持,比其他的Hadoop SQL引擎都要完善
    • ANSI SQL标准
    • OLAP扩展
    • 标准JDBC/ODBC支持
  • 具有MPP(大规模并行处理系统)的性能,比其他Hadoop里面的SQL引擎快数倍
  • 具有非常成熟的并行优化器:优化器是并行SQL引擎的重要组成部分,对性能影响很多,尤其是对复杂查询
  • 支持ACID事务特性:这是很多现有基于Hadoop的SQL引擎做不到的,对保证数据一致性很重要
  • 动态数据流引擎:基于UDP的高速互联网络
  • 弹性执行引擎:可以根据查询大小来决定执行查询使用的节点,以及Segment个数
  • 支持多种分区方法以及多级分区,比如:List分区和Range分区;分区表对性能有很大帮助,比如:你只想访问最近一个月的数据,查询只需要扫描最近一个月数据所在分区
  • 支持多种压缩方法:
    • snappy
    • gzip
    • quicklz
    • RLE
    • 等等
  • 多种UDF(用户自定义函数)语言支持
    • Java
    • Python
    • C/C++
    • Perl
    • R
    • 等等
  • 动态扩容:动态按需扩容,按照存储大小或计算需求,秒级添加节点
  • 多级资源或负载管理:和外部资源管理器YARN集成,可以管理CPU、Memory资源等,支持多级资源队列,方便的DDL管理借口
  • 支持访问任何HDFS以及其他系统的数据:各种HDFS格式以及其他的外部系统,并且用户可以开发插件来访问新的数据源
    • HDFS格式
      • 文本
      • SequenceFile
      • Avro
      • Parquet
      • 等等
    • 其他外部系统
      • HBase
  • 原生的机器学习数据挖掘哭MADLib支持,易于使用,以及高性能
  • 与Hadoop系统无缝集成:存储、资源、安装部署(Ambari)、数据格式、访问等等
  • 完善的安全及权限管理:Kerberos;数据库、表等各个级别的授权管理
  • 支持多种第三方工具:比如,Tableau、SAS、交心的Apache Zeppelin等
  • 支持对HDFS和YARN的快速访问库:libhdfs3和libyarn(其他项目也可以使用)
  • 支持在本地、虚拟环境或者在云端部署

一个典型的HAWQ集群的主要组件

组件图:

Master节点:

  • HAWQ Master
  • HDFS Master:NameNode
  • YARN Master:ResourceManager

Slave节点 / 部署了以下服务:

  • HDFS:DataNode
  • YARN:NodeManager
  • HAWQ Segment

HAWQ元数据服务:

  • 当前,在节点【HAWQ Master】中
  • 未来,会作为独立的服务

HAWQ Segment在执行查询的时候会启动多个QE(Query Executor,查询执行器)
查询执行器:运行在资源容器里面


HAWQ / 软件内部架构图:

HAWQ Master节点内部有以下几个重要组件:

  • 查询解析器(Parser / Analyzer):负责解析查询,并检查语法以及语义,最终生成查询树,并传递给优化器
  • 优化器:负责接收查询树,生成查询计划,针对一个查询,可能有数亿个可能的等价的查询计划,但执行性能差别很大,优化器的作用是找出最优的查询计划
  • 资源管理器:资源管理器通过【资源代理】向全局资源管理器(比如YARN)动态申请资源,并缓存资源;在不需要的时候返回资源;我们缓存资源的主要原因是:减少HAWQ与全局资源管理器之间的交互代价;HAWQ支持毫秒级查询,如果每一个小的查询都去向资源管理器申请资源,这样的话,性能会收到影响,资源管理器同时需要保证查询不使用超过分配给该查询的资源,否则查询之间会相互影响,可能导致系统整体不可用
  • HDFS元数据缓存:用于HAWQ确定哪些Segment扫描表的哪些部分;HAWQ是把计算派遣到数据所在的地方,所以我们需要匹配计算和数据的局部性;这些都需要HDFS块的位置信息;位置信息存储在HDFS的NameNode上;每个查询都访问HDFS NameNode,会造成NameNode的瓶颈,所以我们在HAWQ Master节点上建立了HDFS元数据的缓存
  • 容错服务:负责检测哪些节点可用,哪些节点不可用;不可用的机器会被排除资源池
  • 查询派遣器:优化器优化完查询以后,查询派遣器派遣计划到各个节点上执行,并协调查询执行的整个过程;查询派遣器是整个并行系统的粘合剂
  • 元数据服务:负责存储HAWQ的各种元数据,包括数据库和表信息,以及访问权限信息等;另外,元数据服务也是实现分布式事务的关键
  • 高速互联网络:负责节点之间传输数据,这是软件实现的,基于UDP技术

在Slave节点上安装有一个物理Segment;
在查询执行的时候,针对一个查询,弹性执行引擎会启动多个虚拟Segment同时执行查询,节点间数据交换通过Interconnect(高速互联网络)进行;

如果一个查询启动了1000个虚拟Segment,意思是这个查询被均匀的分成了1000份任务,这些任务会并行执行;
所以说,虚拟Segment数量其实表明了查询的并行读;

查询的并行度是由弹性执行引擎,根据查询大小,以及当前资源使用情况,动态确定的;


查询的主要流程:

用户通过JDBC/ODBC提交查询;
查询解析器得到查询树;
然后优化器根据查询树生成查询计划;
派遣器和资源管理器打交道,得到资源,并分解查询计划;
然后,派遣计划到Segment的执行器上面执行;
最终结果会传回给用户;

并行查询计划示例:

如图所示,这个查询包含一个连接、一个表达式和一个聚集;
图中有两个查询计划,简单来看,并行查询计划和穿行查询计划最不同的是多了一些Motion操作符;
Motion负责在节点之间交换数据,底层是通过高速互联网实现的;

有三种Motion:

  • Redistribution Motion:负责按照Hash键值重新分布数据
  • Broadcast Motion:负责广播数据
  • Gather Motion:负责搜集数据到一起

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.

隐藏
变装