亚马逊AWS官方博客

使用Hue玩转Amazon EMR(SparkSQL, Phoenix)和Amazon Redshift

现状

Apache Hue是一个基于 Web 的交互式SQL助手,通过它可以帮助大数据从业人员(数仓工程师,数据分析师等)与数据仓库进行SQL交互。在Amazon EMR集群启动时,通过勾选Hue进行安装。在Hue启用以后,将原先需要登录主节点进行SQL编写及提交的工作转移到web前端,不仅方便统一管理日常开发需求,而且保证了集群的接入安全性。另一方面Hue有自己独特的优势可以使用SparkSQL进行Spark任务的远程提交,相比于额外为Amazon EMR集群配置Hive on Spark,或者使用代码进行Livy远程提交这两种方式而言,大大的提升了开发和运维效率。本文也介绍了如何通过Hue整合Amazon Redshift数仓, 以及远程提交Phoenix任务同HBase交互,将Hue打造为数据仓库的统一SQL访问平台。

方案架构总览

方案介绍

通过Livy提交SparkSQL Job

执行引擎现状

首先,我们简单比对一下几种流行的执行引擎的现状:

  • 由于处理客户查询需要高磁盘 IO,Apache MapReduce 是最慢的查询执行引擎。
  • 在保持磁盘 IO 不变的情况下,Apache Tez 明显快于 Apache MapReduce。
  • Apache Spark 比没有 IO 阻塞的 Apache Tez 稍快,和Apache Tez一样以DAG方式处理数据,Spark更加通用,提供内存计算,实时流处理,机器学习等多种计算方式,适合迭代计算。

Apache Livy简介

Apache Livy 是一项服务,可通过 REST API与 Spark 集群轻松交互。此方案中的配置方式可将Hue页面编写的SparkSQL通过Livy接口提交到EMR集群。

EMR Hue处理SparkSQL默认行为

当在Hue的面板上Editor选择SparkSQL并提交SQL任务时,我们根据application_id((Executing on YARN cluster with App id application_1656071365605_0006))去Resource Manager控制台上查询到对应的Application Type是Tez:

当我们打开hue的配置文件(/etc/hue/conf/hue.ini)看到[[[sql]]]处配置如下图,interface配置的是hiveserver2便知道了此时的SparkSQL走的仍是hiveserver2,因此使用的是Tez引擎(EMR上的Hive执行引擎默认是Tez),这代表着并未真的使用Spark执行引擎在运行上述的Query。

在EMR Hue中通过Livy 提交SparkSQL任务

(1)修改Hue配置文件(/etc/hue/conf/hue.ini)中的执行引擎,并重启Hue服务

sudo systemctl restart hue.service
sudo systemctl status hue.service

重新提交SparkSQL任务后,看到该Application的ApplicationType已经为SPARK。

生产场景中的性能调优:

上述Application通过Spark管理界面查看Environment细节:

看到spark.driver.memory和spark.executor.memory均设置为1G

这是因为Hue源码中直接将上述两个参数的值设定为1G:

https://github.com/cloudera/hue/blob/bd6324a79c2e6b6d002ddd6767b0e63883373320/desktop/libs/notebook/src/notebook/connectors/spark_shell.py

{
	      "name": "driverMemory",
	      "nice_name": _("Driver Memory"),
	      "help_text": _("Amount of memory to use for the driver process in GB. (Default: 1). "),
	      "type": "jvm",
	      "is_yarn": False,
	      "multiple": False,
	      "defaultValue": '1G',
	      "value": '1G',
	},
…
{
	      "name": "executorMemory",
	      "nice_name": _("Executor Memory"),
	      "help_text": _("Amount of memory to use per executor process in GB. (Default: 1)"),
	      "type": "jvm",
	      "is_yarn": True,
	      "multiple": False,
	      "defaultValue": '1G',
	      "value": '1G',
	    }

如果用默认参数值容易在任务执行中触发OOM异常,导致任务运行失败,我们可选择通过以下方法进行调优:

cp /usr/lib/hue/desktop/libs/notebook/src/notebook/connectors/spark_shell.py /usr/lib/hue/desktop/libs/notebook/src/notebook/connectors/spark_shell.py.bak
sudo vi /usr/lib/hue/desktop/libs/notebook/src/notebook/connectors/spark_shell.py

将 ‘driverMemory’和 ‘executorMemory’ 的配置删除,重启Hue服务

sudo systemctl restart hue.service
sudo systemctl status hue.service

再次运行SparkSQL,从Environment 看到两个内存参数已经更新,和/etc/spark/conf/spark-defaults.conf内定义一致:

Hue配置Phoenix提交HBase任务

Apache Phoenix简介

Apache Phoenix是一个开源的,大规模并行的关系数据库引擎,支持使用Apache HBase作为其后备存储的OLTP for Hadoop。Phoenix提供了一个JDBC驱动程序,该驱动程序隐藏了noSQL存储的复杂性,使用户能够创建,删除和更改SQL表,视图,索引和序列。

配置Phoenix

(1)准备Hue Python Virtual Environment

sudo /usr/lib/hue/build/env/bin/pip install phoenixdb

(2)修改Hue配置文件:

在/etc/hue/conf/hue.ini的[notebook] [[interpreters]]部分加入:

[[[phoenix]]]
name=HBase Phoenix
interface=sqlalchemy
options='{"url": "phoenix:// ip-172-31-37-125.ap-southeast-1.compute.internal:8765/"}'

重启Hue服务

sudo systemctl restart hue.service
sudo systemctl status hue.service

(3) Hue页面提交Phoenix任务:

Hue – Editor 部分因为配置文件的更新,出现了HBase Phoenix的选项, 创建和查询Table:

CREATE TABLE user (id varchar PRIMARY KEY,name varchar,passwd varchar)
upsert into user(id, name, passwd) values('001', 'admin', 'admin')
select * from user

HBase显示列名乱码修正

(1)当完成上述操作时,回到HBase Shell查看表内容,发现列名为乱码:

使用Phoenix命令行(/usr/lib/phoenix/bin/sqlline.py, 不透过Hue)创建表仍能重现该问题,且乱码不会在Phoenix JDBC连接中出现:

(2)在Phoenix创建表时最后加上COLUMN_ENCODED_BYTES= 0可规避该问题:

CREATE TABLE user02 (id varchar PRIMARY KEY,name varchar,passwd varchar) COLUMN_ENCODED_BYTES= 0
upsert into user02(id, name, passwd) values('002', 'admin', 'admin')
select * from user02

HBase Shell查看结果,列名已经显示正常:

Hue连接Redshift提交任务

当数仓平台中涉及Amazon EMR和Amazon Redshift等多种服务时,通过Hue丰富的Connectors扩展种类,可以轻松实现统一交互的功能。

(1)准备Hue Python Virtual Environment

cd /usr/lib/hue/
sudo ./build/env/bin/pip install sqlalchemy-redshift
sudo /usr/lib/hue/build/env/bin/pip2.7 install psycopg2-binary

(2)修改Hue配置文件:

在/etc/hue/conf/hue.ini的[notebook] [[interpreters]]部分加入:

[[[redshift]]]
name = Redshift
interface=sqlalchemy
  options='{"url": "redshift+psycopg2://username:password@host.amazonaws.com:5439/database"}'

重启Hue服务

sudo systemctl restart hue.service
sudo systemctl status hue.service

(3) Hue页面提交Redshift任务:

Hue – Editor 部分因为配置文件的更新,出现了Reshift的选项:

提交SQL查询,轻松获取Amazon Redshift数仓数据:

总结

本文主要帮助使用Amazon EMR的用户,通过Hue实现统一数仓平台开发工具,一方面集中管理数仓SQL开发任务,另一方面为其它部门提供自主分析的平台,对数仓建设有一定的推动作用。

本篇作者

Sunny Fang

AWS技术客户经理,主要支持金融,互联网行业客户的架构优化、成本管理、技术咨询等工作,并专注在大数据和容器方向的技术研究和实践。在加入AWS之前,曾就职于Citrix和微软等科技公司,拥有8年虚拟化与公有云领域的架构优化和支持经验。

张尹

AWS技术客户经理,负责企业级客户的架构和成本优化、技术支持等工作。有多年的大数据架构设计,数仓建模等实战经验。在加入 AWS 之前,长期负责头部电商大数据平台架构设计、数仓建模、运维等相关工作。