专栏首页杨建荣的学习笔记海量数据迁移之分区并行切分(r2笔记60天)

海量数据迁移之分区并行切分(r2笔记60天)

在海量的数据迁移中,如果某个表特别大,可以考虑对表中的分区进行切分,比如某个表有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

本文分享自微信公众号 - 杨建荣的学习笔记(jianrong-notes),作者:r2笔记60天

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2014-08-10

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 数据刷新中的并行改进(二) (r5笔记第76天)

    在之前的博文【数据刷新中的并行改进(r5笔记第72天)】中分享了数据刷新中的并行改进建议,但是对于方案的落地还是有很多的细节需要实现。 首先是关于很多的表怎么把...

    jeanron100
  • 对分区表导入导出的水平,垂直切分(r2第22天)

    在工作中有时候碰到一些分区表,业务数据量很大,可能几百G,上T的规模,而且做数据的导入导出的时候,会感觉到exp/expdp的时候生成的dump文件太大了,做导...

    jeanron100
  • 关于interval partitioning(r3笔记65天)

    今天一个开发的同事问我一个问题,说在系统中目前需要一个临时的解决方案,定义了一张表,目前想设定为分区表,因为会和外围系统交互产生大量的数据,所以需要按照小时来做...

    jeanron100
  • Windows 10 应用创建模糊背景窗口的三种方法

    发布于 2018-07-16 11:44 更新于 2018-08...

    walterlv
  • 鲜为人知的前端知识

    需要注意的是如果是通过copy paste代码到浏览器地址栏的话,IE及Chrome会自动去掉代码开头的javascript:,所以需要手动添加起来才能正确执行...

    奋飛
  • Appium+python自动化(十三)- 输入中文 - 一次填坑记(超详解)

    无论你在哪里,在做什么都会遇到很多坑,这些坑有些事别人挖的,有些是自己挖的。别人挖的叫坑人,自己挖的叫自杀,儿子挖的叫坑爹。因此在做app自动化道路上也...

    北京-宏哥
  • js常用方法和一些封装(1)1.字符串相关2.数组相关

    剽悍一小兔
  • 【干货】Elasticsearch搜索调优权威指南 (1/3)

    Elasticsearch搜索调优权威指南,是QBOX在其博客上发布的系列文章之一,本文是该系列的第一篇,主要从文档建模、内存分配、文件系统缓存、GC和硬件等方...

    杨振涛
  • GUSD中文技术白皮书剖析 | 直播活动预告

    背景:最近稳定币的人气飙升超乎人们的想象,尤其是 Winklevoss 兄弟创办的美国 Gemini 交易所发行的 GUSD 更是震动了金融和科技两个圈子,哈希...

    Henry Zhang
  • PHP XDebug 本地调试

    很久没写PHP了、同样很很久没有用XDebug了,近期有个简单的场景要用到,简单记录一下关键步骤。

    许杨淼淼

扫码关注云+社区

领取腾讯云代金券