解決Spark讀取HDFS小檔案的問題
阿新 • • 發佈:2019-08-03
若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