1. HAWQ 是什么
如果你知道Greenplum是什么,那么你就能很简单的明白HAWQ是什么。Greenplum是一个关系型的分布式MPP数据库,同样运行于X86架构的基础之上,具有查询、加载效率高,支持TB/PB级大数据量的OLAP应用, Greenplum的所有数据都存储于系统本地文件系统中。而HAWQ的最大改变就是将本地文件系统存储更换为了HDFS,成功的搭上了大数据库的班车。不过HAWQ相较于其它的SQL on Hadoop组件来说,也是具有很多优势的,比如:
- 对SQL的完善支持,以及语法上的OLAP扩展支持
- 具有比较成熟的SQL并行优化器,而这正是其它SQL on Hadoop组件比较欠缺的。
- 支持ACID事务特性,这个在其它SQL on Hadoop组件也是比较欠缺的。
- 支持多语言的UDF支持:Python, Perl, Java, C/C++, R
- 等等,反正比较牛B,原Greenplum上支持的功能在HAWQ基本都能找到。
2. HAWQ 结构
HAWQ在结构仍然是Master-Slave的主从模式,典型的部署方式仍然是在Master服务器上部署:HAWQ Master, HDFS Master, YARN ResouceManager, 在每一个SLAVE机器上部署: HAWQ segment, DataNode, NodeManager。具体结构看图:
下面是一张HAWQ的软件组件图:
可以看出HAWQ包含了好几个重要的组件,分别是:
1. HAWQ Master
HAWQ Master是整个系统的接口,它负责接收客户端查询请求,解析SQL,优化查询,分发和协调查询的执行。当然作为老大,任务肯定不是这么简单的,它还得负责global system catalog
的管理工作。
2. HAWQ Segment
Segments是并行处理数据的单元。每一个Slave机器上部署的HAWQ程序叫作物理Segment,而且第一台Slave上只能部署一个物理Segment。一个物理Segment上可以运行多个虚拟Segment(一个查询解析后的并行分片就是虚拟Segment).虚拟Segment的数量决定了一个查询的并行度。
3. HAWQ Interconnect
Segment之间的高速通信网络,默认采用UDP协议,并且HAWQ软件提供了针对UDP额外的数据包验证。使其可靠性接近于TCP,但性能和可扩展性又比TCP好。HAWQ也可以使用TCP进行通信,但有最大1000个Segment的限制。而使用UDP则没有该限制。
4. HAWQ Resource Manager
HAWQ资源管理用于从YARN获取资源并响应资源请求。同时HAWQ会缓存资源用于低延迟的查询请求。除了使用YARN来管理资源外,HAWQ还可以使用自带的资源管理器,而不需要YARN.
5. HAWQ Catalog Service
元数据服务存在于HAWQ Master中。作用肯定就是用于存储metadata.比如UDF,表信息等。以及提供元数据的查询服务。
6. HAWQ Fault Tolerance Service
容错服务自然就是针对各个Segment节点的状态监控和失败处理等工作。
7. HAWQ Dispatcher
HAWQ分发器是则是分发查询到指定的Segment上和coordinates上进行执行。
3. HAWQ 安装
如果你安装过Greenplum,那么你会发现HAWQ的安装过程与Greenplum是极期相似,必竟它们两可以说是不同存储的版本。而整个安装过程相对其它实时组件来说,还是比较繁琐的。同时也可以看出来HAWQ是基于HDFS的独立数据库。而不像其它实时查询组件除了HDFS,可能还需要依赖于其它Hadoop组件。
本文的测试环境为基于CDH 5.5的Hadoop集群环境的安装和测试。HAWQ的版本为:2.0.0, 另外HAWQ还可以使用Ambari图形界面安装。发竟安装过程请看:
1. 设置系统参数,更改文件/etc/sysctl.conf,增加内容:
kernel.shmmax = 1000000000
kernel.shmmni = 4096
kernel.shmall = 4000000000
kernel.sem = 250 512000 100 2048
kernel.sysrq = 1
kernel.core_uses_pid = 1
kernel.msgmnb = 65536
kernel.msgmax = 65536
kernel.msgmni = 2048
net.ipv4.tcp_syncookies = 0
net.ipv4.ip_forward = 0
net.ipv4.conf.default.accept_source_route = 0
net.ipv4.tcp_tw_recycle = 1
net.ipv4.tcp_max_syn_backlog = 200000
net.ipv4.conf.all.arp_filter = 1
net.ipv4.ip_local_port_range = 1281 65535
net.core.netdev_max_backlog = 200000
vm.overcommit_memory = 50
fs.nr_open = 3000000
kernel.threads-max = 798720
kernel.pid_max = 798720
# increase network
net.core.rmem_max=2097152
net.core.wmem_max=2097152
然后使用命令sysctl -p生效
2. 更改文件/etc/security/limits.conf,增加内容:
* soft nofile 2900000
* hard nofile 2900000
* soft nproc 131072
* hard nproc 131072
3. 安装epel-release包。该包在 http://fedoraproject.org/wiki/EPEL 官网下载后,安装到每一台集群节点上:
rpm -ivh epel