Skip to content

Instantly share code, notes, and snippets.

@badbye
Last active March 31, 2023 03:39
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save badbye/2618d6ef47a042427836d4ba9518e203 to your computer and use it in GitHub Desktop.
Save badbye/2618d6ef47a042427836d4ba9518e203 to your computer and use it in GitHub Desktop.
Use Kyuubi with Aliyun's Analytic Spark

Kyuubi & Aliyun ADB Spark

AnalyticDB MySQL Spark 是阿里云 AnalyticDB 产品中的 Serverless Spark 服务, 取代了之前的 DLA Serverless Spark。产品内部已经集成了交互式查询、Notebook 等服务,也提供 API 调用,但仍旧不够灵活。如果能够与 Kyuubi 结合,就可以有更丰富的 JDBC、REST API 连接方式。

Kyuubi 与 Spark 的连接大致分三步:

  1. 通过 spark-submit 启动一个 SparkSQLEngine,启动后 Spark Server 会把自己注册到 Zookeeper 服务中
  2. Kyuubi Server 通过 Zookeeper 查到到 Spark Server 的地址
  3. Kyuubi Server 连接 Spark Server,为客户端提供交互式查询服务

Kyuubi Server、ZooKeeper、ADB Spark 这三个服务都要能够互联互通。

Kyuubi Server 与 ADB Spark 的连接

ADB Spark 是没有公网 IP 的,只能通过开启 VPC 网络,与内网服务互联。

最便捷的方式,是把 Kyuubi Server 部署在阿里云的服务器上,配置spark.adb.eni.vswitchIdspark.adb.eni.securityGroupId 参数让二者能够互通。

测试过程遇到的另一个问题是:ADB Spark集群有两张网卡,启动后注册到 ZooKeeper 时默认使用第一张网卡的 IP 地址。但实际上,前文配置的交换机是绑在了第二张网卡上,也就是说注册 ZooKeeper 时需要使用第二张网卡的 ip。

所以这里需要更改注册 ZooKeeper 时的服务地址,我在 Kyuubi1.6 的基础上做了一些代码修改,新增了kyuubi.engine.connection.url.use.nic参数,用于设置网卡名称。 阿里云的工程师告知,第二张网卡的名称是 eth1,所以在 Kyuubi 的配置文件中增加 kyuubi.engine.connection.url.use.nic = eth1 即可。

ZooKeeper 与 ADB Spark 的连接

如果是使用 Kyuubi 自带的 EmbeddedZooKeeper,默认配置下,Kyuubi 启动 Spark 时会把 ZooKeeper 的服务地址以 hostname:port 的格式下发给 Spark。 显然 ADB Spark 不会认得 hostname。应该可以通过更改 Kyuubi 配置的方法,把 ZooKeeper 的服务地址改成 ip:port 的格式,这样前文配置好交换机之后就不会有问题了。 不过 Kyuubi 配置很多,没有细看,这个问题也可以通过在 ADB Spark 的配置中增加 spark.adb.eni.extraHosts 参数来解决,参数值就是 ip1 host1,ip2 host2 hostname 和 IP 的映射关系。

如果使用的单独的 ZooKeeper 集群,最好是与 Kyuubi Server 在同一个内网,否则需要添加白名单。

Kyuubi 1.6 代码修改的用法

最后记录下代码修改的用法。虽然写过一些 Java 和 Scala 代码了,但是对项目的构建还是很懵逼。 在测试过程中,遇到一个神奇的问题,修改完 kyuubi-common 的代码后,构建 externals/kyuubi-spark-sql-engine 模块没有发生任何变化。

一个直观的认识是,所有的代码修改都在 kyuubi-common 模块中,externals/kyuubi-spark-sql-engine 模块依赖了 kyuubi-common 模块。提交到 Spark 的 jar 包也只有 kyuubi-spark-sql-engine.jar。 后来终于查到,问题出在构建时使用的 kyuubi-common.jar 一直是在某个缓存目录,而不是基于修改后的代码构建的。

所以最终的使用流程变成:

# 构建 kyuubi-common.jar
build/mvn clean scala:compile compile package -pl kyuubi-common -DskipTests

# 覆盖缓存目录中的文件
cp kyuubi-common/target/kyuubi-common_2.12-1.6.1-incubating.jar ~/.m2/repository/org/apache/kyuubi/kyuubi-common_2.12/1.6.1-incubating/
shasum kyuubi-common/target/kyuubi-common_2.12-1.6.1-incubating.jar | awk '{print $1}' > ~/.m2/repository/org/apache/kyuubi/kyuubi-common_2.12/1.6.1-incubating/kyuubi-common_2.12-1.6.1-incubating.jar.sha1

# 构建 kyuubi-spark-sql-engine.jar,此处 Spark 版本设置为 3.2,因为 ADB Spark 的版本是 3.2
build/mvn  scala:compile compile package -pl externals/kyuubi-spark-sql-engine -Pspark-3.2 -DskipTests

# 复制构建后 kyuubi-spark-sql-engine.jar 到 Kyuubi 服务的目录
cp externals/kyuubi-spark-sql-engine/target/kyuubi-spark-sql-engine_2.12-1.6.1-incubating.jar ${KYUUBI_HOME}/externals/engines/spark/
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment