使用 MySQL 连接 Amazon EMR Spark(写入数据)
Connect Amazon EMR Spark with MySQL (writing data)
我有一个潜在的愚蠢问题;我实际上在本地 运行 Spark 时解决了这个问题,但在 AWS EMR 运行 上无法解决它。
基本上,我提交了一个 pyspark 脚本,该脚本读取数据、对其进行操作、将其处理为 Spark Dataframe 并将其写入我已经在其他地方托管的 MySQL table在 AWS RDS 上。
这是 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
对于这两个,我将路径添加到我的 mysql-连接器文件,该文件位于 /home/hadoop/mysql-connector-java-5.1.42-bin.jar
基于这个SO post (Adding JDBC driver to Spark on EMR),我使用以下命令提交(包括"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/*
在我的代码中,我有一个 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'})
我得到的具体错误是这样的:
java.lang.ClassNotFoundException (com.mysql.jdbc.Driver) [duplicate 51]
如有任何意见,我们将不胜感激...这对我来说是一个非常愚蠢的错误,我无法查明。
已修复 - 我是愚蠢的,忘记将 jar 文件也放入我的从属节点中。我忘记了 --driver-class-path 不会自动将 jar 分发给我的奴隶。
一旦我将 jar 文件放在与我的主节点相同的根目录中(即在我的情况下为 /home/hadoop),它就起作用了。
希望对您有所帮助。
虽然作者的回答是正确的,但是您可以使用--jars
提交一个jar,而不是手动放置jar,它会为您处理休息
spark-submit --jars /home/hadoop/mysql-connector-java-5.1.42-bin.jar sample-script.py
虽然没有明确要求,但是在EMR notebook中,因为你不想运行 spark-submit自己,所以有更简单的方法
将jar文件上传到s3,让它成为notebook的第一个cell
%%configure -f
{
"conf": {
"spark.jars": "s3://jar-test/mysql-connector-java-5.1.42-bin.jar"
}
}
我有一个潜在的愚蠢问题;我实际上在本地 运行 Spark 时解决了这个问题,但在 AWS EMR 运行 上无法解决它。
基本上,我提交了一个 pyspark 脚本,该脚本读取数据、对其进行操作、将其处理为 Spark Dataframe 并将其写入我已经在其他地方托管的 MySQL table在 AWS RDS 上。
这是 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
对于这两个,我将路径添加到我的 mysql-连接器文件,该文件位于 /home/hadoop/mysql-connector-java-5.1.42-bin.jar
基于这个SO post (Adding JDBC driver to Spark on EMR),我使用以下命令提交(包括"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/*
在我的代码中,我有一个 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'})
我得到的具体错误是这样的:
java.lang.ClassNotFoundException (com.mysql.jdbc.Driver) [duplicate 51]
如有任何意见,我们将不胜感激...这对我来说是一个非常愚蠢的错误,我无法查明。
已修复 - 我是愚蠢的,忘记将 jar 文件也放入我的从属节点中。我忘记了 --driver-class-path 不会自动将 jar 分发给我的奴隶。
一旦我将 jar 文件放在与我的主节点相同的根目录中(即在我的情况下为 /home/hadoop),它就起作用了。
希望对您有所帮助。
虽然作者的回答是正确的,但是您可以使用--jars
提交一个jar,而不是手动放置jar,它会为您处理休息
spark-submit --jars /home/hadoop/mysql-connector-java-5.1.42-bin.jar sample-script.py
虽然没有明确要求,但是在EMR notebook中,因为你不想运行 spark-submit自己,所以有更简单的方法
将jar文件上传到s3,让它成为notebook的第一个cell
%%configure -f
{
"conf": {
"spark.jars": "s3://jar-test/mysql-connector-java-5.1.42-bin.jar"
}
}