數據倉庫分層


數據倉庫分層

1、介紹

數據倉庫更多代表的是一種對數據的管理和使用的方式,它是一整套包括了etl、調度、建模在內的完整的理論體系。現在所謂的大數據更多的是一種數據量級的增大和工具的上的更新。 兩者並無沖突,相反,而是一種更好的結合。數據倉庫在構建過程中通常都需要進行分層處理。業務不同,分層的技術處理手段也不同。

2、為什么要分層

分層的主要原因是在管理數據的時候,能對數據有一個更加清晰的掌控,詳細來講,主要有下面幾個原因:

  • 清晰數據結構

    每一個數據分層都有它的作用域,這樣我們在使用表的時候能更方便地定位和理解。

  • 數據血緣追蹤

    簡單來說,我們最終給業務呈現的是一個能直接使用業務表,但是它的來源有很多,如果有一張來源表出問題了,我們希望能夠快速准確地定位到問題,並清楚它的危害范圍。

  • 減少重復開發

    規范數據分層,開發一些通用的中間層數據,能夠減少極大的重復計算。

  • 把復雜問題簡單化

    將一個復雜的任務分解成多個步驟來完成,每一層只處理單一的步驟,比較簡單和容易理解。而且便於維護數據的准確性,當數據出現問題之后,可以不用修復所有的數據,只需要從有問題的步驟開始修復。

  • 屏蔽原始數據的異常

  • 屏蔽業務的影響,不必改一次業務就需要重新接入數據

3、怎樣分層

理論上數據分為三個層,數據運營層、數據倉庫層和數據產品層。

  • ODS

    Operate data store,操作數據存儲,是最接近數據源中數據的一層,數據源中的數據,經過抽取、洗凈、傳輸,也就說傳說中的ETL之后,裝入本層。本層的數據,總體上大多是按照源頭業務系統的分類方式而分類的。

    例如這一層可能包含的數據表為:人口表(包含每個人的身份證號、姓名、住址等)、機場登機記錄(包含乘機人身份證號、航班號、乘機日期、起飛城市等)、銀聯的刷卡信息表(包含銀行卡號、刷卡地點、刷卡時間、刷卡金額等)、銀行賬戶表(包含銀行卡號、持卡人身份證號等)等等一系列原始的業務數據。這里我們可以看到,這一層面的數據還具有鮮明的業務數據庫的特征,甚至還具有一定的關系數據庫中的數據范式的組織形式。

    但是,這一層面的數據卻不等同於原始數據。在源數據裝入這一層時,要進行諸如去噪(例如去掉明顯偏離正常水平的銀行刷卡信息)、去重(例如銀行賬戶信息、公安局人口信息中均含有人的姓名,但是只保留一份即可)、提臟(例如有的人的銀行卡被盜刷,在十分鍾內同時有兩筆分別在中國和日本的刷卡信息,這便是臟數據)、業務提取、單位統一、砍字段(例如用於支撐前端系統工作,但是在數據挖掘中不需要的字段)、業務判別等多項工作。

    ODS層數據的來源方式:

    • 業務庫

      經常會使用sqoop來抽取,比如我們每天定時抽取一次。在實時方面,可以考慮用canal監聽mysql的binlog,實時接入即可。

    • 埋點日志

      線上系統會打入各種日志,這些日志一般以文件的形式保存,我們可以選擇用flume定時抽取,也可以用用spark streaming或者storm來實時接入,當然,kafka也會是一個關鍵的角色。

    • 其它數據源

      這和具體的業務相關。

  • DW

    Data warehouse,數據倉庫層。在這里,從ODS層中獲得的數據按照主題建立各種數據模型。例如以研究人的旅游消費為主題的數據集中,便可以結合航空公司的登機出行信息,以及銀聯系統的刷卡記錄,進行結合分析,產生數據集。在這里,我們需要了解四個概念:維(dimension)、事實(Fact)、指標(Index)和粒度( Granularity)。

  • App

    該層主要是提供數據產品和數據分析使用的數據,一般會存放在es、mysql等系統中供線上系統使用,也可能會存在Hive或者Druid中供數據分析和數據挖掘使用。 比如我們經常說的報表數據,或者說那種大寬表,一般就放在這里。

4、Sqoop數據導入

4.1 常規導入

以追加方式導入數據,指定map並行度是1,字段分隔符為'001'。

sqoop import 
	--append 
	--connect $CONNECTURL 
	--username $ORACLENAME 
	--password $ORACLEPASSWORD 
	--target-dir $hdfsPath  
	--num-mappers 1 		#使用1個mapper
	--table $oralceTableName 
	--columns $columns 
	--fields-terminated-by '\001'

4.2 並行導入

如果指定--m為1的話,使用的是1個map進行導入,不能發揮集群的並行計算能力。可以通過增加數量達到同時啟動多個mapper個數實現並行導入的目的。

sqoop import 
	--append 
	--connect $CONNECTURL 
	--username $ORACLENAME 
	--password $ORACLEPASSWORD 
	--target-dir $hdfsPath  
	--num-mappers 4			#使用4個mapper
	--table $oralceTableName 
	--columns $columns 
	--fields-terminated-by '\001'
	--where "data_desc='2011-02-26'"

注意,並行導入時sqoop會先在主鍵字段上執行max和min的操作,將所有記錄切割成指定的份數,然后再按照每個切片的數據范圍進行同時導入。過程大致如下:

--查詢主鍵的極值
select max(id) as max, select min(id) as min from table [where 如果指定了where子句];
--按照極值確定各自的處理范圍
select * from table where 0 <= id < 250;
select * from table where 250 <= id < 500;
select * from table where 500 <= id < 750;
select * from table where 750 <= id < 1000;

如果數據庫沒有主鍵,則需要指定一個能夠切割的字段進行處理,並且該字段值具有比較明顯的切割線,即極值不能相等,否則無法進行切割。如下所示:

sqoop import 
	--append 
	--connect $CONNECTURL 
	--username $ORACLENAME 
	--password $ORACLEPASSWORD 
	--target-dir $hdfsPath  
	--num-mappers 4			#使用4個mapper
	--table $oralceTableName 
	--columns $columns 
	--fields-terminated-by '\001'
	--split-by clientip
	--where "data_desc='2011-02-26'" 

4.3 增量導入

增量導入有兩種方式,按照指定的值和時間戳。本質上就是按照字段類型是整型還是時間戳類型進行導入。只導入比指定的值還大的記錄數。增量導入使用於字段值是自增類型或是時間戳自增類型。

sqoop import 
	--append 
	--connect $CONNECTURL 
	--username $ORACLENAME 
	--password $ORACLEPASSWORD 
	--target-dir $hdfsPath  
	--num-mappers 4			#使用4個mapper
	--table $oralceTableName 
	--columns $columns 
	--fields-terminated-by '\001'
	--incremental append	#增量數據
	--check-column num_iid 	#檢查列
	--last-value 0			#最后的值

按時間戳導入:

sqoop import 
	--append 
	--connect $CONNECTURL 
	--username $ORACLENAME 
	--password $ORACLEPASSWORD 
	--target-dir $hdfsPath  
	--num-mappers 4			#使用4個mapper
	--table $oralceTableName 
	--columns $columns 
	--fields-terminated-by '\001'
	--incremental lastmodified 	#
	--check-column created 		#
	--last-value '2012-02-01 11:0:00' 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM