本文介紹瞭如何將數據從現有的RDBMS遷移到Trafodion數據庫。從其它的RDBMS或外部數據源向Trafodion集羣中導入大量的重要數據,能夠經過下面兩步完美實現:java
在Trafodion集羣中,將數據從源頭導入Hive表。使用下列方法之一:shell
使用Apache SqoopTM工具,在關係型數據庫和Apache Hadoop生態系統之間實現高效的海量數據傳輸。數據庫
默認狀況下,Sqoop並不是安裝在Trafodion集羣中。能夠經過Ambari或Cloudera Manager GUI,在Trafodion集羣中安裝並啓動Sqoop。更多信息,請參閱Scoop用戶指南。oracle
在Trafodion集羣中安裝JDK 1.8 and the Oracle JDBC 驅動,僅用於將數據從RDBMS導入Hive表。請設置如下環境變量:dom
export JAVA_HOME=/opt/java/jdk1.8.0_11 export JAVA_OPTIONS=-Dmapred.child.java.opts=\-Djava.security.egd=file:/dev/urandom+
如下是使用sqoop命令的幾個示例。關於可與sqoop一塊兒使用的更多選項,請參閱Scoop用戶指南。ide
sqoop list-tables –driver oracle.jdbc.OracleDriver –connect jdbc:oracle:thin:@:/ –username –password
sqoop import –connect jdbc:oracle:thin:@/ –username –password –table –split-by –hive-import –create-hive-table –hive-table –hive-overwrite –null-string 」 –null-non-string 」 –hive-drop-import-delims –verbose
參數 | 說明 |
---|---|
–split-by |
默認狀況下,若是未指定拆分列,sqoop會使用主鍵列做爲拆分列,但這在大多數時候並不是最優。此外,若是表未定義主鍵列,您必須手動指定拆分列。 |
–null-string |
表示字符串(string)列中的空值。 |
–null-non-string |
表示非字符串(string)列中的空值。 |
–hive-drop-import-delims |
導入Hive時,丟掉n、r和01字符串域。注意:若是數據包含n或r,而且您不使用–hive-drop-import-delims選項,那麼數據將會被清除。在數據遷移期間,能夠經過定義你想要使用的分隔符(不存在於數據中),使用額外的Sqoop選項。 |
Hive表必須從Hive接口(例如,Hive shell)中建立。在加載期間使用Hive的外部表會很是方便。你能夠將源數據文件複製到單個HDFS文件夾下,並建立一個指向該文件夾的Hive外部表,從而將數據輕鬆導入Hive表。函數
Hive表各列的數據類型必須與源數據一致。關於建立外部表的語法,請參閱Hive wiki。關於Hive表可用的數據類型,請參閱Hive語言手冊類型。工具
能夠經過Trafodion的整型、字符串型和字符型的列,訪問Hive表。若要填充外部表,請使用如下類型的Hadoop命令,將數據複製到HDFS文件夾下:oop
hadoop fs -copyFromLocal
使用包含SALT USING PARTITIONS子句(salting)的CREATE TABLE語句,新建Trafodion表。例如:性能
CREATE TABLE TRAFODION.SCH.DEMO ( demo_sk int not null, name varchar(100), primary key (demo_sk) ) SALT USING 8 PARTITIONS ON (demo_sk);
表中任何的索引均可能被鹽粒分佈(salted),也可能未被鹽粒分佈(salted)。若是被鹽粒分佈了,則鹽粒分佈的鍵和分區數必須與表一致。
CREATE INDEX demo_ix ON sch.demo(name) SALT LIKE TABLE;
必須根據訪問表的工做負載,選擇Trafodion表的主鍵。因爲HBase是鍵值(key-value)存儲,因此經過鍵來訪問Trafodion表很是有效率。當您知道一些語句在斷言(predicate)和鏈接(join)條件以外來訪問一張表,您能夠選擇一個主鍵,使頭鍵列有很高的選擇斷言。這會限制在HBase中須要被掃描的行數。若是斷言只出如今邊鍵列而非頭鍵列中,Trafodion使用MDAM來限制被掃描的行數。若是頭鍵列(沒有斷言出現)的惟一條目數(unique entry count)很低,MDAM能很好工做。
Trafodion表能被鹽粒分佈,以免熱污點(hot-spotting)。在一些工做負載下,有了排列分區數據,數據的某種鍵的排列會比另外一些排列有更多對錶的訪問量。這會致使某些HBase RegionServers處理大多數的加載,從而出現不平衡的使用行爲。
對於本機HBase表,每每能夠經過設計合適的鍵來處理。在Trafodion中,一旦您選擇了表的鍵(請參閱選擇一個主鍵),就可使用鹽粒分佈(salting)來均勻分佈數據。鹽粒分佈對salt鍵使用一個哈希函數,而且根據該哈希的值來將數據分佈到分區中。這個哈希的值被物理存儲在表中,做爲頭鍵值。表的每次拆分只會有一個salt鍵值。salting鍵能夠是主鍵的任意子集(包括主鍵自己)。
保持salting鍵儘量小,這是一個很好的實踐。這個鍵必須提供數據平均分配。當鍵值有很大的惟一條目數(unique entry count)並無嚴重傾斜的時候,可以實現數據的平均分配。在建立表的時候,必須指定分區數。分區數取決於集羣的大小和表的指望大小。
若是添加的數據量超出了本來的預期,則鹽粒分佈的表就能被拆分。這會致使有多個分區具備salt值相同的行,也可能產生基於該表的次優執行計劃。
您也能夠選擇不鹽粒分佈Trafodion表,這就與傳統RDBMS的range分區相似。分區數隨着表的增大而增多,而且range的邊界由HBase根據指定的拆分策略而肯定。
使用命令接口工具(例如,trafci),設置控制查詢默認(Control Query Defaults,CQD),從而提升加載性能:
cqd hive_max_string_length ‘1000’; // if the widest column is 1KB
若是目標的Trafodion表具備時間相關的列,則須要進行如下設置:
cqd allow_incompatible_assignment ‘on’;
使用LOAD語句,將數據從Hive加載到Trafodion表。例如:
LOAD WITH NO POPULATE INDEXES INTO trafodion.sch.demo SELECT * FROM hive.hive.demo;
關於LOAD語句的語法,請參閱《Trafodion SQL 參考手冊》.
若是屢次調用LOAD語句,向單個目標表逐漸加載數據集,則目標表的每一個分區會有多個HFile。這會致使SELECT查詢期間無效率的訪問,也可能致使數據壓縮(基於HBase設置中的配置策略)。爲了不這種狀況,能夠針對表(短時間內被兩個以上的LOAD語句所加載)執行一個大的數據壓縮。使用如下的HBase shell命令,執行這樣的壓縮:
major_compact ‘TRAFODION.SCH.DEMO’
這個命令不須要等待時間,而且會當即返回。一般,對一張大表執行數據壓縮會花費大量的時間(幾分鐘到幾小時不等)。您能夠經過HBase Master Web UI,監控數據壓縮的進程。