【MRS】【FusionInsight】Hive并发MSCK Repair实践

举报
小源源 发表于 2021/07/06 20:42:21 2021/07/06
【摘要】 【摘要】对Hive所有的表逐个进行MSCK Repair,修复效率将会很慢,例如修复1000+个表,30+万个分区,修复时长需要5~6个小时左右,耗时非常长,大大占用了变更时间窗。因此,优化改进MSCK Repair,有效提升修复效率,将变得尤为急迫和重要。优化后,10并发执行MSCK Repair修复1000+个表,30+万个分区,修复操作只需0.5小时左右,效率提升10~12倍。

【背景】

Hive数据跨集群迁移场景下(例如从一套大数据老集群往新集群迁移Hive表数据时),一般需要先迁移Hive的业务数据(即Hive存储在HDFS上的数据)和Hive表的元数据,然后对新集群上迁移后的Hive所有表做MSCK Repair操作来修复表分区,以构建元数据和业务数据之间的联系,使得客户能正常访问Hive表。

但是,若对Hive所有的表逐个进行MSCK Repair,修复效率将会很慢,例如修复1000+个表,30+万个分区,修复时长需要5~6个小时左右,耗时非常长,大大占用了变更时间窗。因此,优化改进MSCK Repair,有效提升修复效率,将变得尤为急迫和重要。

【优化思想】

 MSCK Repair命令是对库中所有表逐个串行地修复,效率低下。若能有效利用客户端的线程资源,并发Repair,修复效率将会大大提升。

【优化步骤】

        前提:1)已通过Hadoop的Distcp命令将Hive的业务数据从老集群全量迁移到了新集群;2)已对每个Hive库show create table <Table名>导出老集群所有Hive表的DDL建表语句,并在新集群上创建全量表的元数据;

步骤1    对老集群上每个Hive库通过show tables命令获取库中所有表;

步骤2    假设MSCK Repair的并发数为10,那就将Hive库的所有表名均匀放到10个文本文件中(例如总共有1000个表,表名记录到10个文本文件,每个文本文件中放100个表名)。并且,确保分区较多的表不要集中放到一个文本文件,手动调整,均匀放到不同文件,这样使得并发的10个线程能接近同时跑完,不会出现部分线程拖尾。

步骤3    执行并发Repair工具来修复Hive表,以下摘出并发Repair工具的主要代码:

# concurrently run repair script 

for tableFile in $splitTablesList

do

    nohup bash "${shellDir}/repairTables.sh" "${database}" "$splitTables/$tableFile" >/dev/null 2>&1 &

done

其中,$splitTablesList存储的是10个文本文件名,${database}Hive库名,$tableFile是每个文件文件名。 

并且,repairTables.sh脚本的主要代码如下:

function repairTables()
{
   
cat "${tableFile}" | while read eachline
   
do
       
"${beelineCommand}" -e "use ${database}; MSCK REPAIR TABLE ${eachline};"
   
done
}

其中,${beelineCommand}为客户端Hive beeline文件所在路径。 

【执行结果对比】

优化前,执行MSCK Repair修复1000+个表,30+万个分区,修复操作需要5~6个小时左右;

优化后,10并发执行MSCK Repair修复1000+个表,30+万个分区,修复操作只需0.5小时左右,效率提升10~12倍。若加大并发数量,执行效率会提升更多。 

【结论】

在Hive数据迁移过程中做MSCK Repair时,加入并发的思想,将使得迁移的耗时大大缩短,效率得到可观的提升。

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。