避免創建重複的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...)