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

时间:2018-08-27 19:40:58

标签: apache-spark pyspark amazon-emr apache-zeppelin

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

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

%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知道该驱动程序在哪里?我已经通过外壳和解释器编辑器尝试了许多不同的方式。

谢谢!

编辑

我还应注意,我是使用Zeppelin的外壳(%sh)将罐子加载到我的实例中的,

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

3 个答案:

答案 0 :(得分:0)

您可以通过“翻译”设置中的Web UI将其添加,如下所示:

  • 点击菜单中的解释器

  • 在Spark解释器中单击“编辑”按钮

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

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

答案 1 :(得分:0)

这是我解决此问题的方法:

  1. scp驱动程序jar到群集驱动程序节点上

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

  3. 在工件等处将罐子的完整路径写入/home/Hadoop/mssql-jdbc.jar,别无其他。

  4. 单击“保存”。

那你应该很好!

答案 2 :(得分:0)

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

  • 在菜单中单击解释器
  • 点击Spark解释器中的“编辑”按钮
  • 在工件字段中添加jar的路径
  • 添加groupId:artifactId:version

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

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