如何将 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 的路径
然后保存并重启解释器。
我是这样解决这个问题的:
scp
driver jar 到集群驱动节点
转到 Zeppelin 解释器并滚动到 Spark 部分,然后单击编辑。
在工件下写入 jar 的完整路径,例如/home/Hadoop/mssql-jdbc.jar
仅此而已。
点击保存。
那你应该好好的!
类似于Tomas,您可以在解释器中使用maven 添加驱动程序(或任何库):
- 单击菜单中的解释器
- 单击 Spark 解释器中的 'edit' 按钮
- 在工件字段中添加 jar 的路径
- 添加groupId:artifactId:version
例如,在您的情况下,您可以在 artifact 字段中使用 com.microsoft.sqlserver:mssql-jdbc:jar:8.4.1.jre8
。
当您重新启动解释器时,它会为您下载并添加依赖项。
我正在尝试使用 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 的路径
然后保存并重启解释器。
我是这样解决这个问题的:
scp
driver jar 到集群驱动节点转到 Zeppelin 解释器并滚动到 Spark 部分,然后单击编辑。
在工件下写入 jar 的完整路径,例如
/home/Hadoop/mssql-jdbc.jar
仅此而已。点击保存。
那你应该好好的!
类似于Tomas,您可以在解释器中使用maven 添加驱动程序(或任何库):
- 单击菜单中的解释器
- 单击 Spark 解释器中的 'edit' 按钮
- 在工件字段中添加 jar 的路径
- 添加groupId:artifactId:version
例如,在您的情况下,您可以在 artifact 字段中使用 com.microsoft.sqlserver:mssql-jdbc:jar:8.4.1.jre8
。
当您重新启动解释器时,它会为您下载并添加依赖项。