![](/img/trans.png)
[英]Scala Spark Read from AWS S3 - com.amazonaws.SdkClientException: Unable to load credentials from service endpoint
[英]Read from s3 via spark from outside AWS using temp credentials
我正在嘗試通過IntelliJ從筆記本電腦讀取s3中的文件,以便可以更輕松地開發我的spark工作。
textFile RDD代碼可在EMR集群內的Zeppelin中使用,但是當我在本地嘗試時無法使用。
在Zeppelin中,我不需要進行任何Spark上下文設置,大概是因為Zeppelin實例在AWS環境中,所以它為我完成了設置。
我已經編寫了用於創建臨時AWS憑證的代碼(使用IAM用戶密鑰),以便可以向Spark上下文提供會話令牌。 訪問密鑰和秘密密鑰也來自臨時憑證。
val sqlContext = sparkSession.sqlContext
sqlContext.sparkContext.hadoopConfiguration
.set("fs.s3a.impl", "org.apache.hadoop.fs.s3native.NativeS3FileSystem")
sqlContext.sparkContext.hadoopConfiguration
.set("fs.s3a.awsAccessKeyId", accessKeyId)
sqlContext.sparkContext.hadoopConfiguration
.set("fs.s3a.access.key", accessKeyId)
sqlContext.sparkContext.hadoopConfiguration
.set("fs.s3a.awsSecretAccessKey", secretAccessKey)
sqlContext.sparkContext.hadoopConfiguration
.set("fs.s3a.secret.key", secretAccessKey)
sqlContext.sparkContext.hadoopConfiguration
.set("fs.s3a.session.token", sessionToken)
sqlContext.sparkContext.hadoopConfiguration.set("fs.s3a.credentialsType", "AssumeRole")
sqlContext.sparkContext.hadoopConfiguration
.set(
"fs.s3a.stsAssumeRole.arn",
"arn:aws:iam::1234:role/someRoleThatWasUsedInTheWorkingTempCredCode"
)
sqlContext.sparkContext.hadoopConfiguration.set(
"fs.s3a.aws.credentials.provider",
"org.apache.hadoop.fs.s3a.TemporaryAWSCredentialsProvider"
)
sqlContext.sparkContext.textFile(
"s3a://path/to/file/that/definitely/exists/3714bb50a146.gz"
).collect()
我原本期望一個包含文件中數據的數組,但我拒絕了權限。
org.apache.hadoop.security.AccessControlException: Permission denied: s3n://path/to/file/that/definitely/exists/3714bb50a146.gz
at org.apache.hadoop.fs.s3native.Jets3tNativeFileSystemStore.processException(Jets3tNativeFileSystemStore.java:449)
at org.apache.hadoop.fs.s3native.Jets3tNativeFileSystemStore.processException(Jets3tNativeFileSystemStore.java:427)
兩個問題:
1)我正在做什么(執行從本地s3讀取的spark作業)?
2)如果我正在做的事情是可能的,我的Spark上下文設置代碼是否有效? 我覺得我缺少屬性或使用了錯誤的屬性密鑰。
擺脫關於fs.s3a.impl的那條線。 它所做的只是將默認映射從“ s3a”更改為“現代的,受支持的,維護的S3A連接器”,將其更改為“舊的,過時的,不受支持的S3N連接器”
您不需要那條線。 人們編寫Spark應用程序總是這樣做,這只是迷信。 Hadoop常見者知道哪個文件系統類處理s3a URL的方式與知道誰處理“文件”和“ hdfs”的方式相同
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.