我刚刚在我的 CDH集群(28个节点)上从CSD安装了一个新的 Spark 2.4 ,并尝试安装 JDBC 驱动程序为了从Jupyter笔记本中从数据库读取数据。 我将其下载并复制到一个节点上的/ jars文件夹中,但是似乎我必须在每个主机上都执行相同的操作(!)。否则,我会从其中一名工人那里得到以下错误:
java.lang.ClassNotFoundException: com.microsoft.sqlserver.jdbc.SQLServerDriver
是否有任何简便的方法(无需编写bash脚本)在整个群集上分发带有包的jar文件?我希望Spark可以自己分发(或者也许可以分发,但我不知道该怎么做)。
答案 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
# 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
最终,您真正需要的是将驱动程序类放置在边缘节点(启动spark的客户端)上并将其附加到类路径中,然后进行连接并并行化数据框以扩展性能,因为来自rdbms的jdbc将数据作为单线程读取,因此有1个分区