spark-26.spark調優_4_程序開發調優

避免創建重複的RDD

需要對名爲“hello.txt”的HDFS文件進行一次map操作,再進行一次reduce操作。也就是說,需要對一份數據執行兩次算子操作。

  • 錯誤的做法:
    對於同一份數據執行多次算子操作時,創建多個RDD。這裏執行了兩次textFile方法,針對同一個HDFS文件,創建了兩個RDD出來,然後分別對每個RDD都執行了一個算子操作。這種情況下,Spark需要從HDFS上兩次加載hello.txt文件的內容,並創建兩個單獨的RDD;第二次加載HDFS文件以及創建RDD的性能開銷,很明顯是白白浪費掉的。
val rdd1 = sc.textFile("hdfs://master01:9000/hello.txt")
rdd1.map(...)
val rdd2 = sc.textFile("hdfs://master01:9000/hello.txt")
rdd2.reduce(...)
  • 正確的用法:
    對於一份數據執行多次算子操作時,只使用一個RDD。

儘可能複用同一個RDD錯誤的做法:

有一個<long , String>格式的RDD,即rdd1。
接着由於業務需要,對rdd1執行了一個map操作,創建了一個rdd2,
而rdd2中的數據僅僅是rdd1中的value值而已,也就是說,rdd2是rdd1的子集。

JavaPairRDD<long , String> rdd1 = ...
JavaRDD<string> rdd2 = rdd1.map(...)

分別對rdd1和rdd2執行了不同的算子操作。

rdd1.reduceByKey(...)
rdd2.map(...)

正確的做法:
rdd2的數據完全就是rdd1的子集而已,卻創建了兩個rdd,並對兩個rdd都執行了一次算子操作。
此時會因爲對rdd1執行map算子來創建rdd2,而多執行一次算子操作,進而增加性能開銷。
其實在這種情況下完全可以複用同一個RDD。
我們可以使用rdd1,既做reduceByKey操作,也做map操作。

JavaPairRDD<long , String> rdd1 = ...
rdd1.reduceByKey(...)
rdd1.map(tuple._2...)

對多次使用的RDD進行持久化

儘量避免使用shuffle類算子

使用map-side預聚合的shuffle操作

使用高性能的算子

廣播大變量

使用Kryo優化序列化性能

優化數據結構

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章