【问题标题】:Altering hdfs replication factor dynamically in spark在火花中动态改变hdfs复制因子
【发布时间】: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)
}

不会更改使用更新的SparkConfSparkContext.hadoopConfiguration 写入的文件。

有什么方法可以在同一个 spark session 中实现不同复制因子的文件写入 HDFS?

【问题讨论】:

    标签: scala apache-spark hdfs replication-factor


    【解决方案1】:

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

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

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

    【讨论】:

    • 我认为 OP 的问题是关于 Spark/程序化的方式。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-05-15
    • 1970-01-01
    • 2016-05-26
    • 2013-07-24
    • 2013-07-21
    • 1970-01-01
    • 2013-06-18
    相关资源
    最近更新 更多