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

我正在使用Python 2.7& jupyter笔记本中的Spark 2.0.2试图访问另一个Docker容器中的MysqL数据库.我已经实施了几乎所有可以解决的问题,但仍然无法解决. This是我的模型,因此至少之前已经做过类似的工作.我将笔记本和Dockerfile放在了“ MysqL”分支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()
     )

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

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',

我尝试访问的数据库确实存在数据.我使用的过程记录在笔记本的第一个单元格中.我让这个变得太复杂了吗?我缺少什么,还有什么可以尝试的?我感谢您提供解决方案的任何方向!

最佳答案
我通过退后一步来查看是否可以通过python访问数据库并使用ps -aux检查容器内部的spark进程来解决问题

1)所有容器必须在同一网络上进行通信;链接显然还不够.我用了一个新的:
泊坞窗网络创建-驱动程序桥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 repositoryMysqL分支中.

相关文章

Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Li...
1、什么是docker?答:docker是开源的应用容器引擎;开发人员把他们的应用及依赖包打包发布到容器当中。...
1、什么是namespace? 答:名称空间,作用隔离容器 2、namespace隔离有那些? 答:ipc:共享内存、消息队...
1、Docker能在非Linux平台(Windows+MacOS)上运行吗? 答:可以 2 、如何将一台宿主机的docker环境...
环境要求: IP hostname 192.168.1.1 node1 项目规划: 容器网段:172.16.10.0/24 NGINX:172.16.10.10...
文档上传地址:https://files.cnblogs.com/files/lin-strive/07-docker%E8%B7%A8%E4%B8%BB%E6%9C%BA%E7...