1sparksql优化之coalesce

一、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)