#Hive常见故障 #大数据 #生产环境真实案例 #Hive #离线数据库 #整理 #经验总结
说明:此篇总结hive常见故障案例处理方案 结合自身经历 总结不易 +关注 +收藏 欢迎留言
Hive实用小文件合并方案 请往下翻 !!!
更多Hive案例汇总方案 (点击跳转) :
执行set命令的时候报cannot modify xxx at runtime.
怎样在Hive提交任务的时候指定队列?
如何在导入表时指定输出的文件压缩格式
desc描述表过长时,无法显示完整
增加分区列后再insert数据显示为NULL
如何设置hive on spark 模式及提交任务到指定队列
hive on spark应用如何设置spark应用的参数?
如何设置map和reduce个数
MapReduce任务内存溢出问题处理
动态分区方式插入数据,创建过多文件/分区
mapjoin相关参数
Tez引擎和MapReduce引擎执行结果不同
.......
问题
表对应小文件过多,在频繁对该表(分区)操作时会对hdfs性能产生较大压力,小文件判断标准:
表(分区)下存在大量M级别以下文件。
表(分区)下文件平均大小小于25M。
原因
每次insert插入数据都至少生成一个文件,例如一次只插入一条数据时也会产生一个文件,所以在入库频次较高时会存在产生大量小文件问题。
业务侧产生大量小文件。
解决方法
业务侧调整入库频次等
使用hive进行合并操作
合并参数如下:
set hive.merge.mapfiles=true;
set hive.merge.mapredfiles=true;
set hive.merge.size.per.task=256000000;
set mapreduce.input.fileinputformat.split.maxsize=256000000;
set hive.input.format=org.apache.hadoop.hive.ql.io.CombineHiveInputFormat;
set mapreduce.input.fileinputformat.split.minsize=1;
set hive.merge.smallfiles.avgsize=128000000;
set mapreduce.input.fileinputformat.split.minsize.per.node=128000000;
set mapreduce.input.fileinputformat.split.minsize.per.rack=128000000;
set hive.execution.engine=mr;
如使用动态分区进行小文件合并,还需加如下参数:
set hive.exec.dynamic.partition=true;
set hive.exec.dynamic.partition.mode=nonstrict;
set hive.exec.max.dynamic.partitions.pernode=10000;
set hive.exec.max.dynamic.partitions=100000;
set hive.exec.max.created.files=150000;
在beeline客户端设置上述参数后,使用如下两种数据重导方式之一进行小文件合并,数据重导两种方式:
直接操作原表
insert overwrite table tb_name [partition(p=xx)] select * from tb_name [where p=xx];
合并到新表,再做切换
create table tb_name_merge like tb_name;
insert into tb_name [partition(p=xx)] select * from tb_name [where p=xx];
说明
同一次合并文件数不建议超过50W,否则会增加hdfs压力,且会导致Hiveserver fullgc。
合并是启动mr作业进行合并的,会占用yarn资源,可通过一个map 4G,一个map处理256M文件进行资源预估。
合并分区时,不能对正在合并的分区进行读写。
存在参数mapreduce.input.fileinputformat.split.minsize.per.node,mapreduce.input.fileinputformat.split.minsize.per.rack不支持客户端直接修改,需添加hive参数白名单。
Hive任务运行过程中失败,重试成功
执行select语句报错
drop partition操作有大量分区时操作失败
localtask启动失败
切域后Hive二次开发样例代码报错
输入文件数超出设置限制导致任务执行失败
任务执行中报栈内存溢出导致执行任务失败
对同一张表或分区并发写数据导致任务失败
Hive任务失败,报没有HDFS目录的权限
Metastore连接数过高导致hive任务执行慢或任务失败
bonecp参数含义解析
连接Metastore超时,导致任务失败
数据查询异常,部分字段为Null
return code 1:unable to close file
Tez和MapReduce引擎下,Hive进行join的结果不一致
Hive表里有数据count无结果
hive-sql报values太长
执行hive-sql插入数据重复
tez引擎写入的数据,切换mr引擎后查询不出来
join中非常规join on写法导致任务运行慢
视图中多表union all,视图外指定分区查询慢
over(partition by orde by)使用同一字段,MapReduce任务运行慢
join on条件中使用or
SQL扫描分区过多,元数据SQL拼接过长报错
join表重复数据多,任务运行慢
SQL过于复杂,嵌套过多,导致HiveSQL编译时间过长
join on中加判断,导致MapReduce任务运行慢
join on中带不等于条件,导查询的数据都为Null
特殊写法导致大数据量只有一个reduce
cascade级联修改表字段
alter table drop partition删除大量分区慢、报错
大分区表查询不带分区,查询慢
两表关联,关联字段类型不一致
left join右表分区条件写在where后,查询慢
SparkSQL嵌套过多,大量case when
SparkSQL没有group by的情况下使用having
设置自定义参数出现递归调用
视图存在全表扫或者大量分区查询
大量使用with as并在SQL中多处调用
insert into table values形式插入大量数据
多表关联过滤条件中按in的子查询进行过滤
string类型字段过滤不加引号
使用order by null
使用浮点数进行运算
并发插入同表或同分区
最后
谢谢大家 @500佰