成长之路 2018-10-18
1. 查看sql执行计划
explain [extended] sql explain : 只解析sql成计划 explain extended:除咯有计划,还有抽象语义树。
hive (yul)> explain select * from dept; OK STAGE DEPENDENCIES: Stage-0 is a root stage STAGE PLANS: Stage: Stage-0 Fetch Operator limit: -1 Processor Tree: TableScan alias: dept Statistics: Num rows: 1 Data size: 82 Basic stats: COMPLETE Column stats: NONE Select Operator expressions: deptno (type: int), dname (type: string), loc (type: string) outputColumnNames: _col0, _col1, _col2 Statistics: Num rows: 1 Data size: 82 Basic stats: COMPLETE Column stats: NONE ListSink
一个stage相当于一个mapreduce任务(可以是一个子查询、可以是一个抽样、可以是一个合并、可以是一个limit), hive默认每次只执行一个stage,但是没有依赖关系的可以并行执行。 一个hive的hql语句包含一个或者是多个stage,多个之间依赖越复杂,表是任务越复杂,执行效率较低。
2. limit的限制:
hive.limit.optimize.enable=false; //limit的优化 建议设置true hive.limit.row.max.size=100000; //允许扫描的最大行数 hive.limit.optimize.limit.file=10; //允许扫描的最大文件数 hive.limit.optimize.fetch.max=50000;
3. join设置:
永远是小表驱动大表 大表标识(/*+STREAMTABLE(bt)*/) 开启map端的join(默认开启) ..convert.. ..smalltable.filesize join的on只支持等值连接
4. 本地模式
hive查询数据任然还是依靠hadoop,hadoop又有单机、分布式、HA的方式。在单个jvm中运行 hive.exec.mode.local.auto=false; 建议开启 hive.exec.mode.local.auto.inputbytes.max=134217728; //执行sql的所有表的总大小不超过128m hive.exec.mode.local.auto.input.files.max=4; //文件数不操作4个
5. 并行运行
hive没有相互依赖的任务可以并行执行。 hive.exec.parallel=false; //是否开启并行,建议开启 hive.exec.parallel.thread.number=8; //并行数量
6. strict严格模式:
严格模式hive将会阻止5类查询。 1.笛卡儿积查询 2.分区不带过滤字段 3.order by 不带limit 4.string和bigint比较 5.double和bigint比较不允许
7.调整mapper或者reducer的个数:
set mapred.max.split.size=256000000; // 256M set dfs.block.size=; hive.input.format=org.apache.hadoop.hive.ql.io.CombineHiveInputFormat; //小文件多,设置该属性可以合并 直接设置mapper的个数。(mapred-site.xml) 手动设置mapper的个数:???? reduce的个数的设置: 直接手动设置。 set hive.exec.reducers.bytes.per.reducer=256000000; //256M set hive.exec.reducers.max=1009; set mapreduce.job.reduces=-1; set mapred.reduce.tasks=; //设置task的个数 hive.exec.reducers.max=1009; //设置reducer的最大个数
8. JVM的重用:
set mapreduce.job.jvm.numtasks=1; //一个jvm允许有几个task set mapred.job.reuse.jvm.num.tasks=1; //一个jvm允许有多少个task重用
9. 数据倾斜
由于key的分布不均匀造成的数据向一个方向偏的现象。 卡在某个stage一直不运行。 数据倾斜原因: 数据本身倾斜 hql语句: join 容易造成 group by也容易造成 怎么解决倾斜: 找到造成倾斜的原因,找到造成的倾斜的key, 可以单独将这个key提取出来计算,然后再通过union合并进来; 可以将key拼接随机数,然后将其分散到不同的节点执行。 设置属性: hive.map.aggr=true; hive.optimize.skewjoin=false; //是否开启数据倾斜优化,建议开启 hive.groupby.skewindata=false;
10. job数量:
一般是一个查询、子查询、limit、连接等、order by等产生一个job。可以通过语句来控制job select a7.* from u4 a7 where a7.id in( select id from u1 where id > 1 limit 1 ) ; 改为(减少job数量): select a7.* from u4 a7 left join u1 a9 on a7.id = a9.id where a9.id > 1 ;
11. 多个mr中group by放到单个reducer中:
hive.multigroupby.singlereducer=true;
12. 创建分区