亚马逊AWS官方博客

使用 EMR Hue 整合 Apache Kyuubi 提升 Spark SQL 开发效率

摘要

Amazon EMR 是一种全托管的云端数据平台,用于处理和分析大数据集。它基于开源的 Apache Hadoop 和 Apache Spark 等大数据技术栈,提供了一系列易于使用的工具,可帮助用户在云端快速构建和管理大规模的数据处理和分析应用程序。本文通过介绍在 EMR 中安装、集成 Apache Kyuubi,帮助提升在 EMR 平台上使用 Hue 进行 Spark SQL 开发的效率。

背景

在 EMR 日常开发中,用户可以选择多种任务提交工具,包括 EMR Studio、EMR Step 和 Hue 等。而 Hue 作为一款轻量级开源产品,界面简洁,功能强大,支持多种大数据处理工具,包括 Hive、Presto 和 Spark 等,因此受到很多用户的青睐。但是当在 Hue 中使用 Spark SQL 进行任务开发时,Hue 中 Spark 默认配置是 HiveServer2,执行的是 MapReduce 任务,效率比较低。如果在 Hue 中配置 Livy 来进行 Spark SQL 作业开发,Spark SQL 提交到 Livy 执行的时候,一次只能提交一条语句,并且会出现 SQL 语句不能自动提示以及无法返回任务错误日志等问题,这极大地影响了客户的使用体验以及日常开发效率。在通过相关的产品调研之后,发现 Apache Kyuubi 能较好的解决这一痛点。

Apache Kyuubi 是一个统一的多租户 JDBC 接口服务,用于大规模数据处理和分析。它扩展了 Spark Thrift Server 在企业应用中的场景,其中最重要的是多租户支持。Kyuubi 实现了 Hive Service RPC 模块,它提供了与 HiveServer2 和 Spark Thrift Server 相同的数据访问方式。通过 Hue 和 Kyuubi 整合,用户通过 Hue 可以直接进行 Spark SQL 查询计算和数据处理。一个典型的数据交互方式如下图:

EMR 安装 Kyuubi

前置条件

我们可以参考官方文档:https://docs.thinkwithwp.com/emr/latest/ManagementGuide/emr-gs.html#emr-getting-started-overview 来创建集群,本文集群版本选择 6.7.0(Kyuubi 要求 Spark3),应用程序选择 Hadoop,Spark,Hue,Hive,使用 AWS Glue 作为 Spark 和 Hive 的元数据存储。本文我们选择直接在 Master 节点上安装 Kyuubi,因此需要登录主节点。我们选择 AWS Cloud9 通过 Web 页面的方式远程登录到 EMR 主节点。

安装 Kyuubi

cd /mnt
wget https://archive.apache.org/dist/incubator/kyuubi/kyuubi-1.6.1-incubating/apache-kyuubi-1.6.1-incubating-bin.tgz
tar -zxvf apache-kyuubi-1.6.1-incubating-bin.tgz 
mv apache-kyuubi-1.6.1-incubating-bin kyuubi
rm -rf apache-kyuubi-1.6.1-incubating-bin.tgz

设置 Java 环境

EMR 自带 Java 环境

在 Kyuubi 中配置 Spark 和 Hadoop

在$KYUUBI_HOME/conf/kyuubi-env.sh 配置 SPARK_HOME 以及 HADOOP_CONF_DIR

cd /mnt/kyuubi/conf
mv kyuubi-env.sh.template kyuubi-env.sh
vim kyuubi-env.sh

将 SPARK_HOME 改成如下配置

export SPARK_HOME=/usr/lib/spark

将 HADOOP_CONF_DIR 改成如下配置

export HADOOP_CONF_DIR=/etc/hadoop/conf

启动 Kyuubi

/mnt/kyuubi/bin/kyuubi start

启动后会报错,可以在/mnt/kyuubi/logs/kyuubi-hadoop-org.apache.kyuubi.server.KyuubiServer-ip-172-31-29-111.out 找到如下错误信息:

因为 EMR 集群默认启动了 Zookeeper,2181 端口被占用,可以使用如下两种方式解决,二者选一即可。首先执行 mv /mnt/kyuubi/conf/kyuubi-defaults.conf.template /mnt/kyuubi/conf/kyuubi-defaults.conf。

  • 在 kyuubi-defaults.conf 中配置 kyuubi.ha.addresses ip-172-31-29-111.ec2.internal,使用 EMR 默认启动的 Zookeeper,然后启动 Kyuubi。
  • 修改 Kyuubi 自带的 Zookeeper 的端口号为 2182,在 kyuubi-defaults.conf 中配置 zookeeper.embedded.client.port 2182,然后启动 Kyuubi(生产环境不建议使用)。

重新启动验证,启动成功后会在控制台输出如下信息:

在 Kyuubi Server 日志文件里找到对应的链接信息:jdbc:hive2://ip-172-31-29-111.ec2.internal:10009/

通过 beeline 访问 Kyuubi

beeline -u 'jdbc:hive2://ip-172-31-29-111.ec2.internal:10009/'

输出信息如下图所示:

执行 show databases,会等待一段时间且出现如下错误:

可以去/mnt/kyuubi/work/anonymous/kyuubi-spark-sql-engine.log.1 查看具体错误日志,会发现如下错误信息:

解决方案:在 Hadoop 中创建/user/anonymous 目录,并赋予权限。

hadoop fs -mkdir /user/anonymous
hadoop fs -chmod 777 /user/anonymous

重新通过上述 beeline 方式访问,然后执行 show databases,可以成功显示 database 信息,如下图所示:

上述问题是 hdfs 的用户权限问题,我们直接用 EMR 提供的一些用户不会遇到这种问题,例如

beeline -u 'jdbc:hive2://ip-172-31-29-111.ec2.internal:10009/' -n hadoop

在 Hue 中配置 Kyuubi

将/etc/hue/conf/hue.ini 中相关配置修改为如下内容:

[notebook]
  [[interpreters]]
    [[[sql]]]
      name=SparkSql
      interface=hiveserver2

[spark]
  # Host of the Spark Thrift Server
  sql_server_host=ip-172-31-29-111.ec2.internal
  # Port of the Spark Thrift Server
  sql_server_port=10009

通过 sudo systemctl restart hue 重启 Hue,使用 admin 用户登录 Hue (http://<master node public DNS>:8888),访问 SparkSql 页面会加载很长一段时间且出现如下错误:

同上述 anonymous 用户解决方式一样,执行如下操作:

hadoop fs -mkdir /user/admin
hadoop fs -chmod 777 /user/admin

再次刷新页面即可正常访问,如下图所示:

执行 show databases,也可以正常返回 database 信息。

我们也可以查询某些表的数据,也可以正常返回结果数据集。

在编写 sql 的时候能够自动提示,如下图所示:

如果 sql 执行报错也能返回错误信息,如下图所示:

Kyuubi 提供多租户支持,我们在 Hue 中新建一个用户 test,通过 test 登录,访问 Hue SparkSql 页面,首次访问也会遇到同样的问题,我们要先在 hdfs 创建用户目录和赋予该用户权限。最终我们在 EMR 的 Resource Manager 的管理界面可以发现,每一个用户都对应一个单独的 Application,如下图所示:

用 test 用户通过 Hive beeline 的方式连接 Kyuubi,也会复用上述 test 用户创建的 Application。这是因为 Kyuubi 默认情况下共享级别为 USER,当且仅当会话用户相同时,所有具有 USER 共享级别的会话都会使用相同的引擎。这些会话共享同一引擎,对象属于唯一的 SparkContext,包括 Classes/Classloader、SparkConf、Driver/Executors、Hive Metastore Client 等。但每个会话仍然可以有自己的 SparkSession,包含单独的会话状态,包括临时视图、SQL 配置、UDF 等。关闭会话时,相应的引擎不会关闭。当所有会话都关闭时,相应的引擎仍有生存时间。此 TTL 允许在不等待引擎启动的情况下快速建立新会话。我们可以通过更改 kyuubi.engine.share.level 实现不同的共享级别,进而满足业务需求。共享级别有如下几种:

共享级别 含义 适用场景 隔离级别 共享级别
CONNECTION 每个 Session 一个引擎

大规模 ETL

Ad-hoc 查询

USER 每个用户一个引擎

小型 ETL

Ad-hoc 查询

GROUP 每个组一个引擎

小型 ETL

Ad-hoc 查询

SERVER 每个集群一个引擎 Admin

集群安全则高

集群不安全则低

集群安全允许 Admin 使用

总结

使用 Apache Kyuubi 不仅方便用户在 Hue 中使用 Spark SQL 进行日常开发,而且 Kyuubi 本身就满足很多大数据应用场景。可以根据实际业务需求,结合 Kyuubi 的多租户认证,高可用等特性来充分发掘其价值,更好地推动大数据平台的发展。

本篇作者

张尹

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

施俊

AWS 解决方案架构师,主要负责数字金融客户和企业级客户在 AWS 上的架构设计与实施。10+ 年金融软件研发和机器学习经验。