1.数据存储的格式:
两大类:列式存储、行式存储
四小种:行式存储:TEXTFILE、SEQUENCEFILE
列式存储:ORC、PARQUENT
注意:一般原始数据都是以textfile这种形式存储的
经过分析之后通过insert overwrite select 将我们分析出来的结果插入到另一张临时表里面就可以使用parquet或者orc这些列式存储格式
存储与压缩相结合:存储格式和压缩方式没有关系
实际工作当中,一般存储格式与压缩方式都会一起使用
log_orc 2.8M 因为orc格式的数据默认带来一种压缩方式 zlib
注意:就算orc存储格式不带任何存储方式,也可以将数据变小 取决于我们列式存储的优势
log_orc 使用zlib压缩2.8M
不压缩 7.7M
使用snappy压缩3.8M
实际工作当中一般分析之后存储数据的一些临时表都会使用orc的存储格式,使用snappy的压缩方式
2.hive的调优
1.fetch的抓取 能不走mr就不走mr
hive.fetch.task.conversion 这个配置项有几个取值 none minimal,more
如果设置成none,所有的都要走mr (包括 select * 也要走)
默认值是more
将设置hive.fetch.task.conversion设置为more之后,
hive (default)> set hive.fetch.task.conversion=more;
下面这些命令就是不会执行mapreduce程序
hive (default)> select * from score;
hive (default)> select s_score from score;
hive (default)> select s_score from score limit 3;
2.本地模式 可以解决我们有大量的小文件,处理分配资源过多的情况
开启本地模式的自动选择
//设置local mr的最大输入数据量,当输入数据量小于这个值时采用local mr的方式,默认为134217728,即128M
set hive.exec.mode.local.auto=true; //开启本地mr
//设置local mr的最大输入文件个数,当输入文件个数小于这个值时采用local mr的方式,默认为4
set hive.exec.mode.local.auto.input.files.max=10;
3.表join
早期的hive版本
小表join大表 会将小表的数据一次性进入到内存当中去,与右边大表进行匹配
现在的版本已经不存在这一条优化了,hive会有一个优化器,经过自动选择,可以自动的找出哪个表是小表,将小表的数据一次性放到内存
select count(distinct s_id) from score;
select count(1) from (
select count(s_id) from score group by s_id
) temp;
先在map端对数据进行一次聚合,然后发送到reduce数据会变少,然后再count的时候就会比较快
select count(s_id) from score group by s_id; 在map端进行聚合,效率更高
如果大表join大表的时候,尽量减少输入的数据量
所有的调优,就一条原则&#