一、coalesce算址的使用
使用coalesce算子阱高,可以手動減少DataFrame的partition數(shù)量,并且不用觸發(fā)shuffle,這也是coalesce跟repartition的區(qū)別。
repartition(numPartitions:Int):RDD[T]
coalesce(numPartitions:Int离赫,shuffle:Boolean=false):RDD[T]
以上為他們的定義肢娘,區(qū)別就是repartition一定會觸發(fā)shuffle呈础,而coalesce默認是不觸發(fā)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壓縮文件珊皿,會產(chǎn)生1868個分區(qū)网缝,造成啟動太多的task,時間反而較慢蟋定,把其改成了6*8*3=144,分區(qū)為144粉臊,啟動144個task,反而速度較快。