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

pyspark using mysql database on remote machine

我正在使用 python 2.7 与 ubuntu 和 运行 spark 通过使用 sparkcontext

的 python 脚本

我的数据库是远程 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

在 master 机器上,在 db 机器上,在 运行 机器上,python 脚本没有运气。

edit2

#

我尝试使用

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')]

它包含正确的路径,但我仍然得到相同的 "no driver" 错误...

我在这里错过了什么?

谢谢

您需要为驱动程序节点和工作节点设置类路径。将以下内容添加到 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
from pyspark.sql import SparkSession
spark = SparkSession\
    .builder\
    .appName("Word Count")\
    .config("spark.driver.extraClassPath", "/home/tuhin/mysql.jar")\
    .getOrCreate()

dataframe_mysql = spark.read\
    .format("jdbc")\
    .option("url", "jdbc:mysql://ip:port/db_name")\
    .option("driver", "com.mysql.jdbc.Driver")\
    .option("dbtable", "employees").option("user", "root")\
    .option("password", "12345678").load()

print(dataframe_mysql.columns)

"/home/tuhin/mysql.jar" 是 mysql jar 文件的位置