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

How to distribute JDBC jar on Cloudera cluster?

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

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

有没有简单的方法(无需编写 bash 脚本)在整个集群上分发带有包的 jar 文件?我希望 Spark 可以自行分发它(或者它可以分发但我不知道该怎么做)。

Spark 具有 jdbc 格式 reader 您可以使用。

启动 scala shell 以确认您的 MS SQL 服务器驱动程序在您的 class 路径

例子

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

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

例子

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

通过 Spark jdbc

连接到您的 MS SQL 服务器

示例来自 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 ...如果你仍然不能让上面的方法工作,请尝试通过这个设置一些环境变量 post(虽然无法确认这是否有效)

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

在一天结束时,您真正需要的是将驱动程序 class 放置在边缘节点(您启动 spark 的客户端)并将其附加到您的 class path 然后建立连接并并行化数据帧以扩展性能,因为来自 rdbms 的 jdbc 将数据读取为单线程,因此 1 个分区