引言
HBase作为Apache软件基金会的一个顶级项目,目前在业界有着广泛的使用。HBase是Google BigTable的开源实现,运行在HDFS文件系统之上,为Hadoop提供类似于BigTable的分布式数据存放服务。在Eric Brewer的CAP理论中,HBase属于CP类型的系统,即保证了系统的一致性和对分区容忍性,具体可以自行google CAP理论。
最近在做一个大数据项目,需要将原本oracle数据库中的数据导入到HBase中,所以做了一个简单的HBase数据导入总结。目前我已知的并且实验可行的方法有一下几种:
1. JDBC & HBase Client API
2. MapReduce Job/TableReducer
3. Importtsv(unbulk load)
4. bulk load(importtsv | MapReduce Job)
5. Sqoop
先简要介绍下每种方法:
方法1:最基本的数据导入方法。首先通过JDBC将原本关系型数据库中的数据读出到内存中,然后在使用HBase自带的客户端API将数据put到相应的表中。这种方法通用性强,只要写好接口就可以用,但是效率并不高。
方法2:使用这种方法之前其实是需要先将数据导出到本地,以文本的形式保存,然后使用TableReudcer类编写MapReduce job。这种方法需要频繁的I/O操作,所以效率不高,容易导致HBase节点的不稳定。
方法3:importtsv是HBase内置的数据导入工具,目的是将tsv格式的文件加载到HBase中,本质上它是通过调用MapReudce Job实现数据导入的。注意:使用该方法,需要提前将数据导出到本地,以tsv格式存储。unbulk load模式的importtsv效果一般,适用于小型的数据。
方法4:bulk load是一个快速大量数据高效导入工具,相比于importtsv效率更高。
方法5:Sqoop是apache软件基金会的一个项目,可以用来实现关系型数据库和hdfs,hbase,hive之间的数据高效传输。只需要做一些简单的配置,通过Sqoop命令行指令就可以方便的实现数据导入和导出。
下面具体介绍每种方法的做法:
JDBC & HBase Client API
此处以MySql为例。首先在MySql数据库中创建database ‘test’,然后创建一张表’Info’,这里可以使用可视化软件(例如workbench),也可以直接在命令行输入相应指令:
:~$mysql -u root -p #root用户登录mysql
#创建Info表
CREATE TABLE Info (`ID` INT NOT NULL,
`Name` VARCHAR(45) NOT NULL,
`Number` INT NOT NULL,
`Time` VARCHAR(45) NOT NULL,
PRIMARY KEY (`ID`));
然后使用load指令将准备好的数据导入到Info中。数据格式与Info各字