Relational Cache是EMR Spark支持的一個重要特性,主要經過對數據進行預組織和預計算加速數據分析,提供了相似傳統數據倉庫物化視圖的功能。除了用於提高數據處理速度,Relational Cache還能夠應用於其餘不少場景,本文主要介紹如何使用Relational Cache跨集羣同步數據表。
經過統一的Data Lake管理全部數據是許多公司追求的目標,可是在現實中,因爲多個數據中心,不一樣網絡Region,甚至不一樣部門的存在,不可避免的會存在多個不一樣的大數據集羣,不一樣集羣的數據同步需求廣泛存在,此外,集羣遷移,搬站涉及到的新老數據同步也是一個常見的問題。數據同步的工做一般是一個比較痛苦的過程,遷移工具的開發,增量數據處理,讀寫的同步,後續的數據比對等等,須要不少的定製開發和人工介入。基於Relational Cache,用戶能夠簡化這部分的工做,以較小的代價實現跨集羣的數據同步。
下面咱們以具體示例展現如何經過EMR Spark Relational Cache實現跨集羣的數據同步。網絡
假設咱們有A,B兩個集羣,須要把activity_log表的數據從集羣A同步到集羣B中,且在整個過程當中,會持續有新的數據插入到activity_log表中,A集羣中activity_log的建表語句以下:工具
CREATE TABLE activity_log ( user_id STRING, act_type STRING, module_id INT, d_year INT) USING JSON PARTITIONED BY (d_year)
插入兩條信息表明歷史信息:大數據
INSERT INTO TABLE activity_log PARTITION (d_year = 2017) VALUES("user_001", "NOTIFICATION", 10), ("user_101", "SCAN", 2)
爲activity_log表建一個Relational Cache:spa
CACHE TABLE activity_log_sync REFRESH ON COMMIT DISABLE REWRITE USING JSON PARTITIONED BY (d_year) LOCATION "hdfs://192.168.1.36:9000/user/hive/data/activity_log" AS SELECT user_id, act_type, module_id, d_year FROM activity_log
REFRESH ON COMMIT表示當源表數據發生更新時,自動更新cache數據。經過LOCATION能夠指定cache的數據的存儲地址,咱們把cache的地址指向B集羣的HDFS從而實現數據從集羣A到集羣B的同步。此外Cache的字段和Partition信息均與源表保持一致。code
在集羣B中,咱們也建立一個activity_log表,建立語句以下:blog
CREATE TABLE activity_log ( user_id STRING, act_type STRING, module_id INT, d_year INT) USING JSON PARTITIONED BY (d_year) LOCATION "hdfs:///user/hive/data/activity_log"
執行MSCK REPAIR TABLE activity_log自動修復相關meta信息,而後執行查詢語句,能夠看到在集羣B中,已經可以查到以前集羣A的表中插入的兩條數據。開發
在集羣A中繼續插入新的數據:get
INSERT INTO TABLE activity_log PARTITION (d_year = 2018) VALUES("user_011", "SUBCRIBE", 24);
而後在集羣B中執行MSCK REPAIR TABLE activity_log並再次查詢activity_log表,能夠發現數據已經自動同步到集羣B的activity_log表中,對於分區表,當有新的分區數據加入時,Relational Cache能夠增量的同步新的分區數據,而不是從新同步所有數據。同步
若是集羣A中activity_log的新增數據不是經過Spark插入的,而是經過Hive或其餘方式外部導入到Hive表中,用戶能夠經過REFRESH TABLE activity_log_sync語句手工或經過腳本觸發同步數據,若是新增數據是按照分區批量導入,還能夠經過相似REFRESH TABLE activity_log_sync WITH TABLE activity_log PARTITION (d_year=2018)語句增量同步分區數據。數據分析
Relational Cache能夠保證集羣A和集羣B中activity_log表的數據一致性,依賴activity_log表的下游任務或應用能夠隨時切換到集羣B,同時用戶也能夠隨時將寫入數據到集羣A中activity_log表的應用或服務暫停,指向集羣B中的activity_log表並重啓服務,從而完成上層應用或服務的遷移。完成後清理集羣A中的activity_log和activity_log_sync便可。
本文介紹瞭如何經過Relational Cache在不一樣大數據集羣的數據表之間同步數據,很是簡單便捷。除此以外,Relational Cache也能夠應用到不少其餘的場景中,好比構建秒級響應的OLAP平臺,交互式的BI,Dashboard應用,加速ETL過程等等,以後咱們也會和你們分享在更多場景中Relational Cache的最佳實踐。
原文連接 本文爲雲棲社區原創內容,未經容許不得轉載。