scala - Spark+Scala App如何对云对象存储进行认证授权?

标签 scala apache-spark ibm-cloud object-storage

我正在尝试使用 spark-submit.sh 在 Bluemix 上运行 Spark+Scala 应用程序。到目前为止,基于documentationsource code我想出了以下代码片段:

val spark: SparkSession = SparkSession
  .builder
  .appName("app")
  .config("spark.hadoop.fs.cos.softlayer.endpoint",
          "s3-api.us-geo.objectstorage.service.networklayer.com")
  .config("spark.hadoop.fs.cos.softlayer.access.key",
          "auto-generated-apikey-<redacted>")
  .config("spark.hadoop.fs.cos.softlayer.secret.key",
          "<redacted>")
  .getOrCreate()
spark.sparkContext.setLogLevel("TRACE")
spark.sparkContext.textFile("s3d://<bucket>.softlayer/<file>")

失败了

Exception in thread "Driver" java.lang.NullPointerException
        at com.ibm.stocator.fs.common.ObjectStoreGlobber.glob(ObjectStoreGlobber.java:179)
        at com.ibm.stocator.fs.ObjectStoreFileSystem.globStatus(ObjectStoreFileSystem.java:443)
        at org.apache.hadoop.mapred.FileInputFormat.singleThreadedListStatus(FileInputFormat.java:259)

由于

DEBUG apache.http.headers: http-outgoing-0 << HTTP/1.1 403 Forbidden

我相信 403 意味着“身份验证成功,但授权未成功”,但即使我将凭据更改为随机的内容,我仍然会收到 403。

我将我的服务帐户配置为所有“云对象存储”资源的读取器。

相同的凭据对我来说工作正常 python .

我错过了什么?

最佳答案

不幸的是,AE beta 的当前文档引用了 IaaS version of COS ,它使用 AWS 样式 (HMAC) 凭证进行身份验证,而不是 IBM Cloud IAM 提供的 API key 。支持 IAM 的 COS 将于今年晚些时候推出对 HMAC 凭证的支持。

AE 文档应该很快就会更新,其中包含使用 API key 连接到 COS 的示例。同时,请尝试以下配置语法:

.config("spark.hadoop.fs.cos.iamservice.iam.endpoint",
          "https://iam.ng.bluemix.net/oidc/token")   
.config("spark.hadoop.fs.cos.iamservice.endpoint",
          "s3-api.us-geo.objectstorage.service.networklayer.com")
.config("spark.hadoop.fs.cos.iamservice.iam.api.key",
          "<api-key>")
.config("spark.hadoop.fs.cos.iamservice.iam.service.id",
          "<resource-instance-id>")

关于scala - Spark+Scala App如何对云对象存储进行认证授权?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46873686/

相关文章:

斯卡拉 Akka : have actor remember something it should eventually reply to?

sql-生成64位的随机整数

csv - 使用 Spark 将 CSV 转换为 parquet,保留分区

javascript - 如何在 javascript 中读取 VCAP_SERVICES 环境变量

websphere-liberty - 如何将 Bluemix Liberty for Java 链接到 jazzhub git 存储库?

javascript - 在 liftweb 静态内容中嵌入 javascript for 循环的问题

scala - 如何拆分列表[Either[A, B]]

scala - Spark 是否在读取时维护 Parquet 分区?

apache-spark - Zeppelin 不显示堆栈跟踪

ibm-cloud - 如何删除 IBM Bluemix 中的 "space"?