在线支持
在线支持
微信支持
微信支持
Compact那些事
2022-12-12 17:23:54
77次阅读
1个评论

1. 背景

1.1 Compact 是什么

用户在频繁的进行小数据量写入操作的时候,会产生大量的小文件(base/delta),并且内容很少(KB级别)。系统在必要的时候会将这些小的StoreFile合并成相对较大的StoreFile,这个过程就称之为Compaction。

小文件过多可能导致IO开销大,影响性能或者内存占用高,namenode崩溃等一系列问题,compact的主要目的是通过将若干小文件合并成一个文件,减少小文件数量从而避免发生上述影响。

注意事项:不同表的delta与base目录产生的机制不同

1.1.1 Holo表

Holo表与TORC表delta跟base文件产生的条件不一样,所有的写操作都会在底层写入一个新的文件,而不是写入已有文件中,insert操作生成base文件, update/delete操作生成delta文件。

Compact类型主要分为三类

Full

full compact将若干base文件合并成一个base文件,并且会一并删除delta文件

Major

major compact将一个base及其delta文件合并,生成一个新的base文件

Minor

minor compact将一个base的delta文件合并,生成一个新的delta文件,并apply到原有的base文件上

执行方式

1. 同步compact(自动)

安装了compactservice,且服务正常的话,compact的任务由compactservice来做,默认是 compact ‘full’,job类型是一个spark任务,在compactservice的sparkUI页面可以看到对应的job

2. 异步compact(手动)

通过手动执行alter实现

alter table  XX compact ‘full’

alter table  XX compact ‘major’

alter table  XX compact ‘minor’

执行方式:

compact任务由argodbcomputing来做,job类型是一个spark任务,在computing页面可以看到对应的job。

1.1.2 Orc transaction表

Orc transaction表是一种inceptor中可以支持CRUD操作的的ORC表,其基本原理是对于每一次CRUD操作(insert,update,delete,merge into),都生成一个对应版本存放改动的数据(delta目录),Inceptor系统中存在compact机制,会定期对每个orc transaction进行合并,将多个版本合并成一个版本(base目录)。

TORC表中的Compact类型主要Major Compact,禁用Minor Compact


执行方式

1. 同步compact(自动compact)

alter table tblName compact 'major' and wait;

beeline执行该命令后,会一直等待,直到compact完成,或者抛出异常.

返回状态:

只有通过该命令成功提交compaction任务,并成功执行compact,该命令才显示执行成功;

否则:

① 如果compaction队列中已经有了该表或者分区(可能是后台服务添加,也可能是其他用户通过命令行添加),则抛出异常

② 如果compact期间失败,则抛出异常

2. 异步compact

通过执行alter实现:

alter table tblName compact 'major';

执行该命名,相当于在后台提交了compact请求,beeline会立刻返回并显示执行成功。至于compact是否真正成功执行,需要查看log

2. 操作实践

社区版核心组件为Inceptor,因此下面将以具体例子来演示TORC表中Compact的过程

创建一张orc transaction表

create table orc_transaction_table(id int, value1 int, value2 int, value3 int) clustered by (id) into 2 buckets stored as orc tblproperties('transactional'='true');

建好表之后用desc formatted orc_transaction_table来获取该表在hdfs上的位置

[localhost:10000] transwarp> desc formatted orc_transaction_table;

# col_name data_type comment notNull_constraint unique_constraint

id int

value1 int

value2 int

value3 int

# Detailed Table Information

Database: crud001

Owner: yarn

CreateTime: Wed Mar 02 23:45:59 CST 2016

LastAccessTime: UNKNOWN

Protect Mode: None

Retention: 0

Location: hdfs://service/inceptor1/user/hive/warehouse/crud001.db/yarn/orc_transaction_table

Table Type: MANAGED_TABLE

Table Parameters:

transactional true

transient_lastDdlTime 1456933559

# Storage Information

SerDe Library: org.apache.hadoop.hive.ql.io.orc.OrcSerde

InputFormat: org.apache.hadoop.hive.ql.io.orc.OrcInputFormat

OutputFormat: org.apache.hadoop.hive.ql.io.orc.OrcOutputFormat

Compressed: No

Num Buckets: 2

Bucket Columns: [id]

Sort Columns: []

Storage Desc Params:

serialization.format 1

通过hdfs命令来看当前表所在目录下的内容

[localhost:10000] transwarp> dfs -ls hdfs://service/inceptor1/user/hive/warehouse/crud001.db/yarn/orc_transaction_table;

Time taken: 0.059 seconds

可以看到表创建好时,目录是空的。

insert语句向该表插入一条数据:

[localhost:10000] transwarp> insert into orc_transaction_table values(1,2,3,4);

1 rows affected.

Time taken: 1.747 seconds

这时候再看表目录:

[localhost:10000] transwarp> dfs -ls hdfs://service/inceptor1/user/hive/warehouse/crud001.db/yarn/orc_transaction_table;

Found 1 items

drwxr-xr-x - yarn hadoop 0 2016-03-02 23:49 hdfs://service/inceptor1/user/hive/warehouse/crud001.db/yarn/orc_transaction_table/delta_0246404_0246404

可以看到下面多了一个delta开始的目录,这种delta目录就对应了表的一个版本,delta中的数字代表该crud操作的transaction号。

update命令更新该表并观察hdfs上的内容:

[localhost:10000] transwarp> update orc_transaction_table set value3 = 10 where id = 1;

1 rows updated.

Time taken: 2.534 seconds

[localhost:10000] transwarp> dfs -ls hdfs://service/inceptor1/user/hive/warehouse/crud001.db/yarn/orc_transaction_table;

Found 2 items

drwxr-xr-x - yarn hadoop 0 2016-03-02 23:49 hdfs://service/inceptor1/user/hive/warehouse/crud001.db/yarn/orc_transaction_table/delta_0246404_0246404

drwxr-xr-x - yarn hadoop 0 2016-03-02 23:51 hdfs://service/inceptor1/user/hive/warehouse/crud001.db/yarn/orc_transaction_table/delta_0246405_0246405

可见update操作为表添加了一个新的版本。

对于orc表的多个版本,inceptor系统中专门有compact机制来负责在合适的时候对多版本进行合并。目前compact由metastore的compact thread在后台自动检测并合并。同时也可以通过命令alter table tablename compact compactType来手动触发compact,例如:

[localhost:10000] transwarp> alter table orc_transaction_table compact 'major';

Time taken: 0.146 seconds

注意:alter table compact命令是异步的,该命令本身只是发出一个compact请求,其本身并不做compact操作,所以很快会结束。

目前,compact任务根据配置可以是一个mapreduce任务,也可以是spark任务。

l 当orc.compact.service.provider=metastore 时,compact threads内嵌在metastore中,compact任务是一个mapreduce任务。 我们可以在yarn的8088页面上看到(compact任务的名称类似与test-02-23-compactor-crud001.orc_transaction_table);

正常启动服务要等2min左右,compact服务才可以真正起来

l 当orc.compact.service.provider=server时,compact threads内嵌在server中,compact任务是一个spark任务,我们可以在spark的4040页面上看到(compact任务的sql类似于compact xxx ‘major’);

服务启动后需要等10min左右,compact服务才可以真正起来

只要启动了compact service 不管配不配置provider 都是compact service 优先级最高,所以如果想配置metastore执行,一定要kill掉compactservice服务

查看compact由metastore还是compactservice执行

show compact location;

注:设置orc.compact.service.provider=metastore或者orc.compact.service.provider=server时要设置在hive-site里面, 不能直接beeline中set;或者也可以在manager里面加配置, 然后重启;


compact任务成功结束之后,在观察hdfs上的内容:

[localhost:10000] transwarp> dfs -ls hdfs://service/inceptor1/user/hive/warehouse/crud001.db/yarn/orc_transaction_table;

Found 1 items

drwxrwxrwx - yarn hadoop 0 2016-03-02 23:56 hdfs://service/inceptor1/user/hive/warehouse/crud001.db/yarn/orc_transaction_table/base_0246405

可见major compact后,系统会产生一个base开始的目录,记录了到transaction号246405为止,该表的全部内容。

如果在往该表插入新的记录,则会生产新的delta版本:

[localhost:10000] transwarp> insert into orc_transaction_table values(1,2,3,4);

1 rows affected.

Time taken: 1.718 seconds

[localhost:10000] transwarp> dfs -ls hdfs://service/inceptor1/user/hive/warehouse/crud001.db/yarn/orc_transaction_table;

Found 2 items

drwxrwxrwx - yarn hadoop 0 2016-03-02 23:56 hdfs://service/inceptor1/user/hive/warehouse/crud001.db/yarn/orc_transaction_table/base_0246405

drwxr-xr-x - yarn hadoop 0 2016-03-03 00:03 hdfs://service/inceptor1/user/hive/warehouse/crud001.db/yarn/orc_transaction_table/delta_0246406_0246406

一段时间之后在查看hdfs目录可以发现这两个版本被自动合并成了一个新版本:

[localhost:10000] transwarp> dfs -ls hdfs://service/inceptor1/user/hive/warehouse/crud001.db/yarn/orc_transaction_table;

Found 1 items

drwxrwxrwx - yarn hadoop 0 2016-03-03 00:04 hdfs://service/inceptor1/user/hive/warehouse/crud001.db/yarn/orc_transaction_table/base_0246406

这是compact thread在后台自动做的compact,目前后台的major compact触发条件是:

当系统中没有base版本,则当delta版本大于10时;

当系统中有base版本,则当所有delta版本的数据量达到base版本数据量的10%或者delta版本个数大于50时;


这些触发条件都是可以配置的,分别对应于参数:

l hive.compactor.delta.num.threshold.without.base default value 10

l hive.compactor.delta.num.threshold default value 50

l hive.compactor.delta.pct.threshold default value 0.1

3. Compact结果校验方式

torc普通表

1) 通过desc formatted pre_torc1_2查看delta文件是否合并成了base文件

2) 表compaction_queue_v中的compaction_state的值

3) show compactions

4) hdfs路径

torc分区表

1) 表compaction_queue_v中compaction_state的值

2) show compactions

3) hdfs路径

 

收藏 0 0
    2022-12-12 20:38:56
    常见故障诊断以及Compact黑名单机制:https://community.transwarp.cn/thread?topicId=272
共1条 1

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

admin

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