Я хочу разрешить 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, не имела разрешения на создание сегмента. Проблема была решена путем сохранения данных в уже существующую корзину.