如何將其餘RDBMS的數據到遷移到Trafodion

本文介紹瞭如何將數據從現有的RDBMS遷移到Trafodion數據庫。從其它的RDBMS或外部數據源向Trafodion集羣中導入大量的重要數據,能夠經過下面兩步完美實現:java

  1. 在Trafodion集羣中,將數據從源頭導入Hive表。使用下列方法之一:shell

    • 在Trafodion系統中,使用一個相似Apache Sqoop的工具,將數據從遠程的RDBMS(例如,MySQL或Oracle)遷移到Hive表。更多信息,請參閱使用Sqoop將數據導入Hive
    • 在Trafodion集羣中,將須要導入Trafodion的數據複製到HDFS。使用Hive外部表,使這些數據能從Hive中看到。更多信息,請參閱建立Hive外部表
  2. 使用Trafodion的LOAD語句,將數據從Hive導入Trafodion表。更多信息,請參閱使用BulkLoad將數據加載到Trafodion表

使用Sqoop將數據導入Hive

使用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

列出全部Oracle表

sqoop list-tables –driver oracle.jdbc.OracleDriver –connect jdbc:oracle:thin:@:/ –username  –password

將數據導入Hive

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接口(例如,Hive shell)中建立。在加載期間使用Hive的外部表會很是方便。你能夠將源數據文件複製到單個HDFS文件夾下,並建立一個指向該文件夾的Hive外部表,從而將數據輕鬆導入Hive表。函數

Hive表各列的數據類型必須與源數據一致。關於建立外部表的語法,請參閱Hive wiki。關於Hive表可用的數據類型,請參閱Hive語言手冊類型。工具

能夠經過Trafodion的整型、字符串型和字符型的列,訪問Hive表。若要填充外部表,請使用如下類型的Hadoop命令,將數據複製到HDFS文件夾下:oop

hadoop fs -copyFromLocal

新建Trafodion表和索引

使用包含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能很好工做。

鹽粒分佈(Salting)一張表

Trafodion表能被鹽粒分佈,以免熱污點(hot-spotting)。在一些工做負載下,有了排列分區數據,數據的某種鍵的排列會比另外一些排列有更多對錶的訪問量。這會致使某些HBase RegionServers處理大多數的加載,從而出現不平衡的使用行爲。

對於本機HBase表,每每能夠經過設計合適的鍵來處理。在Trafodion中,一旦您選擇了表的鍵(請參閱選擇一個主鍵),就可使用鹽粒分佈(salting)來均勻分佈數據。鹽粒分佈對salt鍵使用一個哈希函數,而且根據該哈希的值來將數據分佈到分區中。這個哈希的值被物理存儲在表中,做爲頭鍵值。表的每次拆分只會有一個salt鍵值。salting鍵能夠是主鍵的任意子集(包括主鍵自己)。

保持salting鍵儘量小,這是一個很好的實踐。這個鍵必須提供數據平均分配。當鍵值有很大的惟一條目數(unique entry count)並無嚴重傾斜的時候,可以實現數據的平均分配。在建立表的時候,必須指定分區數。分區數取決於集羣的大小和表的指望大小。

若是添加的數據量超出了本來的預期,則鹽粒分佈的表就能被拆分。這會致使有多個分區具備salt值相同的行,也可能產生基於該表的次優執行計劃。

您也能夠選擇不鹽粒分佈Trafodion表,這就與傳統RDBMS的range分區相似。分區數隨着表的增大而增多,而且range的邊界由HBase根據指定的拆分策略而肯定。

使用Bulk Load將數據加載到Trafodion表(將數據從Hive加載到Trafodion)

使用命令接口工具(例如,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,監控數據壓縮的進程。

相關文章
相關標籤/搜索