
我們?cè)谧鰯?shù)據(jù)治理 數(shù)據(jù)倉(cāng)庫(kù)的時(shí)候 ,集群數(shù)據(jù)遷移時(shí)必不可少的一項(xiàng),因?yàn)槭裁茨兀?br>
比如
1剛開(kāi)始集群搭在亞馬遜aws,幾十萬(wàn)美金的創(chuàng)業(yè)紅包用完了,差不多三四個(gè)月,
2aws的小規(guī)模集群也有 900TB 的數(shù)據(jù),遷移到 腹黑的阿里云平臺(tái),
3過(guò)幾天有人來(lái)你公司搞推銷(xiāo),告訴你使用他們 阿里云大集團(tuán)賬號(hào)上六折折扣,結(jié)果遷移到他們的上面,
4結(jié)果過(guò)了半年阿里云開(kāi)始清查,發(fā)現(xiàn)他們的大集團(tuán)賬號(hào)違規(guī)操作,收回折扣價(jià),公司為了節(jié)約成本 ,限期遷移,這回又自己買(mǎi)服務(wù)器捯飭搭建本地集群,可算是一次投入 ,只交電網(wǎng)費(fèi)了
5又過(guò)了半年,辦公區(qū)老限閘停電,業(yè)務(wù)受阻苦不堪言,結(jié)果又含淚 找了 第三方的實(shí)體機(jī)房配置新的集群,這回可算消停了一下,
6 結(jié)果公司業(yè)務(wù)擴(kuò)張,又不得不在更多大中華區(qū)各個(gè)片區(qū)機(jī)房購(gòu)買(mǎi)機(jī)器配置集群,
7.過(guò)了半年 又嫌機(jī)器性能不夠好,同地異地 統(tǒng)統(tǒng)更換性能硬件更好的機(jī)器
8.過(guò)了一段時(shí)間公司燒錢(qián)厲害,要倒閉,有價(jià)值的數(shù)據(jù)清洗打包賣(mài)給 第三方數(shù)據(jù)商販
來(lái)來(lái)回回沒(méi)有終點(diǎn),一段曲折的歷史 倒出不盡人意的辛酸苦楚,上面的過(guò)程都要遷移數(shù)據(jù),遷移數(shù)據(jù)包括 表結(jié)構(gòu)和表數(shù)據(jù),遷移還不是終點(diǎn),還要rebalance
下面先講講 hvie 的遷移 之一 表結(jié)構(gòu) 遷移,
假設(shè)我們?cè)贏 集群上有一個(gè)庫(kù) fkdb ,有上千張表,
如果自己用最笨的方法遷移, 比如說(shuō)登錄到 hive上,
desc table name ,顯示出表的結(jié)構(gòu),然后粘貼復(fù)制到文本文件里,然后自己再組織結(jié)構(gòu)成創(chuàng)建表的語(yǔ)句,然后再 在B 集群上 執(zhí)行創(chuàng)建表語(yǔ)句,那么一個(gè)表大于 20分鐘才可以,上千張表的話,一個(gè)月都干不完,平均一天 也才30張表,
那我們一定要結(jié)合 shell 腳本的便利,能用腳本自動(dòng)化執(zhí)行的,就交給腳本就可以了,
為了方便大家理解,我們先做一些解釋說(shuō)明
hive -e 字符串語(yǔ)句hive 命令, 這個(gè)可以 執(zhí)行hsql 語(yǔ)句
hive -f hsql腳本文件 這個(gè)可以 執(zhí)行hsql 文件 ,比如創(chuàng)建表
show create table database.tablename 這個(gè)會(huì)顯示創(chuàng)建表的語(yǔ)句
desc table tablename 這個(gè)會(huì)顯示表的結(jié)構(gòu)
output.hql 追加到文件中
我們可以一步到位
hive -e 'show create table database.tablename' >>tab_create.hql 這樣就把創(chuàng)建表的語(yǔ)句追加到文件中了
然后我們?cè)贐 集群執(zhí)行
hive -f tab_create.hql 就可以把 創(chuàng)建表語(yǔ)句執(zhí)行
面對(duì)上千張表,我們使用 shell 的for 來(lái)遍歷
for tab in hive -e 'use fkdb;show tables;do script ;done
下面是 執(zhí)行 過(guò)程
mkdir export_tab
cd export_tab
vi export_tab.sh
#!/bin/bash
for tab in `hive -e 'use fkdb;show tables'`;do
suffix=_create.hql
hive -e "show create table fkdb.$tab" >> ./$tab$suffix ;
done
esc : wq #保存退出
chmod u+x export_tab.sh
sh ./export_tab.sh
#等待腳本執(zhí)行完畢,此目錄會(huì)生成 所有表的創(chuàng)建語(yǔ)句,其實(shí)也可以吧所有表的創(chuàng)建語(yǔ)句追加到同一個(gè)文件里,這樣 在B 集群導(dǎo)入表結(jié)構(gòu)會(huì)一次到位
cat *_create.hql >> tab_create_all.hql
zip -r tab_cre.zip ./*_create.hql
然后將 tab_cre.zip 傳輸?shù)紹 集群上,然后執(zhí)行
mkdir import_tab
cd import_tab
unzip tab_cre.zip -d ./
vi import_tab.sh
#!/bin/bash
for tab in `ls **_create.hql`;do
hive -f $tab
esc : wq #保存退出
chmod u+x import_tab.sh
sh ./import_tab.sh
這樣fkdb上的所有表結(jié)構(gòu)就完成了 跨集群的創(chuàng)建,而且是原汁原味,自己粘貼復(fù)制 上千張表必然會(huì)出事故,出錯(cuò)就在所難免了
這個(gè)時(shí)候需要注意的是 在B 集群上的 同名數(shù)據(jù)庫(kù)是否存在 ,庫(kù)表的權(quán)限和操作用戶(hù)是否和A 集群上相同