我正在使用Python 2.7&试图访问另一个docker容器中的mySql数据库的jupyter笔记本中的Spark 2.0.2。我已经实现了我能找到的所有问题来解决这个问题并且仍然很短。 This是我的模型,所以至少之前已经做过类似的事了。我将我的笔记本和Dockerfile放在公共存储库中以供参考,在' mysql' branch,here。
失败的代码:
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()
)
with(摘录,上面引用的笔记本中的完整列表):
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中,我添加了我找到的所有可能的解决方案:
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
我验证了容器内部存在的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',
我试图访问的数据库确实存在数据。我使用的过程记录在笔记本的第一个单元格中。我这太复杂了吗?我错过了什么,我还能尝试什么?我非常感谢您为解决方案提供的任何方向!
答案 0 :(得分:3)
通过回过头来看看我是否可以通过python访问数据库并使用ps -aux
1)所有容器必须在同一网络上进行通信;链接显然是不够的。我用了一个新的:
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
。据我所知,docker SPARK_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 repository的mysql分支中。