在Spark性能優化方面, 數據結構是重點之一。一個合理的數據結構設計不只可以下降內存消耗,同時也能節約運行時間。下面主要針對Long與String數據類型作分析,看一面兩個例子對比java
package com.haizhi.aidp import java.util.Date import com.haizhi.aidp.bigdata.SparkHelper import com.haizhi.aidp.common.base.BaseTool._ import org.apache.log4j.{Level, Logger} /** * Hello world! * */ object TestJoin { def main(args: Array[String]): Unit = { Logger.getLogger("org").setLevel(Level.ERROR) val spark = SparkHelper.getSparkContext() val rdd1 = spark.makeRDD(1 to 30000000) .flatMap(i => (0 to i % 13).map(j => (i+j, j))) .map(x => { val src = md5ToLong(md5(x._1.toString)) val dst = md5ToLong(md5(x._2.toString)) (src, dst) }).cache() println("rdd1_count: " + rdd1.count) val startTime = new Date() val rdd2 = rdd1.join(rdd1.map(x => x._2 -> x._1)) println("rdd2_count: " + rdd2.count) println("cost: " + currencyExecuteTime(startTime)) } }
上述代碼主要是實現兩個RDD進行join操做,Join的Key是Long類型,運行結果以下:apache
[dig@hadoop01 bin]$ sh test-join.sh [2020-02-21 07:54:18]-[INFO]-[com.haizhi.aidp.bigdata.SparkHelper$:80] - 設置SparkContext默認的CheckpointDir爲hdfs://hadoop01.sz.haizhi.com:8020/user/dig/checkpoint rdd1_count: 209999986 rdd2_count: 551538405 cost: 45秒
能夠看到,使用Long類型做爲key的操做耗時是45秒性能優化
package com.haizhi.aidp import java.util.Date import com.haizhi.aidp.bigdata.SparkHelper import com.haizhi.aidp.common.base.BaseTool._ import org.apache.log4j.{Level, Logger} /** * Hello world! * */ object TestJoin { def main(args: Array[String]): Unit = { Logger.getLogger("org").setLevel(Level.ERROR) val spark = SparkHelper.getSparkContext() val rdd1 = spark.makeRDD(1 to 30000000) .flatMap(i => (0 to i % 13).map(j => (i+j, j))) .map(x => { val src = md5(x._1.toString) val dst = md5(x._2.toString) (src, dst) }).cache() println("rdd1_count: " + rdd1.count) val startTime = new Date() val rdd2 = rdd1.join(rdd1.map(x => x._2 -> x._1)) println("rdd2_count: " + rdd2.count) println("cost: " + currencyExecuteTime(startTime)) } }
運行結果以下:數據結構
[dig@hadoop01 bin]$ sh test-join.sh [2020-02-21 07:42:51]-[INFO]-[com.haizhi.aidp.bigdata.SparkHelper$:80] - 設置SparkContext默認的CheckpointDir爲hdfs://hadoop01.sz.haizhi.com:8020/user/dig/checkpoint rdd1_count: 209999986 rdd2_count: 551538405 cost: 1分34秒
能夠看到,使用String做爲key的耗時爲1分34秒,比Long做爲Key要消耗更長的時間oop
在內存消耗方面:性能
數據類型 | rdd1 cache 內存大小 |
---|---|
String | 46.2G |
Long | 8.6G |
在內存對比方面,使用Long類型須要更小的存儲優化
所以在開發過程當中,儘可能避免使用String類型spa