在Spark性能优化方面, 数据结构是重点之一。一个合理的数据结构设计不仅能够降低内存消耗,同时也能节约运行时间。下面主要针对Long与String数据类型做分析,看一面两个例子对比
1. 在RDD数据类型中,使用Long的情况
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类型,运行结果如下:
[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秒
2 在RDD数据类型中,使用String的情况
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要消耗更长的时间
在内存消耗方面:
数据类型 | rdd1 cache 内存大小 |
---|---|
String | 46.2G |
Long | 8.6G |
在内存对比方面,使用Long类型需要更小的存储
因此在开发过程中,尽量避免使用String类型
来源:oschina
链接:https://my.oschina.net/u/3780646/blog/3192852