将 Amazon EMR Spark 与 MySQL 连接(写入数据)

shi*_*shy 4 mysql jdbc emr apache-spark pyspark

我有一个可能很愚蠢的问题;我在本地运行 Spark 时实际上解决了这个问题,但在 AWS EMR 上运行它时无法解决它。

基本上,我有一个 pyspark 脚本,我提交它来读取数据、操作它、将它处理到 Spark Dataframe 中并将它写入到我已经在 AWS RDS 上的其他地方托管的 MySQL 表中。

这是 EMR 5.6,带有 Spark 2.1.1

我下载了 MySQL 连接器的最新驱动程序(“mysql-connector-java-5.1.42-bin.jar”),并将它们与主节点一起放入我的实例中(基本上将其下载到我的本地笔记本电脑上,然后使用 scp 将其放入在主节点中)。

然后我在 /etc/spark/conf 下找到了我的 spark-defaults.conf 文件并编辑了以下参数:

spark.driver.extraClassPath
spark.executor.extraClassPath
Run Code Online (Sandbox Code Playgroud)

对于这两个,我添加了我的 mysql-connector 文件的路径,该文件位于 /home/hadoop/mysql-connector-java-5.1.42-bin.jar

基于此 SO 帖子(将 JDBC 驱动程序添加到 EMR 上的 Spark),我使用以下命令提交(包括来自“extraClassPath”的整个路径):

spark-submit sample_script.py --driver-class-path /home/hadoop/mysql-connector-java-5.1.42-bin.jar:/usr/lib/hadoop-lzo/lib/*:/usr/lib/hadoop/hadoop-aws.jar:/usr/share/aws/aws-java-sdk/*:/usr/share/aws/emr/emrfs/conf:/usr/share/aws/emr/emrfs/lib/*:/usr/share/aws/emr/emrfs/auxlib/*:/usr/share/aws/emr/security/conf:/usr/share/aws/emr/security/lib/*
Run Code Online (Sandbox Code Playgroud)

在我的代码中,我有一个 spark 数据框,以下代码是写入数据库的内容:

SQL_CONN = "jdbc:mysql://name.address.amazonaws.com:8000/dbname?user=user&password=pwd"
spark_df.write.jdbc(SQL_CONN, table="tablename", mode="append", properties={"driver":'com.mysql.jdbc.Driver'})
Run Code Online (Sandbox Code Playgroud)

我得到的具体错误是这样的:

java.lang.ClassNotFoundException (com.mysql.jdbc.Driver) [duplicate 51]
Run Code Online (Sandbox Code Playgroud)

任何输入都将不胜感激......这对我来说感觉像是一个非常愚蠢的错误,我无法确定。

shi*_*shy 5

已修复 - 我很笨,忘记将 jar 文件也放在我的从节点中。我忘了 --driver-class-path 不会自动将 jar 分发给我的奴隶。

一旦我将 jar 文件放在与我的主节点相同的根目录中(即在我的情况下为 /home/hadoop ),它就起作用了。

希望这可以帮助。