正在spark中动态更改hdfs复制因子



在Spark(3.2.0(应用程序中,我需要更改写入HDFS的不同文件的复制因子。例如,我编写了一些临时文件,并且希望它们使用复制因子1来编写。然后,我编写一些将是持久的文件,我希望它们使用复制因子2,有时是3来编写。

然而,正如我所测试的;SparkContext.hadoopConfiguration中的dfs.replication根本不影响文件的复制因子,而spark.hadoop.dfs.replication仅在使用以下先前定义的SparkConf创建SparkSession时才设置它(或更改在HDFS侧设置的默认复制(。

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.sql.legacy.setCommandRejectsSparkCoreConfs,它在Spark 3.0中被添加到core conf中,默认情况下被设置为true,并且要更改其他一些core confs,需要在创建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)
}

不改变用更新的CCD_ 11和CCD_。

有没有任何方法可以在同一个spark会话中使用不同的复制因子将文件写入HDFS?

完全可以在每个文件/文件夹的基础上完成。但是您需要使用hadoop工具。

休息呼叫:https://hadoop.apache.org/docs/stable/hadoop-project-dist/hadoop-hdfs/WebHDFS.html

也有命令行选项,但我认为WebHDFS更干净。

最新更新