資料重新整理中的並行改進(二)
在之前的博文中分享了資料重新整理中的並行改進建議,但是對於方案的落地還是有很多的細節需要實現。
首先是關於很多的表怎麼把它們合理的進行並行切分。
根據實際的情況,因為這些資料字典表都相對資料量都不大,所以存在的分割槽表很少,所以可以考慮按照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.lst
首先是關於很多的表怎麼把它們合理的進行並行切分。
根據實際的情況,因為這些資料字典表都相對資料量都不大,所以存在的分割槽表很少,所以可以考慮按照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.lst
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/23718752/viewspace-1708454/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 資料重新整理中的並行改進(一)並行
- 資料重新整理中的並行改進(三)並行
- [譯] 在 Python 中,如何運用 Dask 資料進行並行資料分析Python並行
- 記一次資料同步需求的改進(二)
- 【譯】.NET 7 中的效能改進(二)
- js操作 新增刪除table行,並進行重新整理JS
- 用R讀取PDF並進行資料探勘
- Oracle中的並行系列(二):你設定的並行真的生效了嗎?Oracle並行
- elmentplus中刪除el-treen 資料時,樹的資料改變了,但是樹不重新整理
- php 建立頁面表單並進行增刪改查PHP
- Redis中快取二進位制資料Redis快取
- MySQL資料清理的需求分析和改進MySql
- Spring 通過Spring容器獲得資料來源物件並改進Spring物件
- 亞信安慧AntDB資料並行載入工具的實現(二)並行
- 【python】爬取疫情資料並進行視覺化Python視覺化
- Spotify如何改進資料科學家的資料發現?資料科學
- mogoose 建立資料庫並增刪改查Go資料庫
- LLM並行訓練3-資料並行並行
- 考研大資料爬取與分析工具二次開發進行中。。。大資料
- 一個資料倉儲資料重新整理的實現機制(二)
- Swift 4.1 中的 Codable 改進Swift
- 第二章. Dump程式的改進
- 利用Data Vault對資料倉儲進行建模(二)
- 如何用 Scrapy 爬取網站資料並在 Easysearch 中進行儲存檢索分析網站
- 使用 refreshNuxtData 重新整理 Nuxt應用 中的資料UX
- 聚焦“智改數轉” ,三路並進推動企業資料安全建設
- dbms_mview 並行重新整理 refresh parallelView並行Parallel
- Oracle中的並行Oracle並行
- 並行智慧 | 社交媒體資料在品牌資產管理中的力量並行
- 如何使用常用的6種方式對資料進行轉換(二)
- Vue 中利用 eventBus 進行資料通訊的問題Vue
- 動態改變Drawable中我們自定義背景的顏色並設定顏色以16進位制進行設定
- 記一次資料同步需求的改進(三)
- 記一次資料同步需求的改進(一)
- PHP 5/Zend Engine 2.0的改進(二) (轉)PHP
- Netty整合SpringBoot並使用Protobuf進行資料傳輸NettySpring Boot
- vuex配sessionStorage進行自動儲存,解決重新整理資料丟失的問題。VueSession
- 在SQL Server中對檢視進行增刪改SQLServer