【问题标题】:Connect Amazon EMR Spark with MySQL (writing data)将 Amazon EMR Spark 与 MySQL 连接(写入数据)
【发布时间】:2017-12-01 07:14:37
【问题描述】:

我有一个可能很愚蠢的问题;实际上,我在本地运行 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

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

基于此 SO 帖子 (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]

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

【问题讨论】:

  • {"driver":'com.mysql.jdbc.Driver'}这里不应该是双引号吗?与问题无关。我会首先检查运行 spark-submit 的用户是否可以访问给定的类路径路径,然后我会检查日志(无论它们在哪里)是否真的加载了这些类路径
  • 我认为实际上是因为我的从节点没有 jar 文件。让我快点试试。

标签: mysql apache-spark jdbc pyspark emr


【解决方案1】:

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

一旦我将 jar 文件放在与我的主节点相同的根目录中(在我的例子中是 /home/hadoop),它就可以工作了。

希望这会有所帮助。

【讨论】:

    【解决方案2】:

    虽然作者的回答是正确的,但是你可以使用--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的第一个单元

    %%configure -f
    {
        "conf": {
            "spark.jars": "s3://jar-test/mysql-connector-java-5.1.42-bin.jar"        
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2016-08-31
      • 2018-08-18
      • 2019-02-16
      • 2022-10-17
      • 2020-05-10
      • 1970-01-01
      • 1970-01-01
      • 2019-04-05
      • 2017-01-04
      相关资源
      最近更新 更多