数据倾斜
1、快速链接:https://cwiki.apache.org/confluence/display/Hive/LanguageManual+DDL#LanguageManualDDL-SkewedTables
2、示例一:
CREATE TABLE list_bucket_single (key STRING, value STRING)
SKEWED BY (key) ON (1,5,6) [STORED AS DIRECTORIES];
STORED AS DIRECTORIES:是否为这些指定的值创建子目录
3、示例二:
CREATE TABLE list_bucket_multiple (col1 STRING, col2 int, col3 STRING)
SKEWED BY (col1, col2) ON (('s1',1), ('s3',3), ('s13',13), ('s78',78)) [STORED AS DIRECTORIES];
4、如果创建表的时候没有指定,可以使用alter进行修改
1、调整reduce个数
set hive.exec.reducers.max=2000;
set mapred.reduce.tasks= 2000;---增大Reduce个数
2、JOIN过程倾斜
set hive.skewjoin.key=1000000; --这个是join的键对应的记录条数超过这个值则会进行分拆,值根据具体数据量设置
set hive.optimize.skewjoin=true;--如果是join 过程出现倾斜 应该设置为true
3、GROUP过程倾斜
set hive.groupby.mapaggr.checkinterval=1000000 ;--这个是group的键对应的记录条数超过这个值则会进行分拆,值根据具体数据量设置
set hive.groupby.skewindata=true; --如果是group by过程出现倾斜 应该设置为true
函数使用细节
https://www.qubole.com/resources/cheatsheet/hive-function-cheat-sheet/
hive调优
1、参考一:http://blog.csdn.net/an342647823/article/details/25703429
2、参考二:http://blog.sina.com.cn/s/blog_6a7df1f1010197d2.html
3、参考三:http://www.cnblogs.com/xd502djj/p/3799432.html
2、尽量尽早地过滤数据,减少每个阶段的数据量,对于分区表要加分区,同时只选择需要使用到的字段
select... from A
joinB on A.key= B.key
where A.userid>10 and B.userid<10 and A.dt='20120417' and B.dt='20120417';
应该改写为:
select.... from (select .... from A where dt='201200417' and userid>10) a join
(select .... from B where dt='201200417' and userid <10)b on (a.key= b.key);
原因是因为join发生在where之前,对应join是需要过滤的条件应该写在on中
3、临时表
3.1、如果一张表有多个字段,但是JOIN只用到一小部分字段,且这张表要经常用到,将这些字段提取出来生成一个张临时表去JOIN,可以减少大大减少该表扫描时间
3.2、如果不想用上诉一样生成内部表,一个session之后就不需要中间表的时候,可以使用CREATE TEMPORARY TABLE TABLE_NAME_HERE (key string, value string)创建临时表,session结束后自动删除
4、小表放左边,因为每个map操作会把左表数据放入内存,然后将右表数据一条条读取与左表关联,这样可以减少磁盘和内存的使用。
小表的定义:数据条数少,数据占用空间少。
如果一条sql同时要join多张表,那么把数据占用空间少的表放最后JOIN,这样可以避免占用空间大的表在中间落盘过程中占用太大磁盘空间。
5、ORDER by最终所有的数据会汇总到一个Reducer上进行排序,可能使得该Reducer压力非常大,任务长时间无法完成。(默认一般强制带上limit限定数目才能执行,限定数目排序的更快)
如果排序只要求保证Value有序而Key可以无序,例如要统计每个用户每笔的交易额从高到低排列,只需要对每个用户的交易额排序,而用户ID本身不需要排序。这种情况采用分片排序更好,语法类似于:
select user_id, amount from table distribute by user_id sort by user_id, amount
这里用到的不是ORDER by,而是distribute by和sort by,distribute by标识Map输出时分发的Key。
这样最后排序的时候,相同的user_id和amount在同一个Reducer上被排序,不同的user_id可以同时分别在多个Reducer上排序,相比ORDER by只能在一个Reducer上排序,速度有成倍的提升。
RCFILE等文件格式的特性
http://www.tuicool.com/articles/YNfQn2
获取最后一个parition
latest_user_relation_dt=$($HIVE_BIN -S -e "show partitions feature_offline_relation" | awk -F '=' 'END {print $2}' | awk -F '/' '{print $1}')