Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将Amazon EMR Spark与MySQL连接(写入数据)_Mysql_Apache Spark_Jdbc_Pyspark_Emr - Fatal编程技术网

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

将Amazon EMR Spark与MySQL连接(写入数据),mysql,apache-spark,jdbc,pyspark,emr,Mysql,Apache Spark,Jdbc,Pyspark,Emr,我有一个潜在的愚蠢问题;实际上,我在本地运行Spark时修复了此问题,但在AWS EMR上运行时无法解决此问题 基本上,我提交了一个pyspark脚本,它读取数据,对数据进行操作,将其处理为Spark数据帧,并将其写入我已经在AWS RDS上的其他地方托管的MySQL表中 这是EMR 5.6和Spark 2.1.1 我下载了MySQL连接器的最新驱动程序(“MySQL-connector-java-5.1.42-bin.jar”),并将它们放在主节点的实例中(基本上是将其下载到本地笔记本电脑上,

我有一个潜在的愚蠢问题;实际上,我在本地运行Spark时修复了此问题,但在AWS EMR上运行时无法解决此问题

基本上,我提交了一个pyspark脚本,它读取数据,对数据进行操作,将其处理为Spark数据帧,并将其写入我已经在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连接器文件的路径,该文件位于/home/hadoop/mysql-connector-java-5.1.42-bin.jar

基于此SO post(),我使用以下命令提交(包括“extraClassPath”中的整个路径):

在我的代码中,我有一个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文件放在从属节点中。我忘了——驱动程序类路径不会自动将jar分发给我的从属程序

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


希望这能有所帮助。

虽然作者的答案是正确的,但您可以使用
--jars
提交一个jar,它将为您处理其余部分,而不是手动放置jar

spark-submit  --jars /home/hadoop/mysql-connector-java-5.1.42-bin.jar sample-script.py
虽然没有明确要求,但在EMR笔记本中,因为您不想自己运行spark submit,所以有更简单的方法

将jar文件上传到s3,让它成为笔记本的第一个单元格

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

{“driver”:'com.mysql.jdbc.driver'}
这里不应该是双引号吗?与问题无关。我会首先检查运行
spark submit
的用户是否有权访问给定的类路径,然后我会在日志中检查(无论它们在哪里)这些类路径是否真的被加载了我认为实际上是bc我的从属节点没有jar文件。让我很快试试。
%%configure -f
{
    "conf": {
        "spark.jars": "s3://jar-test/mysql-connector-java-5.1.42-bin.jar"        
    }
}