一、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,反而速度较快。