自定义函数
- hive内置函数不满足业务能够应用java写自定义函数导入hive
UDF函数:大部分都是,
- 一进一出
UDAF
多进一出
- 如:聚合函数
UDTF
一进多出
- 如:explode
hive调优
压缩
- 压缩计划罕用的gzip,bzip2,lzo,snappy,思考的不仅是压缩后体积,而应该再联合解压和压缩的速度
设置不同阶段的输入
- 输出map,
- map输入到reduce时,
- reduce输入时能够压缩
配置压缩参数能够到mapred-site.xml,core-site.xml中
- io.compression.codecs
- mapreduce.map.output.compress
- mapreduce.output
存储格局
- textFile行,sequenceFile行,orc列,parquet列是
罕用textFile,orc
- 只有textFile反对load加载
行式存储,列式存储
空间,查问速度
- 行存储在查找时只须要找到其中一个值其余的数据在相邻地位
列存储能够有针对性的查找,而舍弃一些无关数据查找的损耗
- 压缩显著
- 缩小不必要的io开销
- 数据空间小,读盘更快
- 自在的压缩算法,更灵便
其余优化
- fetch本地抓去,能不走mr尽量不走
- 能本地mr尽量本地mr
hive join优化
- 编写sql时:1.x之前小表在join后面。之后都一样
小表和大表join
- hdfs提供distribute block cache分布式块缓存
- 主动开启mapjoin
- 配置大小表阈值
中大型表join大表
- 先过滤(看是否能够转为小表)再join
- bucket join: 分桶的mapjoin计划
大表和大表
- 先过滤再join,缩小map到reduce数据传输量
如果大表中的数据有很多空值,须要解决, 因为空值会导致reduce容易呈现数据歪斜
- 计划一:提前过滤null
- 计划二:随机数替换null
- SMB JOIN :分桶表排序 MAPJOIN计划
sql优化
- 列裁剪
分区裁剪
- 操作分区表,倡议携带上分区字段,从而缩小扫描量,晋升效率,同时如果表能过滤,就先过滤再join
- combiner解决数据歪斜
- 两次mr,将数据不管男女平均分发给两个reduce
- 防止count(distinct) ,对整个表进行聚合操作翻译后只有一个reduce,若此时执行一个distinct(reduce中执行),而去重操作必须在reduce端才能够,数据量大的话,reduce端会接受大量数据,导致执行效率变慢
select count(ip) from (select ip from table group by ip) tmp;执行两个mr前面那个可用于去重,先group by再count尽管会多一个job然而在数据量大的状况下会更优
- 笛卡尔积:hive中多表join不给on(一边关联,一边过滤),不能用where(先笛卡尔再条件过滤)
动静分区
- sql查问原始表中,必须要将分区字段搁置在整个表后果最初面
- 敞开hive严格语法模式
insert into table 分区表2 partition(month) select * from 分区表1;
动静歪斜
如何调整map数量和reduce数量
放大map数:
- map之前合并文件
- 调大文件切片
- 增大map数:
-
- combiner
默认hive会主动调整reduce数量
- hive.exec.reducers.max 默认999
- hive.exec.reducers.bytes.per.reducer 调小reducer增多
- order by只有一个reduce,没有group by的聚合只有一个reduce,笛卡尔积也只有一个(关联的时候用了where)
并行执行
- 执行hive sql时可能会被翻译为多个mr,并且多个mr之间没有任何关联,那么此时能够运行多个mr并行执行晋升效率
- set hive.exec.parallel=true; -- 关上工作并行执行执行
- set hive.exec.parallel.thread.number = 16; -- 最大并行读,默认为8
select * from Aunion allselect * from B;
严格模式(数据量大的状况下): 限度(执行效率差的)sql的申请
- 分区表查问,不携带分区字段
- 应用order by 不必limit
- sql中呈现笛卡尔
内置的jvm重用
- 让mr可重复使用资源容器
揣测执行
- 关掉,否则失败反复申请资源做雷同的工作,依然有大概率失败