Jupyter Spark数据库访问; java.lang.ClassNotFoundException:com.mysql.jdbc.Driver

我在一个jupyter笔记本中使用Python 2.7&Spark 2.0.2试图访问另一个docker容器中的mySql数据库。 为了弥补这个问题,我已经实施了所有我能find的一切,但仍然不足。 这是我的模式,所以至less类似以前做过。 我把我的笔记本和Dockerfile放在一个公共仓库中作为参考,在这里的'mysql'分支。

代码失败:

df = (spark.read.format('jdbc') .options( url='jdbc:mysql://172.17.0.8:6603/giskard', user='root', password='datascience', dbtable='supers',driver='com.mysql.jdbc.Driver') .load() ) 

(摘录,上面引用的笔记本中的完整列表):

 Py4JJavaError: An error occurred while calling o42.load. : java.lang.ClassNotFoundException: com.mysql.jdbc.Driver at java.net.URLClassLoader$1.run(URLClassLoader.java:366) 

在dockerfile里面,我添加了所有可能的解决scheme:

 RUN apt-get update && apt-get install -y --no-install-recommends apt-utils && \ apt-get install -y mysql-client && \ apt-get install -y python-dev && \ apt-get install -y libmysqlclient-dev && \ apt-get install -y libmysql-java && \ apt-get clean RUN pip2 install MySQL-python 

我validation了容器内部存在的mysql jar文件,然后将其添加到SPARK_OPTS中,以便在笔记本的内部使用%env

 'SPARK_OPTS': '--driver-java-options=-Xms1024M --driver-java-options=-Xmx4096M --driver-java-options=-Dlog4j.logLevel=info --spark-jars=/usr/share/java/mysql-connector-java.jar', 

其他可能的环境相关部分:

  'PATH': '/opt/conda/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin', 'PYSPARK_PYTHON': '/opt/conda/envs/python2/bin/python', 'PYTHONPATH': '/usr/local/spark/python:/usr/local/spark/python/lib/py4j-0.10.4-src.zip:/usr/lib/python2.7/dist-packages', 'SPARK_HOME': '/usr/local/spark', 

我试图达到的数据库确实存在与数据。 我使用的过程logging在笔记本的第一个单元格中。 我做这个太复杂了吗? 我错过了什么,还有什么可以尝试? 我感谢您提供解决scheme的任何方向!

我想通过回头看看是否可以通过python访问数据库,并用ps -aux检查容器内的spark进程

1)所有容器必须在同一个networking上进行通信; 连接显然是不够的。 我用了一个新的: docker network create --driver bridge dbnet

2)我安装了python-mysqldb通过python访问数据库。 我在笔记本中做了这个,而不是将其添加到dockerfile。

 !sudo apt-get update && sudo apt-get install -y python-mysqldb # from https://pypi.python.org/pypi/MySQL-python/1.2.5 import MySQLdb db = MySQLdb.connect(host=DB_SERVER_IP, # your host, usually localhost user=MYSQL_USER, # your username passwd=MYSQL_PASSWORD, # your password db=MYSQL_DATABASE) # name of the data base 

3)Spark需要libmysql-java ,并将jar文件复制到/usr/local/spark/jars 。 据我所知,dockerSPARK_OPTS设置是无效的。 我添加到Dockerfile中:

 RUN apt-get update && apt-get install -y --no-install-recommends apt-utils && \ apt-get install -y libmysql-java && \ apt-get clean RUN ln -s /usr/share/java/mysql-connector-java.jar /usr/local/spark/jars 

现在一切都很好。 如果其他人需要我的确切步骤,我将把示例笔记本留在spark 2 docker仓库的mysql分支中。