本文介绍了如何将数据从现有的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,监控数据压缩的进程。