首页 > 解决方案 > Hadoop S3 配置无法在 Cloudera 环境中运行的 Spark 会话上设置 (CDH 6.3.0)

问题描述

我们可以使用 Cloudera Manager UI 在 HDFS 服务 (core-site.xml) 上设置以下配置:

fs.s3a.access.key
fs.s3a.secret.key

但是,这将影响整个集群。在集群中运行的所有 Spark 作业都将使用这些相同的配置来访问 S3。

我们希望能够独立配置每个 Spark 作业的 S3 存储桶和访问权限。

使用 spark-shell,我们可以使用以下命令成功查询存储在 S3 中的 Hive 表:

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.hadoop.* 配置):

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.hadoop' 前缀):

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");

两种方法都行不通。当基于 Java 的 Spark 作业运行时,它会给出错误:

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 |
+--------+

这是一个已知的问题?有什么解决方法吗?

标签: apache-sparkhadoopamazon-s3hdfscloudera-cdh

解决方案


推荐阅读