海量数据迁移之分区并行切分

简介: 在海量的数据迁移中,如果某个表特别大,可以考虑对表中的分区进行切分,比如某个表有100g,还有100个分区,那么可以考虑针对这100个分区,那么可以考虑把这100个分区看成100个表进行并行抽取,如果某个分区数据比较多,可能生成5个dump,那么着100个分区,就可能生成105个分区以上。
在海量的数据迁移中,如果某个表特别大,可以考虑对表中的分区进行切分,比如某个表有100g,还有100个分区,那么可以考虑针对这100个分区,那么可以考虑把这100个分区看成100个表进行并行抽取,如果某个分区数据比较多,可能生成5个dump,那么着100个分区,就可能生成105个分区以上。
那么如果有100多个表,那么可能分区都算进来就可能有上千个。如何对这上千个dump进行最快的加载呢。
可以考虑基于分区的并行切分,里面可能还涉及一些算法的知识。

目前生成了如下的数据报告,我们需要基于这个报告来对如下的表/分区进行切分。
REEMENT这个表不是分区表,所以在分区信息的地方填写了默认值'x',在数据加载的时候会进行过滤。
MEMO这个表比较大,对于分区partition(P0_A1000_E3),生成的dunp序号为21,22,23,总共有3个dump。在数据加载的时候就可以先加载21号dump,然后22号dump,23号dump

MEMO partition(P0_A1000_E3) 3 21..23
MEMO partition(P0_A1000_E2) 3 18..20
MEMO partition(P0_A1000_E1) 3 15..17
USR_GRP_MEMBERS x 2 1..3
REEMENT x 2 1..3
MEMO partition(PMAXVALUE_AMAXVALUE_EMAXVALUE) 1 699..700
MEMO partition(P9_A3000_E5) 2 697..698
MEMO partition(P9_A3000_E4) 2 695..696
MEMO partition(P9_A3000_E3) 2 693..694
MEMO partition(P9_A3000_E2) 2 691..692
MEMO partition(P9_A3000_E1) 2 689..690
MEMO partition(P9_A3000_E0) 2 687..688
MEMO partition(P9_A2000_E5) 2 685..686
MEMO partition(P9_A2000_E4) 2 683..684
MEMO partition(P9_A2000_E3) 2 681..682
MEMO partition(P9_A2000_E2) 2 679..680
MEMO partition(P9_A2000_E1) 2 677..678
MEMO partition(P9_A1000_E0) 2 657..658

我们现在就需要基于第三列的信息,对表、分区表进行切分。使得启用的多个并行进程能够最大程度的达到平衡。
我们可以使用如下的脚本来进行表、分区的并行切分。
比如我们考虑启用6个并行的进程,生成的日志类似下面的形式。可以看到切分还是很均匀的。

move INVOICE partition(A11_B6)  to par6_
move INVOICE partition(A11_B4)  to par1_
move INVOICE partition(A11_B2)  to par2_
move INVOICE partition(A11_B10)  to par3_
move INVOICE partition(A10_B8)  to par4_
move INVOICE partition(A10_B6)  to par5_
move INVOICE partition(A10_B4)  to par6_
move INVOICE partition(A10_B2)  to par1_
move INVOICE partition(A10_B10)  to par2_
move RESOURCE partition(A9)  to par3_
move RESOURCE partition(A8)  to par4_
move RESOURCE partition(A7)  to par5_
move RESOURCE partition(A6)  to par6_
move RESOURCE partition(A5)  to par1_
move RESOURCE partition(A4)  to par2_
move RESOURCE partition(A3)  to par3_
move RESOURCE partition(A2)  to par4_
move RESOURCE partition(A1)  to par5_
move RESOURCE partition(A0)  to par6_
213
213
213
213
214
214

脚本如下:

par_file_name=$1
sort -rn -k3 $par_file_name > ${par_file_name}_tmp
mv  ${par_file_name}_tmp  ${par_file_name}

par_no=$2
obj_length=`cat ${par_file_name}|wc -l `
echo $obj_length

for i in {1..$par_no}
do
sed -n ''$i'p' ${par_file_name}> par${i}_${par_file_name}
export par${i}_sum=`cat par${i}_${par_file_name}|awk '{print $3}' | awk '{sum+=$1}END{print sum}'`
#echo `eval echo \\${par${i}_sum}`
done

function getMin
{
param_no=$#

for i in {1..$param_no}
do
export par${i}_=`eval echo \\${${i}}`
done

min_sum=$par1_
min_par=par1_


for i in {2..$param_no};
do
j=`expr $i - 1`
tmp_cur_par=par${i}_
tmp_cur_sum=`eval echo   \\${${tmp_cur_par}}`
if [ $min_sum -le $tmp_cur_sum  ]
then
 min_sum=$min_sum
 min_par=$min_par
else
 min_sum=$tmp_cur_sum
 min_par=$tmp_cur_par
fi
done

echo  $min_par
}

function getSumList
{
for k in {1..$par_no}
do
#export par${k}_sum=`cat par${k}_${par_file_name}|awk '{print $3}' | awk '{sum+=$1}END{print sum}'`
#echo `eval echo \\${par${k}_sum}`

#par_list="$par_list  `eval echo \\${par${k}_sum}`"
#echo $par_list

tmp_sum=`cat par${k}_${par_file_name}|awk '{print $3}' | awk '{sum+=$1}END{print sum}'`
echo $tmp_sum
#tmp_par_list=${tmp_par_list} "" $tmp_sum
done
#echo $tmp_par_list
}

j=`expr $par_no + 1`
for i in {$j..${obj_length}}
do
tmp_obj=`sed -n ''$i'p' ${par_file_name}`

par_list=`getSumList`
tmp_par=`getMin  $par_list`
echo 'move '`sed -n ''$i'p' ${par_file_name}|awk '{print $1 " " $2}'` ' to '$tmp_par
echo $tmp_obj >> ${tmp_par}${par_file_name}
tmp_par=0
done

for i in {1..$par_no}
do
cat par${i}_${par_file_name}|awk '{print $3}' | awk '{sum+=$1}END{print sum}'
done

目录
相关文章
|
缓存 开发工具
RedHat8.4配置本地yum软件仓库(RHEL8.4)
RedHat8.4配置本地yum软件仓库(RHEL8.4)
2271 0
RedHat8.4配置本地yum软件仓库(RHEL8.4)
|
机器学习/深度学习 编解码 算法
yolo原理系列——yolov1--yolov5详细解释
yolo原理系列——yolov1--yolov5详细解释
1635 0
yolo原理系列——yolov1--yolov5详细解释
|
存储 弹性计算 算法
倚天产品介绍|倚天ECS加速国密算法性能
倚天ECS是阿里云基于平头哥自研数据中心芯片倚天710推出arm架构实例,采用armv9架构,支持SM3/SM4指令,可以加速国密算法性能。本文基于OpenSSL 3.2和Tongsuo 实测对比了倚天ECS g8y实例和Intel g7 实例国密性能。为用户选择ECS提供参考。
|
存储 NoSQL Redis
【360开源】Pika最佳实践
Pika是360 热门的c++开源项目,基于rocksdb开发的大容量类Redis存储,力求在完全兼容Redis协议、继承Redis便捷运维设计的前提下通过持久化存储方式解决Redis在大容量场景下主从同步代价高、恢复时间慢、单线程相对脆弱、内存成本高等问题。
2853 0
|
Java Maven
intellij idea如何查看项目maven依赖关系图
这篇文章介绍了如何在IntelliJ IDEA中查看项目的Maven依赖关系图,包括使用Maven工具栏和相关操作来展示和查看依赖细节。
|
弹性计算 网络协议 API
原生Claude3免魔法本地轻松上手,这3步你必须要知道
本文详细介绍了如何在阿里云ECS上部署LobeChat,并通过Cloudflare实现Claude3 API的代理访问。首先准备ECS、Claude3 API密钥及域名,接着通过Docker部署LobeChat,并配置相关环境变量。然后,在Cloudflare上创建站点并部署API代理,最后通过SSH端口映射在本地访问LobeChat。文中提供了具体步骤与示例代码,帮助读者顺利完成部署,体验高效便捷的AI聊天功能。
1575 2
|
API 开发者
淘宝官方商品、交易、订单、物流、插旗接口接入说明
这些接口涉及淘宝店铺订单管理的关键方面,包括订单列表、订单详情及订单物流信息的获取。订单列表接口(如`taobao.trades.sold.get`和`taobao.topats.trades.sold.get`)帮助商家快速了解订单概览,进行基本管理和统计。订单详情接口(如`taobao.trade.fullinfo.get`和`taobao.topats.trades.fullinfo.get`)提供单个订单的全面信息,便于发货准备和服务支持。订单物流接口则允许跟踪订单的物流状态,确保配送顺畅。使用这些接口需遵循淘宝开放平台的规定,并关注API调用限制与更新。
|
BI 定位技术 C++
超级好用的C++实用库之地理相关接口
超级好用的C++实用库之地理相关接口
125 0
|
分布式计算 NoSQL Spark
技术好文:scyllaDB基本使用
技术好文:scyllaDB基本使用
|
消息中间件 监控 测试技术
Flink实时计算大促压测实践
Flink实时计算大促压测实践
253 0