SMB Join Sort Merge Bucket Join
测试大表直接 JOINinsert overwrite table jointable select b.id, b.t, b.uid, b.keyword, b.url_rank, b.click_num, b.click_url from bigtable a join bigtable 2 b on a .id = b .id
测试结果
Time taken: 72.289 seconds
create table bigtable_buck1( id bigint, t bigint, uid string, keyword string, url_rank int, click_num int, click_url string) clustered by(id) sorted by(id) into 6 buckets row format delimited fields terminated by t'; load data local inpath '/opt/module/data/bigtable' into table bigtable_buck1;创建分桶表 2 分桶数和第一张表的分桶数为倍数关系
create table bigtable_buck2( id bigint, t bigint, uid string, keyword string, url_rank int, click_num int, click_url string) clustered by(id) sorted by(id) into 6 buckets row format delimited fields terminated by ' t'; load data local inpath '/opt/module/data/bigtable' into table bigtable_buck2;设置参数
#强制在Map端做bucket join,强制hive的reducer数目为分桶数 set hive.optimize.bucketmapjoin = true; #强制在Map端做Sorted bucket Join set hive.optimize.bucketmapjoin.sortedmerge = true; set hive.input.format=org.apache.hadoop.hive.ql.io.BucketizedHiveInputFormat;
测试结果
Time taken: 34.685 seconds
insert overwrite table jointable select b.id, b.t, b.uid, b.keyword, b.url_rank, b.click_num, b.click_url from b igtable_buck1 s join bigtable_buck2 b on b.id = s.id;数据倾斜 单表数据倾斜优化 使用参数
当任务中存在GroupBy操作同时聚合函数为 count或sum,可以设置参数来处理数据倾斜
#是否在 Map 端执行聚合 set hive.map.aggr = true;
#在 Map 端进行聚合操作的条目数目 set hive.groupby.mapaggr.checkinterval = 100000;
#有数据倾斜的时候进行负载均衡 set hive.groupby.skewindata = true;
会生成两个MR Job,作用等同于通过随机数打散(distributer by rand((x))
多个Key同时导致数据倾斜,增加Reduce个数 Join数据倾斜优化 使用参数#join的键对应的记录条数超过这个值则会进行分拆,值根据具体数据量设置 set hive.skewjoin.key = 100000;
#如果是join过程出现倾斜应该设置为true set hive.optimize.skewjoin = false;
如果开启了,在Join过程中Hive会将计数超过阈值hive.skewjoin.key(默认100000)的倾斜key对应的行临时写进文件中,然后再启动另一个job做map join生成结果。通过hive.skewjoin.mapjoin.map.tasks参数还可以控制第二个job的mapper数量,默认10000。
set hive.skewjoin.mapjoin.map.tasks=10000;
该参数优化原理等同于将热点key单独拎出来计算,再与其它计算结果合并。
总结:
1、单表:加大reduce并发;set hive.groupby.skewindata = true ; distributer by rand((x)
2、多表:set hive.optimize.skewjoin = true; 热点key可以过滤便先过滤掉(如null); 热点key on rand(x)(如null);热点key单独拎出来计算(如 非null值倾斜)
如果是大小表join倾斜,用map join
根据computeSliteSize(Math.max(minSize,Math.min(maxSize,blocksize)))公式,
调整maxSize = 64MB,即可将分片大小调整为64MB;或者调整minSize = 512MB,即可将分片大小调整为512MB
(1)每个Reduce处理的数据量默认是256MB
set hive.exec.reducers.bytes.per.reducer=256000000
(2)每个任务最大的reduce数,默认为1009
set hive.exec.reducers.max=1009
(3)计算reducer数的公式
N=min(参数2,总输入数据量/参数1)(参数2 指的是上面的1009,参数1值得是256M)
解析器(SQL Parser)
将SQL字符串转换成抽象语法树AST,这一步一般都用第三方工具库完成,比如antlr;对AST进行语法分析,比如表是否存在、字段是否存在、SQL语义是否有误。
编译器(Physical Plan)
将AST编译生成逻辑执行计划。
优化器(Query Optimizer)
对逻辑执行计划进行优化。
执行器(Execution)
把逻辑执行计划转换成可以运行的物理计划。对于Hive来说,就是MR/Spark。



