Spark性能优化之数据结构

半腔热情 提交于 2020-03-12 20:12:35

在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类型

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!