工作中遇到了这个工作,就是将hive中的数据同步到hbase中,然后java通过hbase相关的API来访问hbase中的数据。
关于hadoop,hive,hbase这三个技术栈我写了两篇博客简单的分享了我对这三个技术栈的一些看法,在我目前的认知里,hadoop提供hdfs这个组件来存储大数据量的数据(相比于mysql,oracle这些关系型数据库),然后提供了MapReduce这个组件来对这些数据进行操作,通过yarn这个组件来调度这些操作数据的动作。
但是MapReduce操作数据的命令比较复杂,学习成本较高,这时候hive就可以解决这个问题了,hive是基于hadoop的,通过类sql(HQL)的方式就可以操作这些hdfs中的数据了,这对于经常使用msyql,oracle的人来说,这了解起来就相对容易了。
通过hive sql的方式处理hadoop中的数据速度不是很快,不能满足业务上的需求,至于通过MapReduce的方式来操作数据有多快,这个我没有了解过,不清楚。这时候hbase就解决了这个问题,hbase是一个K-V格式的数据库,处理数据的速度较快,目前业务上也是通过查询hbase。
以上就是我对这三者的一些粗浅理解,今天要介绍的就是如何将hive中的数据同步到hbase中,既然想通过hbase来处理数据,那么hbase中的数据势必要从hive中拿过来,我今天介绍的就是通过外部表的方式将hive中的数据同步到hbase中。
既然提到了外部表,那就会有内部表的概念,其实这两种方式都是hive表和hbase表的一个映射,通过内部表的方式,如果删除了hive表,那对应的hbase表也会删除;外部表的方式就是在删除hive表的时候不会删除对应的hbase表。
好了,想介绍的都说完了,我下面的操作都是基于自己电脑上的虚拟机,不是集群的操作,虚拟机上启动habse,hadoop,和hive。
通过外部表的方式,首先在hbase中要先存在一张表
我这里已经建好了这各表,namespace(命名空间)是test,表名是gdp,有三个列,c1,c2,c3。具体的hbase shell里创建表的命令可以自行搜一下,后面我可能也会写一遍来介绍hbase shell命令,hive sql,和操作hdfs的命令。
在habse里创建好表之后,就可以去hive中创建对应的映射表了
hive中我也都创建好了表,其中t_gdp是原始数据表,tmp_gdp_table是和hbase中gdp表关联的外部表,我这里因为只是一个简单的示范,只是将t_gdp表中的数据insert到了tmp_gdp_table表中,正常的业务中,可能是查询了多个表,通过sql处理将数据存到tmp_gdp_table中,然后通过外部表映射的方式同步到habse的gdp表中。
下面是hive中创建外部关联表的命令:
CREATE EXTERNAL TABLE tmp_gdp_table(key varchar(100), province varchar(100),city varchar(100),gdp double) STORED BY 'org.apache.hadoop.hive.hbase.HBaseStorageHandler' WITH SERDEPROPERTIES ("hbase.columns.mapping" = ":key,c1:province,c2:city,c3:gdp") TBLPROPERTIES ("hbase.table.name" = "test:gdp", "hbase.mapred.output.outputtable" = "test:gdp");
创建好关联表之后,将t_gdp中的数据insert到tmp_gdp_table表中:
insert into tmp_gdp_table (select f_year,f_province,f_city,f_gdp from t_gdp);
在实际的业务开发中一般是通过定时任务执行脚本的方式来执行上面的sql:
脚本命令如下:
#!/bin/bash hive -e 'insert into tmp_gdp_table (select f_year,f_province,f_city,f_gdp from t_gdp);'
通过执行脚本,在实际业务开发中就可以通过linux里的crontab或者公司自己的调度平台来执行了。
下面看一下对应表中的数据:
原始数据表t_gdp中的数据:
再看一下hive中的关联表tmp_gdp_table中的数据:
最后看一下hbase中的表test:gdp中的数据:
可以看到已经将hive中的数据同步到了habse中,再往下就可以通过java来访问hbase中的这张表了,就可以向处理mysql中的数据一样来执行对应的业务逻辑了。