MySql与HBase之间数据的互导(借助sqoop)
一.将mysql中的数据导入到hbase中,这一步相对来说是比较简单的
1.在mysql中建立一个teacher表,插入5组数据,我这里没有将表建立的太大,可以根据自身数据大小情况改变创建表的大小,表的结构如下图所示:
2.在进行下一步之前,一定要确认mysql的jdbc已经拷贝到sqoop的lib目录下,此处我使用的是 mysql-connector-java-5.0.8-bin.jar,同时需要拷贝hbase目录下的hbase-0.94.18.jar和hbase的lib目录下的zookeeper-3.4.5.jar到sqoop的lib目录下,以上jar包,只要是适合自己版本的就好。
3.转到sqoop的目录下,执行命令:
$bin/sqoop import --connect jdbc:mysql://slave03/sqoop --username sqoop --password sqoop --table teacher --hbase-table myteacherhbase --column-family info --hbase-create-table
上述命令行的含义:
$bin/sqoop import --connect jdbc:mysql://slave03(自己的机器名,可以是自己机器的ip地址)/sqoop(mysql中的database) --username 用户名 --password 密码 --table teacher(mysql中的table名字) --hbase-table myteacherhbase(导入到hbase中表的名字) --column-family info --hbase-create-table(使hbase自己创建表)
4.1执行上述命令之前hbase中表的状况:
4.2执行sqoop命令之后hbase里边表的状况:
5.至此,mysql数据库中的数据导入到hbase中成功。
二.将hbase中的数据导出到mysql数据库中。
因为之前在网上查找过很多的信息,了解到hbase中的数据不能够直接导出到mysql数据库中,所以只能借助一个中介实现这个目的,我了解到有以下两种方法可以实现这个功能:
(1)将hbase中的数据导出到HDFS平台上,然后导入到mysql(此方法本人还没有试,只是了解到网上有人说可以)
(2)将hbase中的数据导出到hive(中介),然后通过sqoop将hive中的数据导入到mysql数据库中。
接下来,我介绍第二种方法:
-
因为之前将mysql中的teacher表导入到了hbase,我就直接用hbase中的这个myteacherhbase表进行以下操作。
-
在mysql中新建立一个myteacher表,用来接收hbase导出的数据。
表结构如图:
-
在hive中创建连接hbase的外部表:
-
hive> create external table myteacher_external(key int,value string) > STORED BY 'org.apache.hadoop.hive.hbase.HBaseStorageHandler' > WITH SERDEPROPERTIES ("hbase.columns.mapping" = "info:name") > TBLPROPERTIES("hbase.table.name" = "myteacherhbase");
这里我直接在创建外部表的时候指定了primary key,将id设为primary key.如图:
可以查询到hbase中的数据,创建连接hbase外部表成功。
5. 在hive中新建一个内部表,将hive的external外部表数据导入到内部表。
hive>create table myteacher_inner(id int,name string);
建好之后,通过以下命令,执行将hbase中的数据导出到hive中:
hive> insert overwrite table myteacher_inner select * from myteacher_external;
如下图:
相应的内部表中有了数据,说明hbase导出到hive中成功了。
6. 接下来,就是利用sqoop将hive中的数据导入到mysql中了,转到sqoop目录下,执行以下命令:
bin/sqoop export --connect jdbc:mysql://本机ip/sqoop --username sqoop --password sqoop -m 1 --table myteacher --export-dir hdfs://slave03:9000/home/hadoop/hive/warehouse/myteacher_inner --input-null-string "\\\\N" --input-null-non-string "\\\\N" --input-fields-terminated-by "\\01" --input-lines-terminated-by "\\n"
说明:ip地址之后的sqoop是mysql的database,之后依次是用户名,密码,m 1 是进行一次map,table myteacher是之前建立的接收hbase数据的空表,后边的--export-dir是本机的hive之中表的HDFS地址。至于这地址之后的,是处理防止导入到mysql之中时,出现NULL的现象,导致原因是因为hive里存储的数据和数据之间的间隔与mysql中存储的数据和数据间隔不一致。所以需要处理一下。使mysql可以识别。
sqoop执行命令成功。
7. 在mysql查看myteacher中的数据。
查询成功。导入成功,操作完成啦!