1. 程式人生 > >解決Spark讀取HDFS小檔案的問題

解決Spark讀取HDFS小檔案的問題

若Spark讀取HDFS資料夾時, 其中的小檔案過多會降低程式效能,也給HDFS帶來壓力。
當Spark讀取檔案時, 會為每個檔案的資料分配一個Partition, 可以使用coalesce運算元減少rdd中的分割槽。

  • 首先, 編寫函式實現根據檔案大小來確定分割槽數的功能
  def coalesceNum(path: String, targetSize_M: Long): Int ={
    val fileSystem = FileSystem.get(new URI("hdfs://c1:8020"),new Configuration(), "hdfs");
    var size = 0l
    fileSystem.globStatus(new Path(path + "/*")).foreach(x => {
      size += x.getLen
    })
//    加一是因為Partition的個數不能為0
    (size / 1024 /1024 / size).toInt + 1
  }
  • 使用coalesce運算元
val originRDD = spark.sparkContext.textFile(path).coalesce(RddUtils.coalesceNum