我正在尝试使用 spark-submit.sh 在 Bluemix 上运行 Spark+Scala 应用程序。到目前为止,基于documentation和 source 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/