GCS Connector для Spark Issue - Ошибка при получении корзины - PullRequest
0 голосов
/ 12 января 2020

Я хочу разрешить Spark экспортировать данные в Google Cloud Storage, а не сохранять их в HDFS. Для этого я установил Google Cloud Storage Connector для Spark . Вот пример кода внутри контекста Spark, который я использую для сохранения кадра данных в корзину:

val someDF = Seq(
  (8, "bat"),
  (64, "mouse"),
  (-27, null)
).toDF("number", "word")

val conf = sc.hadoopConfiguration
conf.set("fs.AbstractFileSystem.gs.impl", "com.google.cloud.hadoop.fs.gcs.GoogleHadoopFS")
conf.set("fs.gs.project.id", PROJECT_ID)
conf.set("fs.gs.auth.service.account.enable", "true")
conf.set("fs.gs.auth.service.account.json.keyfile", LOCATION_TO_KEY.json)

someDF
  .write
  .format("parquet")
  .mode("overwrite")
  .save(s"gs://BUCKET_GLOBAL_IDENTIFIER/A_FOLDER_IN_A_BUCKET/)

Я получаю довольно криптное c исключение после выполнения кода:

java.io.IOException: Error getting 'BUCKET_GLOBAL_IDENTIFIER' bucket
  at com.google.cloud.hadoop.gcsio.GoogleCloudStorageImpl$8.onFailure(GoogleCloudStorageImpl.java:1633)
  at com.google.cloud.hadoop.gcsio.BatchHelper.execute(BatchHelper.java:183)
  at com.google.cloud.hadoop.gcsio.BatchHelper.lambda$queue$0(BatchHelper.java:163)
  at java.util.concurrent.FutureTask.run(FutureTask.java:266)
  at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
  at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
  at java.lang.Thread.run(Thread.java:745)
Caused by: com.google.api.client.googleapis.json.GoogleJsonResponseException
  at com.google.cloud.hadoop.gcsio.GoogleCloudStorageExceptions.createJsonResponseException(GoogleCloudStorageExceptions.java:82)
  at com.google.cloud.hadoop.gcsio.GoogleCloudStorageImpl$8.onFailure(GoogleCloudStorageImpl.java:1624)
  ... 6 more

Может ли кто-нибудь подсказать мне, как с этим бороться? Вот список вопросов, которые я уже решил, чтобы добраться до этой точки:

  • Ключ не может быть доступен Spark. Проблема заключалась в том, что он не был доступен на физических узлах, на которых запускался Spark.
  • Учетная запись службы GCS, используемая для соединителя Spark, не имела разрешения на создание сегмента. Проблема была решена путем сохранения данных в уже существующую корзину.

1 Ответ

0 голосов
/ 30 января 2020

Похоже, вы пропустили двойные кавычки в конце строки .save

У вас есть:

save(s"gs://BUCKET_GLOBAL_IDENTIFIER/A_FOLDER_IN_A_BUCKET/)

Но правильным будет:

save(s"gs://BUCKET_GLOBAL_IDENTIFIER/A_FOLDER_IN_A_BUCKET/")

Ошибка в том, что ваши переменные обрабатываются как строки, а не переменные, скорее всего, потому что вы пропустили кавычки.

...