首页 > 解决方案 > 如何在 Cloudera 集群上分发 JDBC jar?

问题描述

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

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

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

标签: apache-sparkjdbcclouderacloudera-cdhapache-spark-2.0

解决方案


Spark 有一个可以使用的 jdbc 格式阅读器。

启动 scala shell 以确认您的 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

通过火花 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 个分区


推荐阅读