一 .hive的压缩方案介绍
在hive中一般推荐使用压缩方式:
1.1 ) SNAPPY 速度最快(最常用的压缩方式)
hadoop 本身不支持. 最新版本支持了.
1.2 ) LZO 压缩文件大小中等,压缩解压速度最慢
1.3 ) GZIP 速度中等, 文件最小
其中snappy压缩方式在整个占比比较高,压缩的最快,更高的速度.
一般用的比较多.
1) 查看是否支持压缩:hadoop checknative:
2) 查看默认压缩方案:io.compression.codecs
org.apache.hadoop.io.compress.DefaultCodec #默认值表示不压缩
org.apache.hadoop.io.compress.SnappyCodec #设置SNAPPY压缩方案
org.apache.hadoop.io.compress.GzipCodec #设置GZIP压缩方案
com.hadoop.compression.lzo.LzopCodec #设置LZO压缩方案
3)设置map端压缩方案
mapreduce.map.output.compress 是否开启map端压缩
默认为 false 开启true
mapreduce.map.output.compress.codec
默认: org.apache.hadoop.io.compress.DefaultCodec
可选值:
org.apache.hadoop.io.compress.SnappyCodec
org.apache.hadoop.io.compress.GzipCodec
com.hadoop.compression.lzo.LzopCodec
4)设置reduce端压缩方案
mapreduce.output.fileoutputformat.compress
是否开启reduce端压缩 默认为 false
如果开启设置为true
mapreduce.output.fileoutputformat.compress.codec
默认: org.apache.hadoop.io.compress.DefaultCodec
可选值:
org.apache.hadoop.io.compress.SnappyCodec
org.apache.hadoop.io.compress.GzipCodec
com.hadoop.compression.lzo.LzopCodec
5)设置压缩类型
mapreduce.output.fileoutputformat.compress.type
设置压缩类型 默认 RECORD(行压缩)
可选值:
NONE 不采用任何格式
BLOCK 块压缩 (推荐使用)
3) 具体在hive设置reduce端压缩方案:
set hive.exec.compress.intermediate=true;
是否开启hive中间结果压缩操作 默认为false
set mapreduce.map.output.compress=true;
是否开始map端的压缩操作 默认为false
set mapreduce.map.output.compress.codec=
org.apache.hadoop.io.compress.SnappyCodec;
设置map端压缩方案
4) 具体在hive设置reduce端压缩方案:
set hive.exec.compress.output=true;
是否开启hive最终结果压缩方案 默认为false
set mapreduce.output.fileoutputformat.compress=true;
是否开启MR的之中压缩方式 默认为false
set mapreduce.output.fileoutputformat.compress.codec =
org.apache.hadoop.io.compress.SnappyCodec;
设置reduce端压缩方案
set mapreduce.output.fileoutputformat.compress.type=BLOCK;
设置压缩的格式为块压缩 默认为RECORD
二 . hive的数据存储格式优化(创建SNAPPY的ORC压缩方案)
在hive中主要支持有四种存储格式:
5.1) textFile 行式存储方案
5.2) sequenceFile 行式存储方案
5.3) ORC 列式存储方案(一个片段256M行水平拆开增加索引,内部列存储,然后里面还有索引) 内部有压缩方案可以设置
5.4) parquet 列式存储方案
在hive中, 一般构建表, 都是ORC类型
设置SNAPPY的ORC压缩方案
create table log_orc_snappy(
track_time string,
url string,
session_id string,
referer string,
ip string,
end_user_id string,
city_id string
)
partitioned by (分区子段 ....)
ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t'
#设置orc 存储 压缩方案 设置 SNAPPY
STORED AS orc tblproperties ("orc.compress"="SNAPPY");
三 . 其他设置优化
1) hive 的fetch本地抓取策略
set hive.fetch.task.conversion :
可选值:
none :
所有的查询都会执行MR
minimal :
可以保证在执行全表查询,
根据字段查询以及limit可以不走MR的(老版本默认值: 0.x版本)
more :
可以保证在执行全表查询,
根据字段查询,简单过滤操作,以及limit可以不走MR的(1.x后默认值)
不走MR就本地抓取HDFS的数据了.
2) hive的本地运行
set hive.exec.mode.local.auto=true; 是否开启本地MR 默认值为 false
set hive.exec.mode.local.auto.inputbytes.max=51234560;
设置多大的数据量走集群MR 默认值 128M
set hive.exec.mode.local.auto.input.files.max=10;
设置文件数量的限制 默认值4
什么情况下会执行本地MR呢?
默认当查询数据量小于等于128M 并且读取的文件数量小于
4的时候, 才会执行本地MR ,
否则只要有一个条件不满足, 就会执行集群MR的操作
3) hive的join优化
一般 用 小表在前 join 大表在后:
set hive.auto.convert.join = true;
是否开启自动检测mapJoin
set hive.mapjoin.smalltable.filesize= 25000000;
大小表阈值 默认大于 25M左右
4) hive的sql优化(避免数据倾斜)
一. 列裁剪
hive.optimize.cp=true; 默认值就是true
二. 分区裁剪
hive.optimize.pruner=true; 默认就是true
三. group,by产生数据倾斜问题的
解决办法:
1) 采用 combiner的操作: 让每个map都进行局部聚合操作(要写java代码)
开启MR的conbiner操作:
set hive.map.aggr = true;
set hive.groupby.mapaggr.checkinterval = 100000;
2) 开启两个MR来分别处理
负载均衡的措施 (大combiner的操作)
set hive.groupby.skewindata = true;
四. count(distinct ):聚合去重操作
1)解决方法把distinct内部分组去重
原: select count(distinct ip) from 表 ; --- 引发上面描述的问题
后: select count(ip) from (select ip from 表 group by ip) tmp ;
五.一个分区表导入另外个分区表的操作
1) insert into table 分区表2 partition(month) select * from 分区表1
注意: 必须分区字段放在整个表最后.
注意: 开启动态分区支持.
注意: 关闭严格语法模式.
2) 设置hive语法模式为 非严格模式:
set hive.exec.dynamic.partition.mode=nonstrict; 默认值为 strict
--------------------------------------------------------------------
1) 开启动态分区的支持:
set hive.exec.dynamic.partition=true; 默认为true
3) 设置所有执行MR的节点, 最大可以创建多少个分区:
set hive.exec.max.dynamic.partitions=1000; 默认 1000个
3) 设置每个MR的节点. 最大可以创建多少个分区
set hive.exec.max.dynamic.partitions.pernode=100; 默认为100个
4) 整个mr任务中, 最大一次性可以操作多少个HDFS的文件:
set hive.exec.max.created.files=100000; 默认为 10w
-------------------------------------------------------------------
六 数据倾斜
1) map数量的调整:调小
set mapred.max.split.size=112345600;
set mapred.min.split.size.per.node=112345600;
set mapred.min.split.size.per.rack=112345600;
set hive.input.format=org.apache.hadoop.hive.ql.io.CombineHiveInputFormat;
以上四个参数配置, 描述 在map读取之前, 进行文件合并操作
#将文件合并,大于128按照分割合并
增加: 切割文件即可
2) reduce数量调整:
hive默认会自动调整reduce的数量:
默认-1动态化自动决定.
公式是:N=min(参数2,总输入数据量/参数1)
参数2: 为 hive.exec.reducers.max设置的值
默认每个任务最大的reduce数量为 999
参数1: hive.exec.reducers.bytes.per.reducer
默认处理数量为 1GB
set hive.exec.reducers.bytes.per.reducer=524288000;
调整每个reduce能够处理数据量
#当调小后, reduce数量增加 , 调大后, reduce数量就会减少
set mapred.reduce.tasks=15; 强制调整reduce的数量
七 并行执行
set hive.exec.parallel=true;
--打开任务并行执行
set hive.exec.parallel.thread.number=16;
--同一个sql允许最大并行度,默认为8。
举个例子:
select * from A
union all #把两条语句执行结果汇总到一起上下汇总.
select * from B;
八 严格模式
1) 对分区表进行查询的时候 不携带分区字段
2) 使用order by 没有使用 limit
3) SQL中出现笛卡尔积的现象
前提: 数据量足够大
set hive.mapred.mode = strict; --开启严格模式
set hive.mapred.mode = nostrict; --开启非严格模式
九 MR - JVM jvm重用
2.0无需设置了
十 推测执行
卡主了在启动一个MR,一致不断启动MR
不建议设置
set mapred.map.tasks.speculative.execution=true
set mapred.reduce.tasks.speculative.execution=true
set hive.mapred.reduce.tasks.speculative.execution=true;
网友评论