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

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

根据实际的情况,因为这些数据字典表都相对数据量都不大,所以存在的分区表很少,所以可以考虑按照segment的大小来作为并行切分的基准。 所以在分布式环境中,在进行了并行切分之后,数据的刷新速度也是会有差异的。为了尽量减少同一个数据源的刷新瓶颈,所以还是考虑在每个节点考虑采用并行刷新,完成一个节点,然后下一个,所以实际的情况就可能会是下面的样子。 黄色部分表示还没有开始,绿色部分表示正在刷新,灰色部分表示已经完成。所以同样的表在不同的节点中可能刷新速度也会有所不同。

所以目前为止,难点有三个,一个是能够把多个表进行并行切分,第二个就是能够合理的同步刷新的进度,第三个就是能够在多个节点间持续的进行切换。 首先第一个问题是并行切分的部分,可以参考下面的代码。 这个脚本会把多个表进行切分,然后生成物化视图刷新的语句,不同的节点会生成单独的一套脚本便于控制和管理。

par_file_name=$1
sort -rn -k2 $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
sid_list=cust01,usg01,usg02,usg03,usg04

for i in {1..$par_no}
do
  for tmp_sid in {$sid_list}
  do
  sed -n ''$i'p' ${par_file_name}> par${i}_${par_file_name}
  done
export par${i}_sum=`cat par${i}_${par_file_name}|awk '{print $2}' | 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 $2}' | 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 $2}' | 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}'`
tmp_obj2=`sed -n ''$i'p' ${par_file_name}|awk '{print "execute dbms_mview.refresh('\''"$1"'\'','\''C'\'');"}'`

par_list=`getSumList`
tmp_par=`getMin  $par_list`
echo 'move '`sed -n ''$i'p' ${par_file_name}|awk '{print $1}'` ' to '$tmp_par
echo $tmp_obj >> ${tmp_par}${par_file_name}
for tmp_sid in {$sid_list}
do
echo $tmp_obj2 >> ${tmp_par}${par_file_name}.$tmp_sid
done
tmp_par=0
done

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

脚本运行方式如下,比如我们需要把tab_parall.lst中的内容进行切分,切分为10个并行线程,可以这样运行脚本。

ksh split.sh tab_parall.lst 10

tab_parall.lst的内容如下:
table1    1000000
table2     800000
table3     500000
table4     300000
.....

生成的脚本如下:

-rw-r--r-- 1 prodbuser dba  2132 Jun 22 18:36 par10_tab_parall.lst
-rw-r--r-- 1 prodbuser dba  4639 Jun 22 18:36 par10_tab_parall.lst.cust01
-rw-r--r-- 1 prodbuser dba  4639 Jun 22 18:36 par10_tab_parall.lst.usg01
-rw-r--r-- 1 prodbuser dba  4639 Jun 22 18:36 par10_tab_parall.lst.usg02
-rw-r--r-- 1 prodbuser dba  4639 Jun 22 18:36 par10_tab_parall.lst.usg03
-rw-r--r-- 1 prodbuser dba  4639 Jun 22 18:36 par10_tab_parall.lst.usg04
-rw-r--r-- 1 prodbuser dba   101 Jun 22 18:35 par1_tab_parall.lst
-rw-r--r-- 1 prodbuser dba   976 Jun 22 18:36 par2_tab_parall.lst
-rw-r--r-- 1 prodbuser dba  2045 Jun 22 18:36 par2_tab_parall.lst.cust01
-rw-r--r-- 1 prodbuser dba  2045 Jun 22 18:36 par2_tab_parall.lst.usg01
-rw-r--r-- 1 prodbuser dba  2045 Jun 22 18:36 par2_tab_parall.lst.usg02
-rw-r--r-- 1 prodbuser dba  2045 Jun 22 18:36 par2_tab_parall.lst.usg03
-rw-r--r-- 1 prodbuser dba  2045 Jun 22 18:36 par2_tab_parall.lst.usg04
-rw-r--r-- 1 prodbuser dba  1997 Jun 22 18:36 par3_tab_parall.lst
-rw-r--r-- 1 prodbuser dba  4296 Jun 22 18:36 par3_tab_parall.lst.cust01
-rw-r--r-- 1 prodbuser dba  4296 Jun 22 18:36 par3_tab_parall.lst.usg01
-rw-r--r-- 1 prodbuser dba  4296 Jun 22 18:36 par3_tab_parall.lst.usg02
-rw-r--r-- 1 prodbuser dba  4296 Jun 22 18:36 par3_tab_parall.lst.usg03
-rw-r--r-- 1 prodbuser dba  4296 Jun 22 18:36 par3_tab_parall.lst.usg04
-rw-r--r-- 1 prodbuser dba  2077 Jun 22 18:36 par4_tab_parall.lstv

原文发布于微信公众号 - 杨建荣的学习笔记(jianrong-notes)

原文发表时间:2015-06-22

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

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏finleyMa

docker学习系列7 容器化Node项目

本节我们自己打包一个docker镜像并发布到官方的镜像仓库中。这样任何人只需执行以下命令: docker run -d -p 3000:3000 finley...

2251
来自专栏运维技术迷

Veeam Backup & Replication(二):添加虚拟化主机和配置备份存储

一、添加虚拟化主机 veeam可以添加单个ESXi主机,也可以添加vCenter服务器,因为做实验,就添加一台ESXI主机为例吧。 1.1 选择 Virtual...

50812
来自专栏后端云

虚拟机无法启动

由于kvm所在的机器启用了SELINUX,后来将之关闭,关闭之后,发现kvm的虚拟机无法启动

3244
来自专栏性能与架构

轻量级容器Docker起步

image.png 目标 安装并启动Docker服务,下载一个ubuntu的基础镜像,启动容器,在容器中输出 ‘hello world’ 安装 Docker需...

4239
来自专栏编程坑太多

跟我一起学docker(六)--数据管理

1912
来自专栏PHP技术大全

使用PHP搭建Web版Docker管理系统实践

团队中使用容器比较频繁,但并不是所有人都可以登陆服务器去执行命令,但是又需要用到docker,所以有一个需求通过web来管理docker,而其他语言并不怎么熟悉...

4172
来自专栏Debian社区

使用apt-mirror搭建debian镜像源

debian官方提供了脚本ftpsync来搭建源镜像,而 apt-mirror 是一个更简单便捷的源镜像搭建工具。

3152
来自专栏Samego开发资源

初识docker compose工具

1813
来自专栏纯洁的微笑

Docker(四):Docker 三剑客之 Docker Compose

前两篇文章我们介绍了 Dockerfile 的使用Docker(二):Dockerfile 使用介绍,我们知道使用一个 Dockerfile 模板文件可以定义一...

4273
来自专栏云计算

将基于MicroProfile的Java应用程序部署到Bluemix

Eclipse MicroProfile是一个开源项目,用于为微服务架构优化企业级Java语言。基于MicroProfile的应用程序可以部署到Kubernet...

24510

扫码关注云+社区

领取腾讯云代金券