在线支持
在线支持
微信支持
微信支持
TORC Compact 常见故障诊断
2022-12-12 20:24:01
62次阅读
0个评论

ORC Transaction Compact原理以及如何使用:https://community.transwarp.cn/thread?topicId=271


TORC Compact 常见故障诊断

正常情况下,系统里orc transaction表大部分都会存在一个base目录,如果发现orc transaction表里有很多delta目录(>10)却没有自动compact,则说明该系统已经发生问题了,此时可以按照一下步骤来进行初步诊断:

1. 首先在inceptor里用select语句检查该表能否被正常的select,如果select出错,则问题定位为orc表本身的问题。如果能select出来则说明compact系统出现问题

2. compact系统出现问题时,首先查看compact所在服务的进程的jstack,检查里面是否有以下3种thread:

a) Initiator thread: 负责检查每个orc transaction表是否符合compact条件

b) Worker thread: 负责向yarn提交mapreduce任务对表进行compact

c) Cleaner thread: 负责清除冗余的版本,例如上面的例子中生成base_0246405后delta_0246404_0246404与delta_0246405_0246405就可以被删除掉了

如果没有initiator thread,系统不能对表进行自动的compact,但通过alter table还能手动触发compact,如果没有worker thread,系统将无法进行compact,这两种情况都会导致orc transaction表的相关信息在metastore里面积压,大幅影响系统性能甚至会导致系统挂掉。cleaner thread相对比较不重要,但是没有cleaner,hdfs上就会有太多冗余版本,故我们应该保证metastore进程中这三种thread都是处于正常状态,如果发现metastore中少了某个thread,应该重启metastore。

metastore的jstack为例,这些thread在jstack的表现如下:

image.png

3. 如果compact所在进程中这三种thread都处于正常状态,对于基于mapreduce的compact,还要检查yarn上compact任务是否正常,之前碰到的情况是yarn分配给inceptor的资源太多,导致compact任务一直无法完成,碰到这种情况需要调整yarn的资源分配来确保有足够的资源进行compact。

4. 对于带分区(partition)的ORC事务表,可以使用以下命令手动出发compaction:

单值分区(singl-key partition)

alter table single_key_partition_table partition col compact 'major'; //对partition spec col 进行compact;

alter table single_key_partition_table partition(col='value') compact 'major'; //对partition spec col=value 进行compact;

多值分区表(multi-key partition)

alter table multi_key_partition_table partition(col1='value1', col2='value2') compact 'major';

alter table multi_key_partition_table partition col compact 'major'; //对partition spec col 进行compact;

单值范围分区(single-key and range partition )

alter table range_partition_table partition part_key compact 'major'; -- 其中的单引号' ' 是需要的。

5. 手动合并失败,查看metastore中的日志报错如下:

image.png

因为表已经进入了黑名单,进入黑名单的表是不能合并的。

进入黑名单是因为之前自动合并失败很多次,需要手动从黑名单中释放

alter table table_name_xxxxxx enable compact; -- 'table_name_xxxxxx'替换为表名

为了保证上述语句运行成功,防止delta数量过多的极端情况下合并失败,需要适当调整参数来设置一次性合并的delta版本数量上限:

SET hive.compactor.max.num.delta=50; -- 默认值为500


Compaction Blacklist机制

如果一个表或者分区在多次尝试compact并且失败,compaction 服务会认为后续再对这个表或分区compact同样会失败。为了避免浪费资源,comapction服务会将这个表或分区加入compaction blacklist。

目前失败次数由参数orc.compact.blacklist.threshold控制,默认值是3。

表或分区一旦加入黑名单,无论自动或手动触发compaction,都不会执行compact操作。

目前还没有从compaction blacklist中自动移除的机制。


查看黑名单

可以在beeline通过以下命令查看:

show compact blacklist


从黑名单中移除

如果将某个表或分区从compaction blacklist中移除,可以通过:

beeline,从blacklist中移除某个表或分区,执行

alter table table_name enable compact; // 表

alter table table_name partition (pt='xxx') enable compact; // 单值分区

alter table table_name partition range_name enable compact; // 范围分区

也可以在mysql中,直接删除COMPACTION_BLACKLIST中记录


手动加入黑名单

可以手动将某个表或分区加入黑名单,不让其做compaction。

alter table table_name disable compact; // 表

alter table table_name partition (pt='xxx') disable compact; // 单值分区

alter table table_name partition range_name disable compact; // 范围分区

收藏 0 0

登录 后评论。没有帐号? 注册 一个。

admin

官方人员
  • 0 回答
  • 0 粉丝
  • 0 关注