近期需要把oracle資料庫中的十幾張表t級別的資料遷移至hbase中,過程中遇到了許多苦難和疑惑,在此記錄一下希望能幫到一些有同樣需求的兄弟。
首先,是根據oracle的資料規劃hbase的表和表結構。
從業務上看,十幾張表大概可以分為兩大部分:
剛開始的計畫是將所有表都匯入hbase中的一張大表,但是思索討論之後發現是行不通的:
1、由於各個表之間的業務關係複雜,無法設定乙個理想的rowkey。
2、各個表的資料量也是相差萬別的,都放入一張大表中會造成列簇的資料傾斜問題。
3、建立hbase表的目的理論上和建立關係型資料庫的目的是一致的,想想為什麼oracle中為什麼要分為十幾張表而不是一張就明白了,方便業務邏輯。
接下來的思路就是根據業務邏輯劃分出來的兩大部分,建立兩張hbase表。
由於系統業務和建表邏輯是另外一組的人負責的,交給我們的文件就是一堆sql檔案,隔壁的大神根據這堆sql檔案整理除了表的關聯關係,為建hbase表提供了基礎依據,功不可沒:-)
那麼接下來的事情就是為兩張表設計rowkey和列簇了。
關於rowkey和列簇的設計原則可以參考:
根據業務邏輯和表字段資訊,發現交易和客戶資訊都是以手機號碼為中心的,rowkey可以使用手機號碼來實現,為了避免資料熱點的問題,決定將手機號碼反轉之後的值作為rowkey。
關於列簇的敲定,由於hbase列簇最好是控制在1-2個,超過3個可能會有效能問題,所以我們根據業務邏輯,分別對屬於交易和客戶資訊兩大類下的各個表再次進行劃分。
第一次劃分出兩大類是為了建hbase表,這次的劃分是為了建立表中的列簇。
例如:交易這一大部分的6個表中,有4個是經常一起做連線查詢的,而另外2個表則是另一組業務邏輯經常使用的 ,那麼就hbase中的交易表就可以分為兩個列簇:交易業務,個人操作,分別儲存著原本oracle中4個表和2個表的資料。
客戶資訊表中列簇的設計同理,根據表之間的關聯程度劃分出三個列簇,大致可以稱為:基本屬性,行為屬性,簽署協議。
敲定了hbase的表結構之後,建表就是分分鐘的事情了。
現在我們在hbase中有兩張表,結構如下。
交易表:
rowkey
交易業務列簇
個人操作列簇
手機號碼反轉
4張oracle表資料
2張oracle表資料
客戶表:
rowkey
基本屬性
行為屬性
簽署協議
手機號碼反轉
4張oracle表資料
2張oracle表資料
3張orale表資料
使用sqoop進行資料遷移工作,詳細操作說明見:sqoop操作實踐
但是開始遷移操作的時候發現兩個問題:
對於第乙個問題,我們採取的解決方案是:直接將20億的個人操作列簇單獨拆分為一張hbase表。
理由:避免hbase表中資料稀疏、傾斜造成效能問題,而個人操作列簇從業務和資料量上看完成可以單獨作為一張表使用。
對於第二個問題,採取的方案是:先將這四張表分別匯入為四張hbase臨時表,之後使用mr程式修改時間戳統一匯入最終的交易表。
理由:使用臨時表第一是為了避免資料損壞,第二是方便mr程式修改時間戳屬性。
而對於客戶表,業務邏輯比較簡單,可以直接使用sqoop進行匯入。
建立hbase始終是要在業務邏輯之上的,沒有分析業務根本沒辦法知道hbase該分為幾個表,每個表有幾個列簇,每個列簇分別儲存哪些資料,以及rowkey的定義。
關於交易表的的資料版本問題,因為業務是根據手機號碼和某個月份來查詢的,平均每個月每個使用者會查5次,那麼之前的rowkey設計就是不合理的:
之前的rowkey是手機號碼反轉,其中一列為時間戳字段,那麼每次有新的交易資料進來就會發生覆蓋,之前我們一直在想設定值的版本為多少個比較好,12*5=60,也就是說每個列的值要設定為60個版本,這是極其不合理的。
現在,解決的思路是,既然是根據時間戳和手機號碼來取資料的,因為每次資料入庫的時候相同使用者的交易資料會被新資料覆蓋,那麼把時間戳和手機號的組合設定為rowkey就完全可以解決這個問題。
那麼這個rowkey的格式就是手機號碼反轉+時間戳,理由如下:
另註:hbase統計資料量大的表可以使用其自帶的乙個mr程式:$hbase_home/bin/hbase org.apache.hadoop.hbase.mapreduce.rowcounter tablename
從傳統資料庫到hbase,表設計的思路與步驟大概如下:
oracle表中如果沒有合適的字段來給–split-by引數的話,可以用rownum這個預設的字段。
--split-by rownum
其餘遇到的困惑會再進行後續更新。
Oracle資料遷移至HBase操作記錄
hbase 近期需要把oracle資料庫中的十幾張表t級別的資料遷移至hbase中,過程中遇到了許多苦難和疑惑,在此記錄一下希望能幫到一些有同樣需求的兄弟。首先,是根據oracle的資料規劃hbase的表和表結構。從業務上看,十幾張表大概可以分為兩大部分 剛開始的計畫是將所有表都匯入hbase中的一...
mysql資料遷移至oracle中的幾個問題(2)
在遷移資料的過程中,發現報長度錯誤。經排查原來有個字段在mysql中設定為text長文字型別,而在oracle設定的varchar2,長度設定的2000。這時候出現了長度不夠的情況,重新設定varchar2長度為4000。長度還是不夠,可是varchar2最大長度就是4000,怎麼辦呢,使用clob...
HBase資料遷移至Hive
背景 需要將hbase中表xyz 列簇cf1,列val 遷移至hive 1.建立hive和hbase的對映關係 1.1 執行hive shell進入hive命令列模式,執行如下指令碼 create external table hbase table 1 key int,value string s...