Как аутентифицировать и авторизовать приложение Spark+Scala в облачном хранилище объектов?

Я пытаюсь запустить приложение Spark+Scala в Bluemix, используя spark-submit.sh. На данный момент на основе документация и источник 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.

Что мне не хватает?


person mephi42    schedule 22.10.2017    source источник


Ответы (1)


К сожалению, текущая документация для бета-версии AE относится к версии COS IaaS, который использует учетные данные в стиле AWS (HMAC) для аутентификации вместо ключа API, предоставляемого IBM Cloud IAM. Поддержка учетных данных HMAC в COS с поддержкой IAM появится позже в этом году.

Документы AE скоро должны быть обновлены примерами использования ключа API для подключения к 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>")
person Nick Lange    schedule 23.10.2017
comment
В дополнение к изменению ключей конфигурации я также изменил URL-адрес на s3d://‹bucket›.iamservice/‹file›, и это сработало. Спасибо! - person mephi42; 23.10.2017
comment
К какой службе относится spark.hadoop.fs.cos.iamservice.iam.service.id? IAM-сервис? Как получить идентификатор этой службы? - person tsnee; 12.10.2018