python - pyspark 在远程机器上使用 mysql 数据库

标签 python mysql apache-spark pyspark apache-spark-sql

我在 ubuntu 中使用 python 2.7,并使用 Sparkcontext 通过 python 脚本运行 Spark

我的数据库是远程mysql,有用户名和密码。

我尝试使用此代码查询它

sc = createSparkContext()
sql = SQLContext(sc)
df = sql.read.format('jdbc').options(url='jdbc:mysql://ip:port?user=user&password=password', dbtable='(select * from tablename limit 100) as tablename').load()
print df.head()

并收到此错误

py4j.protocol.Py4JJavaError: An error occurred while calling o32.load. : java.sql.SQLException: No suitable driver

我发现我需要 mysql 的 JDBC 驱动程序。

我从 here 下载了免费的平台

我尝试使用此代码将其包含在启动 Spark 上下文中

conf.set("spark.driver.extraClassPath", "/var/nfs/general/mysql-connector-java-5.1.43")

并尝试使用

安装它
sudo apt-get install libmysql-java

在主计算机上、在数据库计算机上以及在运行 python 脚本的计算机上,但运气不佳。

编辑2

#

我尝试使用

conf.set("spark.executor.extraClassPath", "/var/nfs/general/mysql-connector-java-5.1.43")

似乎是

的输出
print sc.getConf().getAll()

这是

[(u'spark.driver.memory', u'3G'), (u'spark.executor.extraClassPath', u'file:///var/nfs/general/mysql-connector-java-5.1.43.jar'), (u'spark.app.name', u'spark-basic'), (u'spark.app.id', u'app-20170830'), (u'spark.rdd.compress', u'True'), (u'spark.master', u'spark://127.0.0.1:7077'), (u'spark.driver.port', u''), (u'spark.serializer.objectStreamReset', u'100'), (u'spark.executor.memory', u'2G'), (u'spark.executor.id', u'driver'), (u'spark.submit.deployMode', u'client'), (u'spark.driver.host', u''), (u'spark.driver.cores', u'3')]

它包含正确的路径,但我仍然遇到相同的“无驱动程序”错误...

我在这里缺少什么?

谢谢

最佳答案

您需要为驱动程序和工作节点设置类路径。将以下内容添加到 Spark 配置

conf.set("spark.executor.extraClassPath", "/var/nfs/general/mysql-connector-java-5.1.43")
conf.set("spark.driver.extraClassPath", "/var/nfs/general/mysql-connector-java-5.1.43")

或者您可以使用它来传递

import os
os.environ['SPARK_CLASSPATH'] = "/path/to/driver/mysql.jar"

对于spark >=2.0.0,您可以将逗号分隔的jar 列表添加到位于spark_home/conf 目录中的spark-defaults.conf 文件中,如下所示

spark.jars     path_2_jar1,path_2_jar2

关于python - pyspark 在远程机器上使用 mysql 数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45904601/

相关文章:

php - MySQL 在 for(PHP) 循环中执行 INSERT。 INSERT 仅在第一个循环上运行

scala - 如何将 double 组的文件转换为 spark 中的数据帧?

python - 如何在 Django 中渲染单个 View 时将一个模型中的字段用于另一个模型

python - bisect.insort 复杂性不如预期

c# - 查看 DLL 文件的内容

php - 将 php mysql 更改为 php mssql

python - 有没有办法以合适的日志格式从 sqlalchemy 中获取连接字符串?

mysql - 如何在 mySQL 中使用 SUM?

hadoop - 由 : ERROR XSDB6: Another instance of Derby may have already booted the database 引起

scala - 如何在 Spark 中对 RDD 进行排序和限制?