在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
MetastoreGlue 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的主要内容,如果未能解决你的问题,请参考以下文章

在Spark上使用JDBC连接Trino

从 Spark 到 Oracle 服务器的 JDBC 连接

通过 Spark 的 Hive JDBC 连接(Nullpointer 异常)

在AWS Glue上使用JDBC连接Trino

Spark集群模式下的Impala JDBC连接问题

从spark jdbc连接向数据库发送选项