apache-spark - 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 |
+--------+
这是一个已知的问题?有什么解决方法吗?
解决方案
推荐阅读
- java - 从 SQL 字符串设置 Java 枚举值
- selenium - 我正在打开浏览器并登录网页。现在我想打开一个新标签并使用新打开的标签中的另一个链接
- json - 如何从邮递员发送 JSON 用于自定义 VO
- firebase - Firebase 实时数据库查询多个属性
- r - 如何在R中的一个对象中存储多个决策树
- machine-learning - 向量化梯度下降函数
- algorithm - 冒泡排序的两种不同解决方案的时间复杂度
- java - 如何读取 rsa 公钥形式的字符串(由 java 生成,我想用 Python 读取)
- json - .net core restful api返回json,内容类型为application/json
- python - PyInstaller 没有创建 .exe 文件