首先要说明的是本篇所解决的问题
1、hive分区没创建成功。
2、分区下面小文件过多。
3、合并小文件后新生成的文件没有按指定格式压缩。
数据流场景如下图:
Hive分区按每小时4个每15分钟生成一个的策略,也就是说每小时会有mm=00、mm=15、mm=30、mm=45 四个分区。
问题背景:
当时在通过Cloudera Manager做HDFS的HA操作,因此要停止Hive服务执行更新Hive MetaStore NameNode操作,导致执行2个小时的过程中没有生成hive表的相对分区。
问题1解决方法:
1、先使用命令行到hive对应的hdfs的路径下查看是否有通过flume传过来的.log数据文件,发现有。
2、执行alter table prd_ods_xxx add partition (pt ='20200704',hh='14',mm='00')。
问题2解决方法:
1、执行insert overwrite table prd_ods_xxx partition(pt ='20200704',hh='14',mm='00')
select messege from prd_ods_xxx where pt ='20200704' and hh='14' and mm='00';
正常情况下执行以上步骤就会将数据添加到指定分区。可能在执行过程中会出现get: Cannot obtain block length for LocatedBlock{BP-873722476-10.100.11.1-1560838431306:blk_1078888545_5148026... ...等信息,原因是由于文件异常关闭。
解决办法:到hdfs指定分区找到异常文件执行命令:
hdfs fsck /user/hive/warehouse/xxxxxx/pt=20200704/hh=14/mm=45/2020070414.1593845100264.log
block文件处于打开状态
执行: hdfs debug recoverLease -path /user/hive/warehouse/xxxx/pt=20200704/hh=14/mm=45/2020070414.1593845100264.log
问题3解决方法:
设置以下配置:
set hive.exec.compress.output=
true
;
set mapred.output.compression.codec=org.apache.hadoop.io.compress.GzipCodec;