Мы можем установить следующие конфигурации в службе HDFS (core-site. xml) с помощью пользовательского интерфейса Cloudera Manager:
fs.s3a.access.key
fs.s3a.secret.key
Однако это повлияет на весь кластер. Все задания Spark, выполняемые в кластере, будут использовать одни и те же конфигурации для доступа к S3.
Мы хотели бы иметь возможность настраивать ведро S3 и доступ для каждого задания Spark независимо.
Использование Spark -shell, мы можем использовать следующие команды для успешного запроса таблицы Hive, хранящейся в S3:
scala> sc.hadoopConfiguration.set("fs.s3a.access.key","XXXXXXXXXXXXXXXX")
scala> sc.hadoopConfiguration.set("fs.s3a.secret.key","XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX")
scala> spark.sql("select count(1) from <database>.<table>").show()
+--------+
|count(1)|
+--------+
| 100|
+--------+
Однако программная установка тех же конфигураций в нашем коде Java не будет работать для того же запроса для таблица Hive.
Подход 1 (с использованием конфигураций spark.had oop. *):
SparkConf sparkConf = new SparkConf();
sparkConf.set("spark.hadoop.fs.s3a.access.key", "XXXXXXXXXXXXXXXX");
sparkConf.set("spark.hadoop.fs.s3a.secret.key", "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX");
SparkSession spark = SparkSession.builder().config(sparkConf).enableHiveSupport().getOrCreate();
Подход 2 (с использованием 'hadoopConfiguration' и без 'spark.had oop 'prefix):
SparkConf sparkConf = new SparkConf();
SparkSession spark = SparkSession.builder().config(sparkConf).enableHiveSupport().getOrCreate();
spark.sparkContext().hadoopConfiguration().set("fs.s3a.access.key", "XXXXXXXXXXXXXXXX");
spark.sparkContext().hadoopConfiguration().set("fs.s3a.secret.key", "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX");
Оба подхода не работают. Когда запускается задание Spark на основе Java, оно выдает ошибку:
The directory s3a://<bucket>/path/to/database/table/<table>/file_name=file_23300820194892734.parquet was not found. Was it deleted very recently?
+--------+
|count(1)|
+--------+
|0 |
+--------+
Это известная проблема? Есть ли способ обойти это?