1.小表放入内存,在map端join,并不是所有聚合操作都在reducer端操作,慎重使用mapjoin,一般行数小于2000行,大小小于1M
2.hive.groupby.skewindata变量从上面groupby语句可以看出,这个变量是用于控制负载均衡的。当数据出现倾斜时,如果该变量设置为true,那么Hive会自动进行负载均衡。当该变量设为
true时候,不可以使用distinct关键字对多列联合去重
3.合并小文件
hive.merge.mapfiles = true是否和并 Map 输出文件,默认为 True
hive.merge.mapredfiles = false是否合并 Reduce 输出文件,默认为 False
hive.merge.size.per.task = 256*1000*1000合并文件的大小。
4.Order by 实现全局排序,一个reduce实现,效率低
Sort by 实现部分有序,单个reduce输出的结果是有序的,效率高,通常和DISTRIBUTE BY关键字一起使用(DISTRIBUTE BY关键字 可以指定map 到 reduce端的分发key)
CLUSTER BY col1 等价于DISTRIBUTE BY col1 SORT BY col1.
distinct把所有数据发送到一个reducer上,数据倾斜严重。特别是count(distinct field1)使用group by代替,设置多个reducer
5.SQL并行执行优化:
set hive.exec.parallel=true;--任务并行执行
set hive.exec.parallel.thread.number=16;--并行执行的线程数量
set hive.groupby.skewindata=true;--防止数据倾斜
set mapred.reduce.tasks=60;--设置任务执行的reduce数量
set hive.auto.convert.join=false;--是否自动将common join转换为map join
set hive.ignore.mapjoin.hint=false;--打印mapjoin
set hive.exec.compress.intermediate=true; --中间结果压缩
set hive.execution.engine=tez;--更改hive底层执行的计算框架
set hive.exec.reducers.max=200;--任务最大的reduce数量(默认999)
set hive.map.aggr = true;--map端做聚合(默认true)
-----map数量控制---------------------
set mapred.max.split.size=100000000;--超过100m不足128M切分
set mapred.min.split.size.per.node=100000000;--超过100m,切分
set mapred.min.split.size.per.rack=100000000;--超过100m,切分
set hive.input.format=org.apache.hadoop.hive.ql.io.CombineHiveInputFormat;
-----reduce数量控制-----------------
set hive.exec.reducers.bytes.per.reducer=500000000;--每个reduce任务执行的数据量,默认1G。
6.只有一个reduce的场景:
a、没有group by 的汇总
b、order by
c、笛卡尔积
7.写SQL要先了解数据本身的特点,如果有join ,group操作的话,要注意是否会有数据倾斜,如果出现数据倾斜,应当做如下处理:
set hive.exec.reducers.max=200;
set mapred.reduce.tasks= 200;---增大Reduce个数
set hive.groupby.mapaggr.checkinterval=100000 ;--这个是group的键对应的记录条数超过这个值则会进行分拆,值根据具体数据量设置
set hive.groupby.skewindata=true; --如果是group by过程出现倾斜 应该设置为true
set hive.skewjoin.key=100000; --这个是join的键对应的记录条数超过这个值则会进行分拆,值根据具体数据量设置
set hive.optimize.skewjoin=true;--如果是join 过程出现倾斜 应该设置为true
7.文件压缩,看HQL是IO密集型的任务还是CPU密集型的任务,通常更高的压缩比带来更多的解压缩CPU消耗,但能够减小MR传输的数据量降低磁盘空间和IO操作。
相反,压缩比低,解压缩快MR执行跟快。
8.SQL执行顺序:
(8)SELECT (9)DISTINCT (11)<Top Num> <select list>
(1)FROM [left_table]
(3)<join_type> JOIN <right_table>
(2)ON <join_condition>
(4)WHERE <where_condition>
(5)GROUP BY <group_by_list>
(6)WITH <CUBE | RollUP>
(7)HAVING <having_condition>
(10)ORDER BY <order_by_list>
一些linux命令:
1.linux查看大小
du -sh *
2.查看hdfs存储在本地文件的路径
hdfs-site.xml中
<property>
<name>dfs.datanode.data.dir</name>
<value>/hadoop/hdfs/data</value>
</property>
3.若删除了hive的库,如warehouse,例如使用的用户是hdfs,则在下面中可以找到
hadoop fs -ls /user/hdfs/.Trash,找到后通过hadoop fs -mv 命令移动到原来的位置
4.lsof -i:port
5.修改hive列名:alter table table_name change column filed1 field2 field1_type
alter table mid change column val value string;
6.hive增加分区
load data local inpath '/home/hdfs/spdb/datas/SAS_ATPT/dt=20160101/000000_0' overwrite into table SAS_ATPT partition(dt='20160101')