无法使用 JDBC 连接到 Spark thriftserver

Posted

技术标签:

【中文标题】无法使用 JDBC 连接到 Spark thriftserver【英文标题】:Can't connect to Spark thriftserver using JDBC 【发布时间】:2017-07-07 20:51:40 【问题描述】:

我关注Spark instructions 启动了一个节俭的 JDBC 服务器:

$ ./spark-2.1.1-bin-hadoop2.7/sbin/start-thriftserver.sh

我可以从直线连接到它:

$ ./spark-2.1.1-bin-hadoop2.7/bin/beeline -u 'jdbc:hive2://localhost:10000' 连接到 jdbc:hive2://localhost:10000 log4j:WARN 找不到记录器 (org.apache.hive.jdbc.Utils) 的附加程序。 log4j:WARN 请正确初始化 log4j 系统。 log4j:WARN 有关详细信息,请参阅 http://logging.apache.org/log4j/1.2/faq.html#noconfig。 连接到:Spark SQL(2.1.1 版) 驱动程序:Hive JDBC(版本 1.2.1.spark2) 事务隔离:TRANSACTION_REPEATABLE_READ Apache Hive 的直线版本 1.2.1.spark2 0: jdbc:hive2://localhost:10000>

但是,尝试使用 JDBC 和相同的连接字符串从 DataGrip 进行连接时,出现错误:

[2017-07-07 16:46:57] java.lang.ClassNotFoundException: org.apache.thrift.transport.TTransportException [2017-07-07 16:46:57] 在 java.net.URLClassLoader.findClass(URLClassLoader.java:381) [2017-07-07 16:46:57] 在 java.lang.ClassLoader.loadClass(ClassLoader.java:424) [2017-07-07 16:46:57] 在 sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:331) [2017-07-07 16:46:57] 在 java.lang.ClassLoader.loadClass(ClassLoader.java:357) [2017-07-07 16:46:57] 在 org.apache.hive.jdbc.HiveDriver.connect(HiveDriver.java:105) [2017-07-07 16:46:57] 在 com.intellij.database.remote.jdbc.impl.RemoteDriverImpl.connect(RemoteDriverImpl.java:27) [2017-07-07 16:46:57] 在 sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) [2017-07-07 16:46:57] 在 sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) [2017-07-07 16:46:57] 在 sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) [2017-07-07 16:46:57] 在 java.lang.reflect.Method.invoke(Method.java:498) [2017-07-07 16:46:57] 在 sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:324) [2017-07-07 16:46:57] 在 sun.rmi.transport.Transport$1.run(Transport.java:200) [2017-07-07 16:46:57] 在 sun.rmi.transport.Transport$1.run(Transport.java:197) [2017-07-07 16:46:57] 在 java.security.AccessController.doPrivileged(本机方法) [2017-07-07 16:46:57] 在 sun.rmi.transport.Transport.serviceCall(Transport.java:196) [2017-07-07 16:46:57] 在 sun.rmi.transport.tcp.TCPTransport.handleMessages(TCPTransport.java:568) [2017-07-07 16:46:57] 在 sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run0(TCPTransport.java:826) [2017-07-07 16:46:57] 在 sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.lambda$run$0(TCPTransport.java:683) [2017-07-07 16:46:57] 在 java.security.AccessController.doPrivileged(本机方法) [2017-07-07 16:46:57] 在 sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(TCPTransport.java:682) [2017-07-07 16:46:57] 在 java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) [2017-07-07 16:46:57] 在 java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) [2017-07-07 16:46:57] 在 java.lang.Thread.run(Thread.java:745) (无堆栈跟踪)

我将 DataGrip 配置为使用 spark 安装文件夹中的 JDBC 库 hive-jdbc-1.2.1.spark2.jar

【问题讨论】:

【参考方案1】:

从 spark 2.2.1 发行版中,您需要以下 jar:

commons-logging-1.1.3.jar
hadoop-common-2.7.3.jar
hive-exec-1.2.1.spark2.jar
hive-jdbc-1.2.1.spark2.jar
hive-metastore-1.2.1.spark2.jar
httpclient-4.5.2.jar
httpcore-4.4.4.jar
libthrift-0.9.3.jar
slf4j-api-1.7.16.jar
spark-hive-thriftserver_2.11-2.2.1.jar
spark-network-common_2.11-2.2.1.jar

在 Datagrip 中选择类 org.apache.hive.jdbc.HiveDriver 并将 Tx(事务控制)设置为 Manual(spark 不支持自动提交)。

您现在应该可以使用 URL jdbc:hive2://hostname:10000/ 进行连接

【讨论】:

【参考方案2】:

spark/jars 文件夹中的所有*.jar 文件添加到DataGrip 的“JDBC 驱动程序”窗口后,它就可以工作了!不确定这些库中的哪一个是必需的,但反复试验告诉我其中许多是必需的!

【讨论】:

它并不漂亮,但它完成了工作。摆弄 JAR 是零乐趣。【参考方案3】:

添加到 tukushan 答案。您只需使用两个罐子就可以简化您的生活: spark发行版的hadoop-common-2.7.3.jar和 hive-jdbc-1.2.1-standalone.jar

【讨论】:

以上是关于无法使用 JDBC 连接到 Spark thriftserver的主要内容,如果未能解决你的问题,请参考以下文章

在 Spark 中使用 jdbc 驱动程序连接到 Hive

使用 jdbc 从 Spark 2.3.1 Scala 2.11.8 连接到 Vertica

无法使用 Pyspark 从 EMR 集群连接到雪花

无法从火花连接到红移

如何通过 Spark 中的 jdbc 连接到 docker 托管的 postgresql 数据库?

无法使用 JDBC 驱动程序和 sql2o 连接到我的 Posgres 服务器