【发布时间】:2021-12-24 02:00:23
【问题描述】:
在 Spark (3.2.0) 应用程序中,我需要更改写入 HDFS 的不同文件的复制因子。例如,我写了一些临时文件,我希望它们使用复制因子 1 写入。然后,我编写一些将要持久的文件,我希望它们使用复制因子 2,有时是 3 .
但是,正如我测试的那样; dfs.replication in SparkContext.hadoopConfiguration 根本不影响文件的复制因子,而 spark.hadoop.dfs.replication 仅在使用先前定义的 SparkSession 创建时才设置它(或更改在 HDFS 端设置的默认复制) SparkConf 如下。
val conf = new SparkConf()
conf.set("spark.hadoop.dfs.replication", "1")) // works but cannot be changed later.
val sparkSession: SparkSession = SparkSession.builder.config(conf).getOrCreate()
在文档上进行了一些搜索后,我发现了在 Spark 3.0 中添加到核心配置中的配置 spark.sql.legacy.setCommandRejectsSparkCoreConfs,默认设置为 true,并且需要更改其他一些核心配置在创建 SparkSession 时显式设置为 false。即使我这样做并防止像org.apache.spark.sql.AnalysisException: Cannot modify the value of a Spark config 这样的错误,通过在下面的函数中设置两个配置来将复制因子设置为不同的值
def setReplicationFactor(rf: Short): Unit = {
val activeSparkSession = SparkSession.getActiveSession.get
activeSparkSession.conf.set("spark.hadoop.dfs.replication", rf.toString)
activeSparkSession.sparkContext.hadoopConfiguration.set("dfs.replication", rf.toString)
}
不会更改使用更新的SparkConf 和SparkContext.hadoopConfiguration 写入的文件。
有什么方法可以在同一个 spark session 中实现不同复制因子的文件写入 HDFS?
【问题讨论】:
标签: scala apache-spark hdfs replication-factor