gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 08:09:50 24 4
gpt4 key购买 nike

我在 jupyter notebook 中使用 Python 2.7 & Spark 2.0.2 试图访问另一个 docker 容器中的 mySql 数据库。我已经实现了几乎所有我能找到的解决问题的方法,但仍然不足。 This是我的模型,所以至少以前做过类似的事情。我将我的笔记本和 Dockerfile 放在一个公共(public)存储库中以供引用,在“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)所有容器必须在同一个网络上才能通信;链接显然是不够的。我用了一个新的: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 分支中如果其他人需要我的确切步骤。

关于python - Jupyter Spark 数据库访问; java.lang.ClassNotFoundException : com. mysql.jdbc.Driver 异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41688251/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com