将数据从PySpark推送到RedShift时出现问题

时间:2017-11-11 12:49:08

标签: apache-spark amazon-s3 pyspark amazon-redshift

我有一个数据框,我试图将其写入红移表。我已经提供了所有身份验证凭据,以便从Spark连接到redshift和S3。 以下是代码。

    joinedDf.registerTempTable("mytable1")
    jdbcURL = "jdbc:redshift://server:port/db?user=username&password=password"
    tempS3Dir = "s3://bucket url"
    sc._jsc.hadoopConfiguration().set("fs.s3n.awsAccessKeyId", "Access KEY ID")
    sc._jsc.hadoopConfiguration().set("fs.s3n.awsSecretAccessKey", "Secret Access KEY")
    spark.sql("SELECT * FROM mytable1") \
    .write \
    .format("com.databricks.spark.redshift") \
    .option("url", jdbcURL) \
    .option("tempdir", tempS3Dir) \
    .option("dbtable", "mytable") \
    .option("aws_iam_role", "arn of RedShift") \
    .mode('append') \
    .save()

但是,我收到以下错误:

Caused by: java.lang.ClassNotFoundException: Class com.amazon.ws.emr.hadoop.fs.EmrFileSystem not found
        at org.apache.hadoop.conf.Configuration.getClassByName(Configuration.java:2101)
        at org.apache.hadoop.conf.Configuration.getClass(Configuration.java:2193)
        ... 35 more

似乎问题是缺少jar,但是,在启动spark应用程序时,我已经包含了必需的jar。

spark-submit \
--master yarn \
--driver-class-path /home/hadoop/mysql-connector-java-5.0.8-bin.jar,RedshiftJDBC42-1.2.10.1009.jar,spark-redshift_2.11-3.0.0-preview1.jar,aws-java-sdk-core-1.9.8.jar,aws-java-sdk-s3-1.9.8.jar,hadoop-aws-2.7.0.jar,hadoop-common-2.7.3.jar \
--jars /home/hadoop/mysql-connector-java-5.0.8-bin.jar,RedshiftJDBC42-1.2.10.1009.jar,spark-redshift_2.11-3.0.0-preview1.jar,aws-java-sdk-core-1.9.8.jar,aws-java-sdk-s3-1.9.8.jar,hadoop-aws-2.7.0.jar,hadoop-common-2.7.3.jar \
/home/hadoop/code.py

有人可以帮我解决这个问题吗?或者,是否有任何其他经过试验和测试的解决方案。 顺便说一句,它是AWS EMR中的单节点集群, PySpark Verion是2.2

0 个答案:

没有答案