Hive实用小文件合并方案

 #Hive常见故障 #大数据 #生产环境真实案例 #Hive #离线数据库 #整理 #经验总结

说明:此篇总结hive常见故障案例处理方案 结合自身经历 总结不易 +关注 +收藏 欢迎留言

Hive实用小文件合并方案 请往下翻 !!!

更多Hive案例汇总方案 (点击跳转)

Hive常见故障多案例维护宝典 --项目总结(宝典一)

Hive常见故障多案例维护宝典 --项目总结(宝典二)

目录内容如下:

架构概述
【1】参数及配置类常见故障
  • 执行set命令的时候报cannot modify xxx at runtime.

  • 怎样在Hive提交任务的时候指定队列?

  • 如何在导入表时指定输出的文件压缩格式

  • desc描述表过长时,无法显示完整

  • 增加分区列后再insert数据显示为NULL

  • 如何设置hive on spark 模式及提交任务到指定队列

  • hive on spark应用如何设置spark应用的参数?

  • 如何设置map和reduce个数

  • MapReduce任务内存溢出问题处理

  • 动态分区方式插入数据,创建过多文件/分区

  • mapjoin相关参数

  • Tez引擎和MapReduce引擎执行结果不同

     .......

Hive实用小文件合并方案

问题

表对应小文件过多,在频繁对该表(分区)操作时会对hdfs性能产生较大压力,小文件判断标准:

  • 表(分区)下存在大量M级别以下文件。

  • 表(分区)下文件平均大小小于25M。

原因

  1. 每次insert插入数据都至少生成一个文件,例如一次只插入一条数据时也会产生一个文件,所以在入库频次较高时会存在产生大量小文件问题。

  2. 业务侧产生大量小文件。

解决方法

业务侧调整入库频次等
使用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];

说明

  1. 同一次合并文件数不建议超过50W,否则会增加hdfs压力,且会导致Hiveserver fullgc。

  2. 合并是启动mr作业进行合并的,会占用yarn资源,可通过一个map 4G,一个map处理256M文件进行资源预估。

  3. 合并分区时,不能对正在合并的分区进行读写。

  4. 存在参数mapreduce.input.fileinputformat.split.minsize.per.node,mapreduce.input.fileinputformat.split.minsize.per.rack不支持客户端直接修改,需添加hive参数白名单。


【2】任务运行类常见故障
  • 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引擎后查询不出来


【3】SQL使用类常见故障
  • 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佰

你可能感兴趣的:(Hive线上问题处理方案,hive,hadoop,数据仓库,大数据)