无法使用 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的主要内容,如果未能解决你的问题,请参考以下文章
使用 jdbc 从 Spark 2.3.1 Scala 2.11.8 连接到 Vertica