[英]Not able to write Spark SQL DataFrame to S3
我已经在EC2上安装了spark 2.0,并且正在使用Scala使用SparkSQL从DB2检索记录,并且我想写入S3,在这里我将访问密钥传递给Spark Context。以下是我的代码:
val df = sqlContext.read.format("jdbc").options(Map( "url" -> , "user" -> usernmae, "password" -> password, "dbtable" -> tablename, "driver" -> "com.ibm.db2.jcc.DB2Driver")).option("query", "SELECT * from tablename limit 10").load()
df.write.save("s3n://data-analytics/spark-db2/data.csv")
并且它引发以下异常:
org.apache.hadoop.fs.s3.S3Exception: org.jets3t.service.S3ServiceException: Service Error Message. -- ResponseCode: 403, ResponseStatus: Forbidden, XML Error Message: <?xml version="1.0" encoding="UTF-8"?><Error><Code>AccessDenied</Code><Message>Access Denied</Message><RequestId>1E77C38FA2DB34DA</RequestId><HostId>V4O9sdlbHwfXNFtoQ+Y1XYiPvIL2nTs2PIye5JBqiskMW60yDhHhnBoCHPDxLnTPFuzyKGh1gvM=</HostId></Error>
Caused by: org.jets3t.service.S3ServiceException: Service Error Message.
at org.jets3t.service.S3Service.putObject(S3Service.java:2358)
at org.apache.hadoop.fs.s3native.Jets3tNativeFileSystemStore.storeEmptyFile(Jets3tNativeFileSystemStore.java:162)
我将访问密钥也传递给Sparkcontext时,这里发生的确切问题是什么? 还有其他写S3的方式吗?
获得密钥后,这就是在s3n上的scala / spark2中写出到s3的方法。
spark.sparkContext.hadoopConfiguration.set("fs.s3n.awsAccessKeyId", "[access key]")
spark.sparkContext.hadoopConfiguration.set("fs.s3n.awsSecretAccessKey", "[secret key]")
spark.sparkContext.hadoopConfiguration.set("fs.s3n.impl", "org.apache.hadoop.fs.s3native.NativeS3FileSystem")
df.write
.mode("overwrite")
.parquet("s3n://bucket/folder/parquet/myFile")
这是使用s3a的方法,这是首选。
spark.sparkContext.hadoopConfiguration.set("fs.s3a.access.key", "[access key]")
spark.sparkContext.hadoopConfiguration.set("fs.s3a.secret.key", "[secret key]")
spark.sparkContext.hadoopConfiguration.set("fs.s3a.impl", "org.apache.hadoop.fs.s3a.S3AFileSystem")
df.write
.mode("overwrite")
.parquet("s3a://bucket/folder/parquet/myFile")
请参阅这篇文章以了解s3,s3n和s3a之间的区别。
在AWS上创建EC2实例或EMR群集时,可以在创建过程中选择将IAM角色附加到该实例或群集。
默认情况下,不允许EC2实例连接到S3。 您需要创建一个角色,然后将其首先附加到实例。
附加IAM角色的目的在于,可以为IAM角色授予使用各种其他AWS服务的权限,而无需在该实例上安装物理证书。 鉴于存在拒绝访问错误,我假设该实例没有附加IAM角色,但具有写入S3所需的足够权限。
创建新IAM角色的方法如下:
对于常规的旧单个EC2实例,请单击“创建新实例”:
对于EMR集群:
你可以试试这个
df.write.mode("append").format("csv").save("path/to/s3/bucket");
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.