一、整體架構
從下至上依次分為數據采集層、數據計算層、數據服務層、數據應用層
數據采集層:以DataX為代表的數據同步工具和同步中心
數據計算層:以MaxComputer為代表的離線數據存儲和計算平台
數據服務層:以RDS為代表的數據庫服務(接口或者視圖形式的數據服務)
數據應用層:包含流量分析平台等數據應用工具
二、數據采集(離線數據同步)
數據采集主要分為日志采集和數據庫采集。日志采集暫略(參考書籍原文)。我們主要運用的是數據庫采集(數據庫同步)。
通常情況下,我們需要規定原業務系統表增加兩個字段:創建時間、更新時間(或者至少一個字段:更新時間)
數據同步主要可以分為三大類:直連同步、數據文件同步、數據庫日志解析同步
1.直連同步
通過規范好的接口和動態連接庫的方式直接連接業務庫,例如通過ODBC/JDBC進行直連
當然直接連接業務庫的話會對業務庫產生較大壓力,如果有主備策略可以從備庫進行抽取,此方式不適合直接從業務庫到數倉的情景
2.數據文件同步
從源系統生成數據文本文件,利用FTP等傳輸方式傳輸至目標系統,完成數據的同步
為了防止丟包等情況,一般會附加一個校驗文件 ,校驗文件包含數據量、文件大小等信息
為了安全起見還可以加密壓縮傳輸,到目標庫再解壓解密,提高安全性
3.數據庫日志同步
主流數據庫都支持日志文件進行數據恢復(日志信息豐富,格式穩定),例如Oracle的歸檔日志
(數據庫相關日志介紹,參考:https://www.cnblogs.com/jiangbei/p/9366805.html)
4.阿里數據倉庫同步方式
1)批量數據同步
要實現各種各樣數據源與數倉的數據同步,需要實現數據的統一,統一的方式是將所有數據類型都轉化為中間狀態,也就是字符串類型。以此來實現數據格式的統一。
產品——阿里DataX:多方向高自由度異構數據交換服務產品,產品解決的主要問題:實現跨平台的、跨數據庫、不同系統之間的數據同步及交互。
產品簡介:https://yq.aliyun.com/articles/59373
開源地址:https://github.com/alibaba/DataX
更多的介紹將會通過新開隨筆進行介紹!(當然還有其他主流的數據同步工具例如kettle等!)
2)實時數據同步
實時數據同步強調的是實時性,基本原理是通過數據庫的日志(MySQL的bin-log,Oracle的歸檔日志等)實現數據的增量同步傳輸。
產品——阿里TimeTunnel(簡稱TT)。TT產品本質是一個生產者、消費者模型的消息中間件
3)常見問題
1.增量數據與全量數據的合並
主要的場景是數據同步中周期全量同步,對應的解決方案是每次只同步變更的數據,然后和上一周期合並,形成最新的全量數據(選擇此方案的原因是絕大多數大數據平台不支持update操作)
具體的方案主要有union的聯合操作(可以通過生成增量中間表detal)與阿里主推的全外連接full outer join+全量覆蓋insert overwrite的形式。實例參考如下:

SQL的Join語法有很多, inner join(等值連接) 只返回兩個表中聯結字段相等的行, left join(左聯接) 返回包括左表中的所有記錄和右表中聯結字段相等的記錄, right join(右聯接) 返回包括右表中的所有記錄和左表中聯結字段相等的記錄, 假設我們有兩張表。Table A 是左邊的表。Table B 是右邊的表。其各有四條記錄,其中有兩條記錄name是相同的,如下所示: A表 id name 1 Pirate 2 Monkey 3 Ninja 4 Spaghetti B表 id name 1 Rutabaga 2 Pirate 3 Darth Vade 4 Ninja 讓我們看看不同JOIN的不同。 FULL [OUTER] JOIN (1) SELECT * FROM TableA FULL OUTER JOIN TableB ON TableA.name = TableB.name TableA.name = TableB.name 的情況,A和B的交集有兩條數據,那么 FULL OUTER JOIN的結果集, 應該是2+2+2=6條,即上面的交集,再加剩下的四條數據,沒有匹配,以null補全。 結果集 (TableA.) (TableB.) id name id name 1 Pirate 2 Pirate 2 Monkey null null 3 Ninja 4 Ninja 4 Spaghetti null null null null 1 Rutabaga null null 3 Darth Vade Full outer join 產生A和B的並集。但是需要注意的是,對於沒有匹配的記錄,則會以null做為值。 可以使用IFNULL判斷。 (2) SELECT * FROM TableA FULL OUTER JOIN TableB ON TableA.name = TableB.name WHERE TableA.id IS null OR TableB.id IS null 添加這個 where 條件,可以排除掉兩表的數據交集。 結果集 (TableA.) (TableB.) id name id name 2 Monkey null null 4 Spaghetti null null null null 1 Rutabaga null null 3 Darth Vade 產生A表和B表沒有交集的數據集。 UNION 與 UNION ALL UNION 操作符用於合並兩個或多個 SELECT 語句的結果集。 請注意,UNION 內部的 SELECT 語句必須擁有相同數量的列。列也必須擁有相似的數據類型。同時,每條 SELECT 語句中的列的順序必須相同。UNION 只選取記錄,而UNION ALL會列出所有記錄。 (1)SELECT name FROM TableA UNION SELECT name FROM TableB 新結果集 name Pirate Monkey Ninja Spaghetti Rutabaga Darth Vade 選取不同值。 (2)SELECT name FROM TableA UNION ALL SELECT name FROM TableB 新結果集 name Pirate Monkey Ninja Spaghetti Rutabaga Pirate Darth Vade Ninja 全部列出來。
這里簡要給出中間增量表detal表的SQL腳本:

insert overwrite table dwd_tb_delta partition (fq_day='${bizday}') select t.vhc_no as vhc_no,--號牌號碼 t.passbook_id as passbook_id,--通行證編號 t.vhc_type_no as vhc_type_no,--車輛類型 from( select t0.vhc_no as vhc_no,--號牌號碼 t0.passbook_id as passbook_id,--通行證編號 t0.vhc_type_no as vhc_type_no,--車輛類型 row_number() over (partition by t0.vhc_no order by t0.gmt_invalid desc) as rn from ods_vhc_passbook_info_tfcvideo_jj t0 where fq_day='${bizday}' ) t r(t.date_type_no) = t2.lyxtdm where t.rn = 1 --取最新的數據 ; ---------- insert overwrite table dwd_tb_dd partition (fq_day='${bizday}') select p.vhc_no, --號牌號碼 p.passbook_id, --通行證編號 p.vhc_type_no, --車輛類型 from( select *, row_number() over (partition by t.vhc_no order by t.gmt_invalid desc) as rn from ( select * from dwd_wp_jj_zdcltxzxx_delta where fq_day='${bizday}' union all select * from dwd_wp_jj_zdcltxzxx_dd where fq_day='${bizday-1}' ) t ) p where p.rn = 1 ;
//阿里方案待研究。
三、實時技術
實時技術主要分為:數據采集->數據處理->數據存儲->數據服務
流式技術架構圖如下圖所示:
1.數據采集
實時數據的處理需要實時的采集,采集源一般來自數據庫變更日志、引擎訪問日志等
實時采集不是一條一條采集,而是根據一些限制條件,一般是數據大小限制(如滿512KB采集)、時間閾值限制(如30秒采集)
采集的數據需要一個數據交換平台(中間件)分發給下游,一般選擇kafka等
2.數據處理
從消息中間件中出來的數據,分發給下游的流數據處理平台。一般有strom、spark streaming以及新興的flink
阿里內部使用的是stream compute
3.數據存儲
存儲數據庫主要分為關系型數據庫、列數據庫、文檔數據庫等
實時的存儲需要支持高並發的讀寫,根據hbase的優勢

1 列的可以動態增加,並且列為空就不存儲數據,節省存儲空間. 2 Hbase自動切分數據,使得數據存儲自動具有水平scalability. 3 Hbase可以提供高並發讀寫操作的支持
一般選擇hbase、mongonDB等
4.數據服務
數據服務例如oneService等,后續詳細介紹
數據模型分層,基本和離線數據一致,分為五層:ODS DWD DWS ADS MID