拉鏈表工具化

拉鏈工具

1 拉鏈工具介紹

1.1 為什么要有拉鏈工具

? 拉鏈表谬以,是維護歷史狀態(tài)门扇,以及最新狀態(tài)數(shù)據(jù)的一種表,實際是保留了任意一條數(shù)據(jù)從創(chuàng)建地淀、到不斷完成更新的整個生命周期失球,它對于數(shù)倉的建設(shè)有著重要意義。過去帮毁,我們基于sql實現(xiàn)的(以下統(tǒng)稱為sql版)拉鏈表任務(wù)執(zhí)行速度慢实苞,資源耗費大,進而影響了同時段集群其它任務(wù)的執(zhí)行烈疚;為優(yōu)化拉鏈表整體任務(wù)黔牵,從拉鏈表任務(wù)執(zhí)行效率、集群資源利用與開發(fā)成本方向出發(fā)爷肝,使用spark rdd 開發(fā)了一套拉鏈表工具(以下統(tǒng)稱為rdd版)猾浦,其包含了維度表、事實表拉鏈兩種邏輯灯抛。

1.2 支持的幾類表

? 拉鏈工具支持兩類表金赦,維度表和事實表,全部采用二級靜態(tài)分區(qū)对嚼;

? 一級分區(qū)為天 dt 夹抗,即按天分區(qū);

? 二級分區(qū)為 status猪半,即狀態(tài)分區(qū)兔朦,值為hot 或 cold 偷线;

? 表種類不同,分區(qū)邏輯不同沽甥,回滾策略也不同声邦。

1.2.1 維度表

? 維度表,就是基礎(chǔ)表摆舟。相比事實表來說亥曹,一般不大。T+1處理恨诱, 每天滾動一個全量分區(qū)媳瞪,以ods數(shù)據(jù)是否變化決定數(shù)據(jù)進入哪個狀態(tài)分區(qū),ods變化的進入hot分區(qū)照宝,ods無變化的進入cold分區(qū)蛇受。回滾時厕鹃,按照dt去drop掉dt分區(qū)即可兢仰。

1.2.2 事實表

? 事實表,就是交易表剂碴,一般都很大把将。 T+1 處理,dt分區(qū)由數(shù)據(jù)的創(chuàng)建時間決定忆矛,根據(jù)ods數(shù)據(jù)每天做增量處理察蹲。以數(shù)據(jù)是否閉鏈決定數(shù)據(jù)進入哪個狀態(tài)分區(qū),閉鏈數(shù)據(jù)進入cold分區(qū)催训,開鏈數(shù)據(jù)進入hot分區(qū)洽议。回滾時瞳腌,需要刪除增量數(shù)據(jù)绞铃,不再能簡單的drop掉dt分區(qū)镜雨。

? 對于事實表嫂侍,拉鏈工具還記錄了一張change表,change表記錄了事實表里哪些分區(qū)的數(shù)據(jù)發(fā)生了變化荚坞。

2 實現(xiàn)方式比對

2.1 維度表

? 對比數(shù)據(jù)取自azkaban一周的任務(wù)執(zhí)行記錄(2019-12-06 至 2019-12-12)

? sql版中代碼邏輯只對supplier_id一個維度做了拉鏈

? rdd版中代碼邏輯對phone,supplier_id,status三個維度同時做了拉鏈

? 數(shù)據(jù)源表:ods.ods_yc_car_biz_driver_info_zip

? sql版本與rdd版本實現(xiàn)邏輯基本一致挑宠,區(qū)別在于sql的語法和rdd算子選用的不同。

2.1.1 效率
維度時長.png

sql版時長:1m 40s

rdd版時長 : 67s

分類 提升(%)
時長提升(節(jié)約) 33%

提升(%)= ( a - b ) /a 颓影, a為優(yōu)化前值 各淀,b為優(yōu)化后值。

2.1.2 資源
維度資源.png

sql版資源: 16c 21g

rdd版資源 : 16c 9g

分類 提升(%)
資源提升(節(jié)約) 57%

提升(%)= ( a - b ) /a 诡挂, a為優(yōu)化前值 碎浇,b為優(yōu)化后值临谱。

2.1.3 成本

? 開發(fā)人員只需設(shè)計拉鏈表結(jié)構(gòu)、填寫配置項奴璃;無需書寫大篇sql代碼悉默,數(shù)據(jù)量核對以及拉鏈準(zhǔn)確性校驗。這極大提升了開發(fā)效率苟穆,降低了開發(fā)成本抄课。

2.2 事實表

? 對比數(shù)據(jù)取自azkaban一周的任務(wù)執(zhí)行記錄

? sql版取自 2019-07-01 至 2019-07-07

? rdd版取自 2019-12-05 至 2019-12-11

? 數(shù)據(jù)源表:ods.ods_yc_car_fact_order_zip ,僅對status字段做拉鏈處理

sql版實現(xiàn)邏輯

任務(wù)拆解 job
獲取源表快照數(shù)據(jù) dwb_yc_car_biz_fact_order_his_01
目標(biāo)表數(shù)據(jù)拆分
... dwb_yc_car_fact_order_his_h0_02
... dwb_yc_car_fact_order_his_h0_03
... dwb_yc_car_fact_order_his_h1_02
... dwb_yc_car_fact_order_his_h1_03
... dwb_yc_car_fact_order_his_h2_02
... dwb_yc_car_fact_order_his_h2_02_not_need
... dwb_yc_car_fact_order_his_h2_03
... dwb_yc_car_fact_order_his_h2_03_not_need_1
... dwb_yc_car_fact_order_his_h2_03_not_need_2
... dwb_yc_car_fact_order_his_h2_03_not_need_3
拉鏈處理
... dwb_yc_car_fact_order_his_z0
... dwb_yc_car_fact_order_his_z1
... dwb_yc_car_fact_order_his_z2

以上 job 被拆解為三個部分:

  1. 從ods表里根據(jù)order_id開窗雳旅,按照status跟磨、創(chuàng)建時間、更新時間攒盈、offset降序排列取最新的一條數(shù)據(jù)

  2. 根據(jù)創(chuàng)建時間拆解分為 365天之前抵拘、180 - 365天、120 - 180天型豁、60 - 120天仑濒、60天之內(nèi)等時間塊,從目標(biāo)表對應(yīng)的dt偷遗、active和history分區(qū)里取所有的數(shù)據(jù)墩瞳,并行處理加快任務(wù)的執(zhí)行

  3. 數(shù)據(jù)合并、開窗氏豌、lag 喉酌,最后根據(jù)是否閉鏈動態(tài)分區(qū)到對應(yīng)dt 的active 或者h(yuǎn)istory 分區(qū)

    ?

sql版慢在哪里?

  • 多job并行的運算帶來的是多倍資源的消耗

  • 目標(biāo)表數(shù)據(jù)被拆分成了10個部分泵喘,每個job的完成都伴隨一張臨時表的生產(chǎn)泪电,中間數(shù)據(jù)的落地必然會影響任務(wù)的執(zhí)行速度

  • 拉鏈處理中,閉鏈的數(shù)據(jù)又重新參加拉鏈纪铺,帶來不必要的任務(wù)消耗

    ?

rdd版實現(xiàn)邏輯

  1. 取ods表所有數(shù)據(jù)的創(chuàng)建時間值相速,并去重,得到拉鏈表里哪些分區(qū)的數(shù)據(jù)發(fā)生了變化

  2. 根據(jù)變化的分區(qū)鲜锚,找到拉鏈表對應(yīng)的分區(qū)目錄突诬,逐個加載數(shù)據(jù)合并拉鏈表

  3. ods表數(shù)據(jù)與拉鏈表做全外鏈接,拉鏈邏輯處理

  4. save rdd

    ?

2.2.1 效率
  • sql版任務(wù)時長
sqlsc.png

? 總計時長:所有job耗費的時長加和芜繁。

? 按并行最長時間統(tǒng)計總時長:取每個被拆解任務(wù)中最長執(zhí)行時間旺隙,加和。(圖中紅色部分)

  • rdd版任務(wù)時長
rdd-1.png
  • 效率提升

    sql版總時長:191m 14s

    sql版按并行最長時間統(tǒng)計總時長:50m 18s

    rdd版總時長:21m

    分類 提升(%)
    總時長提升(節(jié)約) 89%
    并行最長時長提升(節(jié)約): 58%

    提升(%)= ( a - b ) /a 骏令, a為優(yōu)化前值 蔬捷,b為優(yōu)化后值。

2.2.2 資源
  • sql版資源使用
sql-zy.png

? 總資源:所有job耗費的資源加和榔袋。

按并行最高資源統(tǒng)計:同一時刻并行最大資源使用量周拐。(圖中紅色部分)

  • rdd版資源使用
rdd-1.png
  • 資源使用提升

? sql版總資源::1104c 3050g

? sql版按并行最高資源統(tǒng)計:496c 1370g

? rdd版總資源:80c 81g

分類 內(nèi)存提升(%) cpu提升(%)
總資源提升(節(jié)約): 97% 92%
并行最高資源接收(節(jié)約): 94% 83%

? 提升(%)= ( a - b ) /a 铡俐, a為優(yōu)化前值 ,b為優(yōu)化后值妥粟。

2.2.3 成本

? 開發(fā)人員只需設(shè)計拉鏈表結(jié)構(gòu)高蜂、填寫配置項;無需書寫大篇sql代碼罕容,數(shù)據(jù)量核對以及拉鏈準(zhǔn)確性校驗备恤。這極大提升了開發(fā)效率,降低了開發(fā)成本锦秒。

3 使用說明

3.1 維度表拉鏈

步驟1:創(chuàng)建表 zipper.ods_yc_car_biz_driver_info_zip

drop table zipper.ods_yc_car_biz_driver_info_zip;
CREATE TABLE zipper.ods_yc_car_biz_driver_info_zip(
driver_id               bigint,   
name                    string,                                                  
phone                   string,                                                                 
supplier_id             bigint,
status                  int,
update_date             string,                                  
create_date             string,
bigdata_inner_utime     string,                      
bigdata_inner_offset    bigint,
enter_state_time        string,                                     
quit_state_time         string                                                        
) 
partitioned BY (
dt                      string,                                      
bigdata_inner_status    string  
) ROW format delimited FIELDS TERMINATED BY '\001' LINES TERMINATED BY '\n' stored AS textfile;

步驟2:設(shè)置配置文件參數(shù)

{
    "appName":"ods_yc_car_biz_driver_info_zip",
    "source":{
        "primaryColumn":"driver_id",
        "schemaName":"ods",
        "tableName":"ods_yc_car_biz_driver_info",
        "partitionVal":""
    },
    "dimensionTarget":{
        "primaryColumn": "driver_id",
        "schemaName": "zipper",
        "tableName": "ods_yc_car_biz_driver_info_zip",
        "partitionVal":"",
        "targetPartitionVal":""
    },
    "zipPolicy":{
        "defaultZipperLastValue":"2999-12-31",
        "enterStateColumn":"enter_state_time",
        "quitStateColumn":"quit_state_time",
        "sourceTableUpdateTimeColumn":"bigdata_inner_utime",
        "zipBaseColumnList":["phone","supplier_id","status"],
        "mappingColumnList":[{
            "sourceColumn":"",
            "targetColumn":""
        }],
        "orderByColumnList":[{
            "name":"bigdata_inner_utime",
            "type":"desc"
        },{
            "name":"bigdata_inner_offset",
            "type":"desc"
        }]
    }
}

3.2 事實表拉鏈

步驟1:創(chuàng)建兩張表

表一: 拉鏈表 zipper.ods_yc_car_fact_order_zip

drop table zipper.ods_yc_car_fact_order_zip;
CREATE TABLE zipper.ods_yc_car_fact_order_zip(
order_id                bigint,  
order_no                string, 
type                    int,    
status                  bigint,        
create_date             string, 
update_date             string, 
bigdata_inner_utime     string,                      
bigdata_inner_offset    bigint,
enter_state_time        string, 
quit_state_time         string                                                        
) 
partitioned BY (
dt                      string,                                      
bigdata_inner_status    string  
) ROW format delimited FIELDS TERMINATED BY '\001' LINES TERMINATED BY '\n' stored AS textfile;

表二: 記錄事實表里發(fā)生變化的分區(qū)的表 zipper.ods_yc_car_fact_order_zip

drop table zipper.ods_yc_car_fact_order_zip_changed;
CREATE TABLE zipper.ods_yc_car_fact_order_zip_changed(
changed string comment '事實表里發(fā)生變化的分區(qū)' 
) 
partitioned BY (
dt string
) ROW format delimited FIELDS TERMINATED BY '\001' LINES TERMINATED BY '\n' stored AS textfile;```

步驟2:設(shè)置配置文件參數(shù)

{
    "appName":"ods_yc_car_fact_order_zip",
    "coalesce": 5,
    "source":{
        "primaryColumn":"order_id",
        "schemaName":"ods",
        "tableName":"ods_yc_car_fact_order",
        "partitionVal":""
    },
    "factTarget":{
        "primaryColumn": "order_id",
        "schemaName": "zipper",
        "tableName": "ods_yc_car_fact_order_zip"
    },
    "zipPolicy":{
        "defaultZipperLastValue":"2999-12-31",
        "enterStateColumn":"enter_state_time",
        "quitStateColumn":"quit_state_time",
        "sourceTableUpdateTimeColumn":"bigdata_inner_utime",
        "zipBaseColumnList":["status"],
        "partitionValPolicy":{
            "columnName":"create_date",
            "start":0,
            "end":10
        },
        "mappingColumnList":[{
            "sourceColumn":"",
            "targetColumn":""
        }],
        "orderByColumnList":[{
            "name":"bigdata_inner_utime",
            "type":"desc"
        },{
            "name":"bigdata_inner_offset",
            "type":"desc"
        }]
    }
}

3.3 事實表拉鏈回滾

--rollback-schema-name ${庫名}

--rollback-table-name ${表名}

--rollback-to ${要回滾到的對應(yīng)的分區(qū)值} , 默認(rèn)值是前一天

示例:

if [ $# == 1 ]; then
 rollbackTo=$1
else
 rollbackTo=$(date -d"2 day ago" +%Y-%m-%d)
fi
echo "接收到參數(shù):rollbackTo="$rollbackTo
?
spark-submit  --class com.sqyc.bigdata.etl.zip.rollback.fact.FactZipRollbackMain \
 --master local                \
../platform-util-zip-1.0-SNAPSHOT-jar-with-dependencies.jar --rollback-schema-name zipper --rollback-table-name ods_yc_car_fact_order_zip --rollback-to $rollbackTo</pre>
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末露泊,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子旅择,更是在濱河造成了極大的恐慌惭笑,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,386評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件生真,死亡現(xiàn)場離奇詭異沉噩,居然都是意外死亡,警方通過查閱死者的電腦和手機柱蟀,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,142評論 3 394
  • 文/潘曉璐 我一進店門川蒙,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人长已,你說我怎么就攤上這事畜眨。” “怎么了术瓮?”我有些...
    開封第一講書人閱讀 164,704評論 0 353
  • 文/不壞的土叔 我叫張陵康聂,是天一觀的道長。 經(jīng)常有香客問我胞四,道長恬汁,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,702評論 1 294
  • 正文 為了忘掉前任辜伟,我火速辦了婚禮氓侧,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘游昼。我一直安慰自己甘苍,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,716評論 6 392
  • 文/花漫 我一把揭開白布烘豌。 她就那樣靜靜地躺著,像睡著了一般看彼。 火紅的嫁衣襯著肌膚如雪廊佩。 梳的紋絲不亂的頭發(fā)上囚聚,一...
    開封第一講書人閱讀 51,573評論 1 305
  • 那天,我揣著相機與錄音标锄,去河邊找鬼顽铸。 笑死,一個胖子當(dāng)著我的面吹牛料皇,可吹牛的內(nèi)容都是我干的谓松。 我是一名探鬼主播,決...
    沈念sama閱讀 40,314評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼践剂,長吁一口氣:“原來是場噩夢啊……” “哼鬼譬!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起逊脯,我...
    開封第一講書人閱讀 39,230評論 0 276
  • 序言:老撾萬榮一對情侶失蹤优质,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后军洼,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體巩螃,經(jīng)...
    沈念sama閱讀 45,680評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,873評論 3 336
  • 正文 我和宋清朗相戀三年匕争,在試婚紗的時候發(fā)現(xiàn)自己被綠了避乏。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,991評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡甘桑,死狀恐怖淑际,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情扇住,我是刑警寧澤春缕,帶...
    沈念sama閱讀 35,706評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站艘蹋,受9級特大地震影響锄贼,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜女阀,卻給世界環(huán)境...
    茶點故事閱讀 41,329評論 3 330
  • 文/蒙蒙 一宅荤、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧浸策,春花似錦冯键、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,910評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春改化,著一層夾襖步出監(jiān)牢的瞬間掩蛤,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,038評論 1 270
  • 我被黑心中介騙來泰國打工陈肛, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留揍鸟,地道東北人。 一個月前我還...
    沈念sama閱讀 48,158評論 3 370
  • 正文 我出身青樓句旱,卻偏偏與公主長得像阳藻,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子谈撒,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,941評論 2 355