在Spark上使用JDBC连接Trino
Posted Laurence
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在Spark上使用JDBC连接Trino相关的知识,希望对你有一定的参考价值。
这是一个非常不典型的Spark + Trino的使用场景,本文仅记录测试步骤和结果,不做评论。本文地址:https://laurence.blog.csdn.net/article/details/129097353,转载请注明出处!
1. 测试环境
信息项 | 设定值 | 备注 |
---|---|---|
集群环境 | AWS EMR 6.9.0 | |
Metastore | Glue Data Catalog | |
启用服务 | Hive、Trino | 不能勾选Spark,原因参考:4. 已知问题 |
Trino端口 | 8889 | 有别于开源默认端口8080 |
命令执行机器 | 10.0.0.110 | 集群主节点 |
2. 测试目标
测试在Spark上使用JDBC读写Trino的可行性。
3. 操作步骤
① 创建EMR集群,选择Hive、Trino并以Glue Data Catalog作为Metastor,集群配置:
[
"Classification": "hive-site",
"Properties":
"hive.metastore.client.factory.class": "com.amazonaws.glue.catalog.metastore.AWSGlueDataCatalogHiveClientFactory",
"hive.metastore.schema.verification": "false"
,
"Classification": "trino-connector-hive",
"Properties":
"hive.metastore":"glue"
]
备注:经过测试,在不启用Glue Data Catalog的EMR集群上效果是一样的。
② 在Hive中创建数据表并插入测试数据:
cat | hive <<EOF
CREATE TABLE IF NOT EXISTS orders (
orderkey bigint,
orderstatus string,
totalprice double,
orderdate date
);
INSERT INTO orders VALUES (1, 'DONE', 2342, current_date());
INSERT INTO orders VALUES (2, 'DONE', 892, current_date());
INSERT INTO orders VALUES (3, 'DONE', 7843, current_date());
SELECT * FROM orders;
EOF
③ 将Trino JDBC Driver包加入Spark类路径并同时启动spark-shell(备注:EMR 6.9.0上Trino版本是398)
spark-shell --driver-class-path /usr/lib/trino/trino-jdbc/trino-jdbc-398-amzn-0.jar --jars /usr/lib/trino/trino-jdbc/trino-jdbc-398-amzn-0.jar
④ 在Spark中通过JDBC连接Trino并读取数据
spark.read.format("jdbc").option("url", "jdbc:trino://localhost:8889/hive/default").option("driver", "io.trino.jdbc.TrinoDriver").option("user", "hadoop").option("dbtable", "orders").load().show()
输出结果:
+--------+-----------+----------+----------+
|orderkey|orderstatus|totalprice| orderdate|
+--------+-----------+----------+----------+
| 2| DONE| 892.0|2023-02-17|
| 3| DONE| 7843.0|2023-02-17|
| 1| DONE| 2342.0|2023-02-17|
+--------+-----------+----------+----------+
4. 已知问题
在第④步通过JDBC连接Trino时,Spark程序报错:
RuntimeException: Error starting query at http://localhost:8889/v1/statement returned an invalid response: JsonResponsestatusCode=404 ....
这是一个非常诡异的问题。如果你足够细心,你会发现,我们的测试集群其实并没有选装Spark,但在测试过程中我们却使用了spark-shell,通过登录集群检查发现:EMR在不勾选Spark组件的情况下,依然会在集群上提供完整的Spark程序包,spark-shell等相关命令行工具也会添加到PATH路径中,可直接调用,但是Spark的配置文件为空,即等于没有进行任何配置,全部为默认值。在此情况下,通过spark-shell执行第④步操作是不会出错的。
诡异的地方就在于:按正常情况,我们应该选择安装Spark,但恰恰是安装上Spark之后,反而会出现上述错误。两个情形的差异主要集中在Spark的配置上(有可能是EMR的一个Bug),但是本文不再做深究,关于不安装Spark与安装Spark两种情形下的Spark配置,请参考此文《Spark配置》。本文地址:https://laurence.blog.csdn.net/article/details/129097353,转载请注明出处!
以上是关于在Spark上使用JDBC连接Trino的主要内容,如果未能解决你的问题,请参考以下文章