資料重新整理中的並行改進 二

2021-09-22 19:16:36 字數 4098 閱讀 3505

在之前的博文中分享了資料重新整理中的並行改進建議,但是對於方案的落地還是有很多的細節需要實現。

首先是關於很多的表怎麼把它們合理的進行並行切分。

根據實際的情況,因為這些資料字典表都相對資料量都不大,所以存在的分割槽表很少,所以可以考慮按照segment的大小來作為並行切分的基準。

所以在分布式環境中,在進行了並行切分之後,資料的重新整理速度也是會有差異的。為了儘量減少同乙個資料來源的重新整理瓶頸,所以還是考慮在每個節點考慮採用並行重新整理,完成乙個節點,然後下乙個,所以實際的情況就可能會是下面的樣子。

黃色部分表示還沒有開始,綠色部分表示正在重新整理,灰色部分表示已經完成。所以同樣的表在不同的節點中可能重新整理速度也會有所不同。

所以目前為止,難點有三個,乙個是能夠把多個表進行並行切分,第二個就是能夠合理的同步重新整理的進度,第三個就是能夠在多個節點間持續的進行切換。

首先第乙個問題是並行切分的部分,可以參考下面的**。

這個指令碼會把多個表進行切分,然後生成物化檢視重新整理的語句,不同的節點會生成單獨的一套指令碼便於控制和管理。

par_file_name=$1

sort -rn -k2 $par_file_name > $_tmp

mv  $_tmp  $

par_no=$2

obj_length=`cat $|wc -l `

echo $obj_length

sid_list=cust01,usg01,usg02,usg03,usg04

for i in do

for tmp_sid in do

sed -n ''$i'p' $> par$_$

done

export par$_sum=`cat par$_$|awk '' | awk 'end'`

#echo `eval echo \\$_sum}`

done

function getmin

do export par$_=`eval echo \\$}`

done

min_sum=$par1_

min_par=par1_

for i in ; do

j=`expr $i - 1`

tmp_cur_par=par$_

tmp_cur_sum=`eval echo   \\$}`

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

do #export par$_sum=`cat par$_$|awk '' | awk 'end'`

#echo `eval echo \\$_sum}`

#par_list="$par_list  `eval echo \\$_sum}`"

#echo $par_list

tmp_sum=`cat par$_$|awk '' | awk 'end'`

echo $tmp_sum

#tmp_par_list=$ "" $tmp_sum

done

#echo $tmp_par_list }

j=`expr $par_no + 1`

for i in } do

tmp_obj=`sed -n ''$i'p' $'`

tmp_obj2=`sed -n ''$i'p' $|awk ''`

par_list=`getsumlist`

tmp_par=`getmin  $par_list`

echo 'move '`sed -n ''$i'p' $|awk ''` ' to '$tmp_par

echo $tmp_obj >> $$

for tmp_sid in do

echo $tmp_obj2 >> $$.$tmp_sid

done

tmp_par=0

done

for i in do

cat par$_$|awk '' | awk 'end'

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

ViewPager中資料不重新整理的問題

pageradapter重新整理分析 notifydatasetchanged public void notifydatasetchanged mobservable.notifychanged 此處用到了觀察者模式 通知變化 public void notifychanged 在上面的oncha...

迴圈結構的並行 二

2 shedule條件 把並行迴圈中的計算指定給執行緒這種方式稱為迴圈佇列 loop s schedule 對於並行迴圈中並形體計算量接近的情況,使用預設的佇列方式是最優的。但也存在並行迴圈中每個平行計算量大小不一致的情況,如果計算量大小差距很大,並行程式的執行時間是以最後完成的那個執行緒為結束標記...

資料倉儲建設持續改進資料質量(二)

資料質量改進案例分析 從實施中國電信6省營銷分析情況來看,資料質量改進普遍存在如何定義資料質量評價標準 如何實現資料質量管理的閉環過程 如何界定資料質量改進過程中各系統間的功能邊界三個難點問題。如何定義資料質量評價標準 首先前端 後端 管控部門根據其專業對資料的不同要求,評價標準各有不同 如後端業務...