Oracle資料遷移至HBase操作記錄

2021-12-30 01:02:24 字數 2292 閱讀 5466

近期需要把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...