如何将 Spark 连接到 Zeppelin 中的 JDBC 驱动程序?

How do I connect Spark to JDBC driver in Zeppelin?

我正在尝试使用 Zeppelin 笔记本中的 Spark 将数据从 SQL 服务器提取到 Hive table。

我正在尝试 运行 以下代码:

%pyspark
from pyspark import SparkContext
from pyspark.sql import SparkSession
from pyspark.sql.dataframe import DataFrame
from pyspark.sql.functions import *

spark = SparkSession.builder \
.appName('sample') \
.getOrCreate()

#set url, table, etc.

df = spark.read.format('jdbc') \
.option('url', url) \
.option('driver', 'com.microsoft.sqlserver.jdbc.SQLServerDriver') \
.option('dbtable', table) \
.option('user', user) \
.option('password', password) \
.load()

但是,我一直收到异常:

...
Py4JJavaError: An error occurred while calling o81.load.
: java.lang.ClassNotFoundException: com.microsoft.sqlserver.jdbc.SQLServerDriver
at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
...

我一整天都在试图解决这个问题,我相信我尝试设置驱动程序的方式有问题。我在实例的 /tmp/sqljdbc42.jar 下有一个驱动程序。你能解释一下我如何让 Spark 知道这个驱动程序在哪里吗?我通过 shell 和解释器编辑器尝试了很多不同的方法。

谢谢!

编辑

我还应该注意,我使用

通过 Zeppelin 的 shell (%sh) 将 jar 加载到我的实例
curl -o /tmp/sqljdbc42.jar http://central.maven.org/maven2/com/microsoft/sqlserver/mssql-jdbc/6.4.0.jre8/mssql-jdbc-6.4.0.jre8.jar
pyspark --driver-class-path /tmp/sqljdbc42.jar --jars /tmp/sqljdbc42.jar

您可以通过 Web UI 在 Interpreter 设置中添加它,如下所示:

  • 单击菜单中的解释器

  • 单击 Spark 解释器中的 'edit' 按钮

  • 在工件字段中添加 jar 的路径

  • 然后保存并重启解释器。

我是这样解决这个问题的:

  1. scp driver jar 到集群驱动节点

  2. 转到 Zeppelin 解释器并滚动到 Spark 部分,然后单击编辑。

  3. 在工件下写入 jar 的完整路径,例如/home/Hadoop/mssql-jdbc.jar 仅此而已。

  4. 点击保存。

那你应该好好的!

类似于Tomas,您可以在解释器中使用maven 添加驱动程序(或任何库):

  • 单击菜单中的解释器
  • 单击 Spark 解释器中的 'edit' 按钮
  • 在工件字段中添加 jar 的路径
  • 添加groupId:artifactId:version

例如,在您的情况下,您可以在 artifact 字段中使用 com.microsoft.sqlserver:mssql-jdbc:jar:8.4.1.jre8

当您重新启动解释器时,它会为您下载并添加依赖项。