Apache HAWQ部署与初步测试

Apache HAWQ是目前社区比较火的一种SQL-on-Hadoop方案,由Pivotal公司开发并贡献给了Apache社区。HAWQ的技术与构架源自于业界顶尖的MPP数据库Greenplum,是传统的高性能分析型数据库与Hadoop相结合的一次尝试,其兼具了MPP架构数据库卓越的分析性能与Hadoop的可高扩展性,容错性。

本文主要描述HAWQ的基本概念,在HDP集群中的部署以及初步测试。


HAWQ架构概述

HAWQ的架构如下图所示:

HAWQ架构是分布式系统中经典的master-slave模式,主要分为下面三个服务:

HAWQ master:HAWQ master是整个系统的入口点,负责接收和认证客户端的连接请求,处理客户端提交的SQL命令,解析并优化查询,向集群的各个Segemt节点下发查询并合理分布负载,协调从各Segemt节点返回的子查询结果,向客户端程序返回合并后的最终处理结果。HAWQ master内部由HAWQ Resource Manager,HAWQ Catalog Service,HAWQ Fault Tolerance Service,HAWQ Dispatcher等组件组成。HAWQ master还需要维护global system catalog,global system catalog是系统表的集合,其中包含了HAWQ集群的元数据信息;HAWQ master上不包含任何用户数据,所有数据都在HDFS上。

HAWQ segment:HAWQ segment是HAWQ集群的计算节点,负责大规模查询的并行处理;HAWQ segment节点本身不存储任何数据和元数据,所有需要处理的数据都存储在底层的HDFS上,segment本身只负责计算,是无状态的;HAWQ master在分派SQL请求给Segment时会附带相关的元数据信息,元数据信息里包含了需要处理的表的HDFS URL,Segment通过元数据里的HDFS URL访问SQL请求需要处理的数据。

PXF agent:PXF(HAWQ Extension Framework)是一个允许HAWQ访问外部系统数据的可扩展的框架,PXF内置了访问HDFS文件,HBase表以及Hive表的连接器(connectors),PXF还可以通过和HCatalog集成来直接访问Hive表;PXF允许用户通过开发新的连接器来访问其它并行数据存储和处理引擎。PXF agent是PXF的服务,需要部署在集群的Segment节点上。

在HAWQ集群中,master节点上需要启动HAWQ master,HDFS namenode和Yarn resourcemanager;每个slave节点上需要启动HAWQ segment,PXF agent,HDFS datanode和Yarn nodemanager。HAWQ集群的数据直接存储在HDFS上,可以集成Yarn来进行计算资源管理(HAWQ自身也提供了不依赖于Yarn的Standalone模式,Ambari部署的HAWQ默认是Standalone模式,用户可以在Ambari页面上自行切换);HAWQ也可以通过PXF查询HBase和Hive的库表。

用户通过连接master节点来与HAWQ集群交互,可以使用数据库客户端程序(psql)或者JDBC和ODBC这样的API连接HAWQ的库表。

用户通过连接HAWQ master服务与HAWQ集群交互。和大多数Hadoop组件类似,HAWQ也提供了命令行和API两种交互方式:由于HAWQ继承自Greemplum/PostgresSQL技术栈,所以天然的选择了PostgresSQL的客户端程序psql作为命令行工具去连接HAWQ库表,提交SQL查询;HAWQ支持JDBC和ODBC作为编程接口,第三方程序可以通过JDBC/OCBC方式访问HAWQ。


通过ambari安装HAWQ

Pivotal官方提供了HAWQ的发行版,即Pivotal HDB

Hortonworks的Hadoop发行版Hortonworks Data Platform(HDP)从2.2.4.2版本开始支持集成Pivotal HDB,HDP的用户可以直接在HDP集群中利用Ambari完成HAWQ的敏捷部署和运维。HAWQ版本和HDP/ambari以及操作系统版本的对应关系如下图所示:

从上图可知,HAWQ的最新发布版是2.3.0.0,对应的HDP版本是2.6.1,ambari版本是2.5.1。而且,HAWQ直到最近的两个发布版才支持7.2以上版本的RHEL/CentOS。

设置本地源

首先需要从HAWQ官网(network.pivotal.io/products/pivotal-hdb)下载HAWQ安装包的tar.gz文件到集群的yum源上。HAWQ安装包下载完成后,按如下步骤完成HAWQ的本地源搭建:

- 在yum服务器上创建存放HAWQ安装文件的目录,解压之前下载的文件并设置权限:

[root@host-10-1-236-146 ~]#  mkdir /staging

[root@host-10-1-236-146 ~]# chmod a+rx /staging

[root@host-10-1-236-146 ~]# cd /staging/

[root@host-10-1-236-146 staging]# tar xvf hdb-2.3.0.0-4600.el7.tar.gz

[root@host-10-1-236-146 staging]# cd hdb-2.3.0.0/

- 运行HAWQ安装包里的setup_repo.sh脚本(注意将脚本中的DOCUMENT_ROOT修改为当前yum服务器的实际目录,其默认为/var/www/html)完成yum源配置,生成repo文件:

- 将生成的yum repo文件拷贝到HDP集群的ambari节点的/etc/yum.repo.d/下面

- 在ambari节点上运行yum clean all && yum update测试hawq的yum源是否生效

安装HAWQ Ambari plug-in

Ambari本身不支持HAWQ的安装,ambari正常安装启动起来之后在服务添加页面是看不到HAWQ的,所以需要安装Pivotal开发的HAWQ插件。HAWQ Ambari plug-in会提供HAWQ的安装和服务管理脚本。

可以按照如下步骤安装HAWQ Ambari plug-in:

- 在ambari server上安装HAWQ Ambari plug-in的rpm包:

[root@host-10-1-241-55 ~]# yum install -y hawq-ambari-plugin

(安装完成之后,HAWQ Ambari plug-in会在ambari server上创建一个本地目录(/var/lib/hawq)来放置一些所需的脚本和模版文件)

- 通过运行HAWQ Ambari plug-in提供的python脚本(/var/lib/hawq/add-hawq.py)为Ambari server添加HAWQ的源(脚本执行时需要确保ambari-server服务正常运行):

./add-hawq.py --user admin --password admin --stack HDP-2.6 --hawqrepo http://host-10-1-236-146/hdb-2.3.0.0

(脚本的参数依次为:ambari server的admin用户名,ambari server的admin用户密码,HDP stack版本,hawq源的地址)

- 重启ambari-server

- 登陆到Ambari UI,既可在服务添加页面看到HAWQ相关的服务安装选项:

通过Ambari页面安装HAWQ

安装好HAWQ Ambari plug-in并将Pivotal HDB的本地源加入Ambari后,我们就可以通过Ambari的图形化界面进行HAWQ的安装了。

安装步骤如下:

- 在Ambari的Add Service Wizard里,选择HAWQ和PXF

- 分配HAWQ master和HAWQ Segment,PXF Agent到集群中的机器:

- 配置HAWQ master和segment的数据存储目录,ambari默认设置为服务器本地的/data/hawq/master和/data/hawq/segment目录;

另外,需要确保hawq的启动用户(Ambari默认为gpadmin)可以访问上述数据存储目录,否则HAWQ服务将启动失败。

- 配置HAWQ Master服务的监听地址,Ambari默认值为5432,这个端口也是PostgresSQL的默认监听端口,所以如果HAWQ Master本地并安装启动了PostgresSQL的话,HAWQ Master就需要使用其他端口,否则会造成端口冲突。

- 选择下一步Review整个HAWQ集群的配置

- 点击Deploy部署HAWQ集群

- 如果HAWQ的部署过程中出现类似于下图的错误,说明集群中缺少HAWQ所需的依赖;需要管理员在集群中的每台机器上手动安装下图中Ambari错误提示中缺少的三个rpm包:libsasl,protobuf,thrift;需要注意的是,手动安装的上述三个rpm包的版本和适配的操作系统版本需要和HAWQ版本以及当前集群的操作系统一致。

如果在集群的yum源或者操作系统镜像中没有找到上述rpm包,则需要从互联网中自行下载并安装。这里推荐一个专门搜索和下载rpm包的网站:rpmfind.net,通过它可以搜索并下载各种常见的rpm依赖,并且提供多种操作系统的版本

- 部署完成之后,在Ambari页面查看HAWQ各个组件的状态

- 如果在HAWQ启动和后续的使用过程中,出现和HDFS有关的问题,可能需要调整HDFS的参数,具体可以参考Pivotal官网的在线文档(Procedure部分的第9小节):hdb.docs.pivotal.io/212/hdb/install/install-ambari.html

- 由于HAWQ自身没有像HDFS或者Yarn那样提供用于服务监控和配置管理的图形用户界面(Web UI),所以用户需要通过Ambari完成HAWQ的服务管理,服务监控以及配置管理相关任务的图形化操作。

- 如果在RHEL/CentOS 7.2的环境上部署HAWQ,会遇到从gpadmin用户logout之后re-login,就无法访问HAWQ的情况(无法执行HAWQ管理命令,也无法用psql提交sql):

HAWQ master的日志(/data/hawq/master/pg_log/hawq-xxx.csv)报错如下:

导致这个问题的原因是,RHEL/CentOS 7.2的systemd会在用户退出登陆后默认清除信号量(semaphores),这会影响与HAWQ的交互。解决办法是:停止HAWQ集群,以root身份修改systemd的配置,关闭RemoveIPC选项并重启systemd-logind,然后重新拉起HAWQ集群:

(参考:Re: problem on AMD FX-8350)


测试HAWQ

HAWQ在HDP集群中安装启动完成后,我们就可以开始使用HAWQ进行数据分析了。

设置HAWQ运行环境

Ambari会为HAWQ集群创建一个名为gpadmin(HAWQ的技术架构和源代码出于Greenplum,所以很多配置项的命令都以gp开头~)的服务账户,HAWQ相关服务由该用户身份启动,所以用户执行HAWQ的管理命令(如hawq,hawq_ctl等)或者提交SQL也需要gpadmin的用户身份。

在HAWQ集群上设置HAWQ运行环境需要如下工作:

- 登录到HAWQ集群中任何一个节点并切换到到gpadmin用户

- Source HAWQ的环境变量设置脚本:/usr/local/hawq/greenplum_path.sh

- 如果部署HAWQ集群时没有使用HAWQ master的默认端口(5432),则需要增加一个指向HAWQ master实际配置的端口的环境变量:PGPORT

- 可以上述设置HAWQ环境变量的相关命令写入gpadmin用户的~/.bashrc中,这样每当用户切换到gpadmin时候就会自动完成环境变量的设置

HAWQ运行环境设置好后可以进行简单的环境测试,如:

- 执行HAWQ的管理命令,查看HAWQ集群状态

- 通过psql连接HAWQ库:

导入测试数据

Pivotal官方提供了用于测试HAWQ的开源项目:GitHub - pivotalsoftware/hawq-samples,其展示了一个典型的零售业的OLAP场景。hawq-samples里包含了描述零售数据和零售数据的维度信息的数据压缩文件,用于创建事实表,维度表和pxf外部表的SQL脚本,用于批量加载测试数据到HDFS的shell脚本等。

按照如下步骤在HAWQ里导入hawq-samples的数据并建立OLAP模型:

- 从github下载hawq-samples并checkout到对应分支,然后将表示HAWQ工作目录的环境变量(HAWQGSBASE)指向hawq-samples的文件目录:

hawq-samples的目录结构说明如下:

datasets/retail/ :Retail demo的数据集文件(.tsv.gz格式)

tutorials/getstart/hawq/:创建HAWQ表的SQL和Shell脚本

tutorials/getstart/pxf/:创建PXF外部表的SQL和Shell脚本

- 为Retail demo创建一个HAWQ库和一个HAWQ schema(HAWQ schema是HAWQ库的一个namespace,包含了一组表,数据类型,函数和操作符,一个HAWQ库可以包含多个schema),创建的HAWQ为hawqgsdb,schema为retail_demo:

- 创建事实表,通过执行hawq-samples提供的create_hawq_tables.sql脚本在hawqgsdb.retail_demo下面创建两张事实表:orders_hawq代表零售订单的详细内容,orders_lineitems_hawq代表订单条目的详细内容

- 加载事实表的数据到HAWQ,通过执行hawq-samples提供的load_hawq_tables.sh脚本将retail demo的数据加载到HAWQ的表中,load_hawq_tables.sh脚本使用zcat命令解压缩.tsv,gz格式的数据文件,调用SQL命令copy加载解压后的csv文件到hawqgsdb.retail_demo的两张事实表中

- 验证事实表,执行hawq-samples提供的verify_load_hawq_tables.sh脚本对hawqgsdb.retail_demo的两张事实表进行count操作,验证数据已经加载

- 加载维度数据到HDFS,执行hawq-samples提供的load_data_to_HDFS.sh脚本加载维度数据到HDFS中(需要确保gpadmin具有sudo权限)

- 创建维度表,执行hawq-samples提供的create_pxf_tables.sql脚本在hawqgsdb.retail_demo下面创建维度表;由于维度数据已经加载在HDFS上,所以只需要通过pxf创建HAWQ的外部表来关联HDFS上的维度数据,而无需再次加载数据到HAWQ的内部表中

(创建HAWQ外部表时,SQL命令里需要填HDFS集群的Active Namenode的IP/hostname,所以可以用脚本set_namenode.sh批量设置create_pxf_tables.sql里的namenode)

- 验证维度表,执行hawq-samples提供的verify_create_pxf_tables.sh脚本对hawqgsdb.retail_demo的所有维度表进行count操作,验证维度表已经建立成功

执行SQL查询

在hawq-samples中,retail demo数据存储在HAWQ内部表中,维度数据存储在HDFS外部源中,用户需要同时使用HAWQ内部和PXF外部表来关联和查询retail demo数据。在生产环境中,同时使用内部表和外部数据源的情况也是比较常见的。

以下是一个简单的SQL查询,同时使用了存储在HAWQ内部描述订单数据的事实表orders_hawq和存储在HDFS上描述客户信息的维度表customers_dim_pxf,确定购买了礼券的所有用户的姓名和email地址,同时统计购买的订单总额:

SELECT substring(retail_demo.orders_hawq.customer_email_address for 37) AS email_address, last_name,sum(retail_demo.orders_hawq.total_paid_amount::float8) AS gift_cert_total FROM retail_demo.customers_dim_pxf, retail_demo.orders_hawq WHERE retail_demo.orders_hawq.payment_method_code='GiftCertificate' AND retail_demo.orders_hawq.customer_id=retail_demo.customers_dim_pxf.customer_id GROUP BY retail_demo.orders_hawq.customer_email_address, last_name ORDER BY last_name limit 10;

在psql中执行上述SQL查询,结果如下:


结论

Apache HAWQ作为一款原生的SQL-on-Hadoop引擎,兼具了MPP数据库强大的分析性能和Hadoop的高可扩展性;在HDP集群里可以通过Ambari进行快速部署和集中管理,为HDP集群提供高性能分析能力。Apache HAWQ目前尚处于Apache的孵化阶段,在生产环境下的部署还比较少,缺乏生产环境的严苛校验,其稳定性,查询性能以及容错性尚待进一步的测试和优化。但是,作为Hortonworks阵营里唯一可用的原生SQL-on-Hadoop引擎,其发展还是可以期待一下的,未来期待它能够替代Cloudera Impala :-)

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,362评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,330评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,247评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,560评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,580评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,569评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,929评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,587评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,840评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,596评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,678评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,366评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,945评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,929评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,165评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,271评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,403评论 2 342

推荐阅读更多精彩内容