Spark Redshift:使用火花读取红移表时出错

Posted

技术标签:

【中文标题】Spark Redshift:使用火花读取红移表时出错【英文标题】:Spark Redshift: error while reading redshift tables using spark 【发布时间】:2017-01-25 09:41:02 【问题描述】:

我在使用 spark 从 redshift 表中读取数据时遇到错误。

下面是代码:

    Dataset<Row> dfread = sql.read()
            .format("com.databricks.spark.redshift")
            .option("url", url)
            //.option("query","select * from TESTSPARK")
            .option("dbtable", "TESTSPARK")
            .option("forward_spark_s3_credentials", true)
            .option("tempdir","s3n://test/Redshift/temp/")
            .option("sse", true)
            .option("region", "us-east-1")
            .load(); 

错误:

Exception in thread "main" java.sql.SQLException: [Amazon](500310) Invalid operation: Unable to upload manifest file - S3ServiceException:Access Denied,Status 403,Error AccessDenied,Rid=,CanRetry 1

详情:

error:  Unable to upload manifest file - S3ServiceException:Access Denied,Status 403,Error AccessDenied,Rid 6FC2B3FD56DA0EAC,ExtRid I,CanRetry 1
  code:      9012
  context:   s3://jd-us01-cis-machine-telematics-devl-data- 
  processed/Redshift/temp/f06bc4b2-494d-49b0-a100-2246818e22cf/manifest
  query:     44179 

有人可以帮忙吗?

【问题讨论】:

【参考方案1】:

当 Redshift 尝试访问您告诉它加载的文件时,您会从 S3 收到权限错误。

在调用load()之前,您是否为 S3 访问配置了访问密钥?

sc.hadoopConfiguration.set("fs.s3.awsAccessKeyId", "ASDFGHJKLQWERTYUIOP")
sc.hadoopConfiguration.set("fs.s3.awsSecretAccessKey", "QaZWSxEDC/rfgyuTGBYHY&UKEFGBTHNMYJ")

您应该能够通过查询 stl_query 表来检查 Redshift 端使用了哪个访问密钥 ID。

【讨论】:

【参考方案2】:

来自错误“S3ServiceException:Access Denied”

似乎没有为 Redshift 设置访问 S3 文件的权限。请按照以下步骤操作

    向该存储桶添加允许 Redshift 帐户的存储桶策略 访问在 Redshift 账户中创建一个 IAM 角色,redshift 可以 assume 将访问 S3 存储桶的权限授予新创建的角色 将角色与 Redshift 集群关联

运行 COPY 语句

【讨论】:

以上是关于Spark Redshift:使用火花读取红移表时出错的主要内容,如果未能解决你的问题,请参考以下文章

火花红移。将数组展平为字符串

以追加模式写入pyspark中的红移

提高效率的红移表设计

从红移表中获取上次更新时间戳

我可以直接查询以镶木地板格式存储在 s3 中的数据的红移表吗

红移表中的更新