Spark性能優化之數據結構

在Spark性能優化方面, 數據結構是重點之一。一個合理的數據結構設計不只可以下降內存消耗,同時也能節約運行時間。下面主要針對Long與String數據類型作分析,看一面兩個例子對比java


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類型,運行結果以下: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秒性能優化

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要消耗更長的時間oop

在內存消耗方面:性能

數據類型 rdd1 cache 內存大小
String 46.2G
Long 8.6G

在內存對比方面,使用Long類型須要更小的存儲優化

所以在開發過程當中,儘可能避免使用String類型spa

相關文章
相關標籤/搜索