hive学习之三:项目中的hive优化实践

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')
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值