美文网首页
1sparksql优化之coalesce

1sparksql优化之coalesce

作者: 舞阳人的北京路 | 来源:发表于2018-01-07 20:02 被阅读0次

    一、coalesce算址的使用

    使用coalesce算子,可以手动减少DataFrame的partition数量,并且不用触发shuffle,这也是coalesce跟repartition的区别。

    repartition(numPartitions:Int):RDD[T]

    coalesce(numPartitions:Int,shuffle:Boolean=false):RDD[T]

    以上为他们的定义,区别就是repartition一定会触发shuffle,而coalesce默认是不触发shuffle的。

    二、coalesce算址我这次使用的场景

    代码


    val num_executors = 6

    val executor_cores = 8

    val stg_device_task_nums = num_executors.toInt * executor_cores.toInt *3

    val queryDate = args(0).trim

    val stg_device_hql =s"""

    |SELECT  s.day AS s_day,

    |        s.app_key AS s_app_key,

    |        s.device_id AS s_device_id,

    |        s.tmp_id AS s_tmp_id

    |FROM hqb.device_info_d s

        |WHERE day='$queryDate'

    |        AND app_key <> 'null'

    |        AND tmp_id <> 'null'

    |        AND s.tmp_id is NOT null

    """.stripMargin

    val stg_device_df = hiveContext.sql(stg_device_hql).coalesce(stg_device_task_nums)


    这里为什么要用到coalesce呢?是因为,如果不使用的话,我查询的表是用

    [isuhadoop@zk200 ~]$ hadoop fs -ls /user/hive/warehouse/hqb.db/device_info_d/day=20171206/*/ | wc -l

    1868

    文件类型为-m-00217.gz

    文件都不大,在10.5M左右,但是是gz压缩文件,会产生1868个分区,造成启动太多的task,时间反而较慢,把其改成了6*8*3=144,分区为144,启动144个task,反而速度较快。

    相关文章

      网友评论

          本文标题:1sparksql优化之coalesce

          本文链接:https://www.haomeiwen.com/subject/xbdmnxtx.html