环境:hive1.2.1 + hadoop2.7.2 + tez0.8.4
最近在使用tez的过程中发现,tez中提供了类似于hive on mr中的mapjoin的操作,叫做brocast join。对于小表join大表有很好的效果。
看例子:
set hive.execution.engine=tez; set hive.convert.join.bucket.mapjoin.tez=true; set hive.auto.convert.join=true; set hive.auto.convert.join.noconditionaltask = true; set hive.auto.convert.join.noconditionaltask.size =100000000; select count(*) from temp.dwd_flow_sdk_tv_video_play_day_data_agnes_agnes_play_hour_20160830 t1 inner join temp.dwd_flow_sdk_tv_video_play_day_data_agnes_agnes_action_hour_20160830 t2 on (t1.start_id = t2.start_id and t1.play_id = t2.play_id and t1.app_run_id = t2.app_run_id and t1.app_name = t2.app_name) 其中t1表是小表。
这种情况下启用了hive的自动判断小表以及mapjoin的功能。效果如下:
如果关闭mapjoin选项,运行效果如下
因此,对于一些小表join大表并且有数据倾斜的任务,使用hive on tez的时候,可以利用broadcast join来提高效率。
boradcast join的DAG图
正常情况下的DAG图:
另外,hive on mr中判断小文件的参数hive.mapjoin.smalltable.filesize 貌似在hive on tez中并不生效,如果需要调大小文件的大小建议设置
set hive.auto.convert.join.noconditionaltask = true; set hive.auto.convert.join.noconditionaltask.size =100000000;