簡體   English   中英

通過使用臨時憑證從AWS外部通過Spark從s3中讀取

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM