如何在Cloudera集群上分发JDBC jar?

时间:2019-05-21 17:43:04

标签: apache-spark jdbc cloudera cloudera-cdh apache-spark-2.0

我刚刚在我的 CDH集群(28个节点)上从CSD安装了一个新的 Spark 2.4 ,并尝试安装 JDBC 驱动程序为了从Jupyter笔记本中从数据库读取数据。 我将其下载并复制到一个节点上的/ jars文件夹中,但是似乎我必须在每个主机上都执行相同的操作(!)。否则,我会从其中一名工人那里得到以下错误:

java.lang.ClassNotFoundException: com.microsoft.sqlserver.jdbc.SQLServerDriver

是否有任何简便的方法(无需编写bash脚本)在整个群集上分发带有包的jar文件?我希望Spark可以自己分发(或者也许可以分发,但我不知道该怎么做)。

1 个答案:

答案 0 :(得分:1)

Spark具有可使用的jdbc格式读取器。

启动scala外壳以确认您的MS SQL Server驱动程序在类路径中

示例

Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver")

如果未显示驱动程序类,请确保将jar放在边缘节点上,并将其包含在初始化会话的类路径中

示例

bin/spark-shell --driver-class-path postgresql-9.4.1207.jar --jars postgresql-9.4.1207.jar

通过Spark jdbc连接到您的MS SQL Server

通过spark python的示例

# option1
jdbcDF = spark.read \
    .format("jdbc") \
    .option("url", "jdbc:postgresql:dbserver") \
    .option("dbtable", "schema.tablename") \
    .option("user", "username") \
    .option("password", "password") \
    .load()

# option2
jdbcDF2 = spark.read \
    .jdbc("jdbc:postgresql:dbserver", "schema.tablename",
          properties={"user": "username", "password": "password"})

具体细节和编译连接字符串的其他方法可在此处找到

https://spark.apache.org/docs/latest/sql-data-sources-jdbc.html

您提到了jupyter ...如果您仍然无法使以上内容起作用,请尝试通过此帖子设置一些环境变量(尽管无法确认是否可行)

https://medium.com/@thucnc/pyspark-in-jupyter-notebook-working-with-dataframe-jdbc-data-sources-6f3d39300bf6

最终,您真正需要的是将驱动程序类放置在边缘节点(启动spark的客户端)上并将其附加到类路径中,然后进行连接并并行化数据框以扩展性能,因为来自rdbms的jdbc将数据作为单线程读取,因此有1个分区