作者:Syn良子 出处:http://www.cnblogs.com/cssdongl/p/6857891.html 转载请注明出处

简单的说就是可以通过Hive SQL直接对hbase的表进行读写操作,对了,这里可能有人会问,为啥要这么集成呢,有什么场景呢。那我举个场景栗子,比如我们可能会用Hbase做后台历史日志的存储和统计.

而进行离线日志的存储统计的时候,你当然可以选择用Hadoop MR或者Spark来进行统计和分析并存入相应的Hbase表结构,随后前台可以利用thrift等方式进行实时的查询,ok,这些都能满足需求.

那么时间长了以后,随着项目需求和数据种类以及临时需求的增多,写MR和Spark会不会很累?所以,当然想到可不可以直接通过Hive SQL来直接读写hbase,这就是一个很普通的需求.

废话不说,官网有现成的例子可以参考,很详细:https://cwiki.apache.org/confluence/display/Hive/HBaseIntegration

我整理和总结一下一些细节和遇到的问题

1.数据准备

在hive中创建个基础表并插入数据,注意下面红色路径的txt可以在hive的examples目录下找到

CREATE TABLE pokes (foo INT, bar STRING);
LOAD DATA LOCAL INPATH '/data/examples/files/kv1.txt' OVERWRITE INTO TABLE pokes;

2.Hive中创建Hbase表

这种情况就是在hive和hbase中同时创建新表然后建立hive和hbase的表映射关系,如果删除hive中的表,那么hbase的表也会消失,如下

CREATE TABLE hbase_table_1(key int, value string)
STORED BY 'org.apache.hadoop.hive.hbase.HBaseStorageHandler'
WITH SERDEPROPERTIES ("hbase.columns.mapping" = ":key,cf1:val")
TBLPROPERTIES ("hbase.table.name" = "xyz", "hbase.mapred.output.outputtable" = "xyz");
INSERT OVERWRITE TABLE hbase_table_1 SELECT * FROM pokes WHERE foo=98;

这里解释下,强调一下几点细节

1>(key int, value string) 和("hbase.columns.mapping" = ":key,cf1:val")以及最后insert后的select的字段,请确定顺序都保持一致

2>这个hive表和hbase建立的映射就是:hbase的rowkey和hive表的select的第一个字段foo对应,而cf1是列族,val是列名,相当于已经固定好了,select查出的第二个字段就是对应的列值

3>这里 TBLPROPERTIES 定义了hbase中的表名,如果没有这行,那么hbase默认表名就和hive表名一致

4>HbaseStorageHandler很重要,hive和hbase的集成需要将hive-hbase-handler-x.y.z.jar(x.y.z是当前环境的jar包版本)配置在Hive client auxpath路径下,也就是说,你必须在

hive-site.xml里面配置好hive.aux.jars.path,这个属性,而它的值是hive-hbase-handler-x.y.z.jar所在的路径.

3.Hive映射Hbase多列族多列

类似于第一种情况,只是映射了多列族多列而已,如下

CREATE TABLE hbase_table_1(key int, value1 string, value2 int, value3 int)
STORED BY 'org.apache.hadoop.hive.hbase.HBaseStorageHandler'
WITH SERDEPROPERTIES (
"hbase.columns.mapping" = ":key,a:b,a:c,d:e"
);
INSERT OVERWRITE TABLE hbase_table_1 SELECT foo, bar, foo+1, foo+2
FROM pokes WHERE foo=98 OR foo=100;

强调的细节和上面那个单列一致,只是多了几个列族和对应的列,这里的列族和列都是提前定义好的.

scan后结果如下

hbase(main):015:0> scan "hbase_table_1"
ROW COLUMN+CELL
100 column=a:b, timestamp=1267740457648, value=val_100
100 column=a:c, timestamp=1267740457648, value=101
100 column=d:e, timestamp=1267740457648, value=102
98 column=a:b, timestamp=1267740457648, value=val_98
98 column=a:c, timestamp=1267740457648, value=99
98 column=d:e, timestamp=1267740457648, value=100
2 row(s) in 0.0240 seconds

4.Hive访问已存在的hbase表

这种方式其实hive表是个外表,即使清空hive中的表数据,Hbase中的表不会受到影响.

CREATE EXTERNAL TABLE hbase_table_2(key int, value string)
STORED BY 'org.apache.hadoop.hive.hbase.HBaseStorageHandler'
WITH SERDEPROPERTIES ("hbase.columns.mapping" = "cf1:val")
TBLPROPERTIES("hbase.table.name" = "some_existing_table", "hbase.mapred.output.outputtable" = "some_existing_table");

5.Hive映射Hbase动态列

为啥要动态列?因为有的场景下,我需要存入hbase列族下的列名是动态的要存值的是需要查询出来的,不是写死的,如果没有动态映射岂不累死,对应建表和插入如下

CREATE TABLE hbase_table_1(value map<string,int>, row_key int)
STORED BY 'org.apache.hadoop.hive.hbase.HBaseStorageHandler'
WITH SERDEPROPERTIES (
"hbase.columns.mapping" = "cf:,:key"
);
INSERT OVERWRITE TABLE hbase_table_1 SELECT map(bar, foo), foo FROM pokes
WHERE foo=98 OR foo=100;

强调一下几个细节

1>注意这里表定义mapping的时候,只定义了一个列族名为cf,还有随后的rowkey

2>注意后面的SELECT的语句,map(bar,foo)中的bar映射的是列名,foo是列值,所以这里是动态的列插入,随后第2个select的列对应的row_key

3>使用hive map类型时,注意SELECT查出来的字段类型和 “CREATE TABLE hbase_table_1(value map<string,int>, row_key int)”中定义的字段类型需要一致,不然无法插入,详细解释的话,举个栗子

比如SELECT查出来的map(bar,foo)中列名和列值分别是varchar(50)和bigint类型的话,那么这个时候插入就会报异常然后插入失败

Cannot insert into target table because column number/types are different

那么怎么办?我想到二种方式,第一种就是你定义的时候就定义好类型映射保持一致,比如你可以索性将map中的key值在hive中都定义成string类型,另外一种是cast函数,再举个栗子,

比如SELECT查出来的map(bar,foo)中的bar是varchar(50),foo是bigint,而建立表的时候定义的map<varchar(200),bigint>,这样依然插入不进去,那么可以进行cast,比如cast(bar as varchar(200)),ok,这样可以解决问题.

参考资料:

https://cwiki.apache.org/confluence/display/Hive/HBaseIntegration

http://blog.cloudera.com/blog/2010/06/integrating-hive-and-hbase/

http://blog.csdn.net/xiaoshunzi111/article/details/51803719

http://blog.csdn.net/bdchome/article/details/45499641

HiveHbase集成实践的更多相关文章

  1. [独孤九剑]持续集成实践(二)– MSBuild语法入门

    本系列文章包含: [独孤九剑]持续集成实践(一)- 引子 [独孤九剑]持续集成实践(二)– MSBuild语法入门 [独孤九剑]持续集成实践(三)- Jenkins安装与配置(Jenkins+MSBu ...

  2. [独孤九剑]持续集成实践(三)- Jenkins安装与配置(Jenkins+MSBuild+GitHub)

    本系列文章包含: [独孤九剑]持续集成实践(一)- 引子 [独孤九剑]持续集成实践(二)– MSBuild语法入门 [独孤九剑]持续集成实践(三)- Jenkins安装与配置(Jenkins+MSBu ...

  3. 基于Jenkins的开发测试全流程持续集成实践

    今年一直在公司实践CI,本文将近半年来的一些实践总结一下,可能不太完善或优美,但的确初步解决了我目前所在项目组的一些痛点.当然这仅是一家之言也不够完整,后续还会深入实践和引入Kubernetes进行容 ...

  4. Pytest权威教程22-优质集成实践

    目录 优质集成实践 使用pip安装包 Python测试发现的约定 选择测试布局结构/导入规则 在应用程序代码外测试 测试作为应用程序代码的一部分 tox 返回: Pytest权威教程 优质集成实践 使 ...

  5. 「持续集成实践系列」Jenkins 2.x 搭建CI需要掌握的硬核要点

    1. 前言 随着互联网软件行业快速发展,为了抢占市场先机,企业不得不持续提高软件的交付效率.特别是现在国内越来越多企业已经在逐步引入DevOps研发模式的变迁,在这些背景催促之下,对于企业研发团队所需 ...

  6. 「持续集成实践系列 」Jenkins 2.x 构建CI自动化流水线常见技巧

    在上一篇文章中,我们介绍了Jenkins 2.x实现流水线的两种语法,以及在实际工作中该如何选择脚本式语法或声明式语法.原文可查阅:「持续集成实践系列」Jenkins 2.x 搭建CI需要掌握的硬核要 ...

  7. Gitea 与 Jenkins 的集成实践,打造你的专属 CI/CD 系统

    前言 Gitea 是一个用于代码托管的轻量级单体程序,它能与现有的经典应用集成,诸如代码分析工具 SonarQube.持续集成工具 Drone.Jenkins 以及用于工单管理的客户端插件(VSCod ...

  8. 学习笔记——Maven实战(四)基于Maven的持续集成实践

    Martin的<持续集成> 相信很多读者和我一样,最早接触到持续集成的概念是来自Martin的著名文章<持续集成>,该文最早发布于2000年9月,之后在2006年进行了一次修订 ...

  9. 基于Jenkins Pipeline的ASP.NET Core持续集成实践

    最近在公司实践持续集成,使用到了Jenkins的Pipeline来提高团队基于ASP.NET Core API服务的集成与部署效率,因此这里总结一下. 一.关于持续集成与Jenkins Pipelin ...

随机推荐

  1. a里面不能嵌套a

    1. <a href=""> <a href=""></a></a> 会被浏览器解析为 2. <a hre ...

  2. java实现8种排序算法(详细)

    八种排序分别是:直接插入排序.希尔排序.冒泡排序.快速排序.直接选择排序.堆排序.归并排序.基数排序. 希尔排序在时间性能上优于直接插入排序,但希尔排序是一种不稳定排序. 快速排序的时间性能也优于冒泡 ...

  3. linux监控流量脚本

    #!/bin/bashRx=`ifconfig eno16777736 | grep RX | grep packets | awk '{print $5}'`Tx=`ifconfig eno1677 ...

  4. 面向对象的三大特征——封装、继承、多态(&常用关键字)

    一.封装 Encapsulation 在面向对象程式设计方法中,封装是指,一种将抽象性函式接口的实作细节部份包装.隐藏起来的方法. 封装的概念(针对服务器开发,保护内部,确保服务器不出现问题) 将类的 ...

  5. Java中一个方法只被一个线程调用一次

    1.想在运行时抛出异常,终止方法的运行 private final Set<Long> THREADS = new HashSet<>(); public void someM ...

  6. 基于MVC和Bootstrap的权限框架解决方案 一.搭建HTML

    因为某些原因,因为需要,最新要做一套客户管理系统,但是不满足于仅有的框架. 看了很多大牛写的框架,强大是强大,代码也太TM多了,乱七八糟话不多说,开始吧 随便在网上找到一套好看的HTML,看起来还不错 ...

  7. C#各个版本中的新增特性详解

    序言 自从2000年初期发布以来,c#编程语言不断的得到改进,使我们能够更加清晰的编写代码,也更加容易维护我们的代码,增强的功能已经从1.0搞到啦7.0甚至7.1,每一次改过都伴随着.NET Fram ...

  8. 恢复oracle数据库误删除数据的方法汇总

    学习数据库时,我们只是以学习的态度,考虑如何使用数据库命令语句,并未想过工作中,如果误操作一下,都可能导致无可挽回的损失.当我在工作中真正遇到这些问题时,我开始寻找答案.今天主要以oracle数据库为 ...

  9. Spring+IOC(DI)+AOP概念及优缺点

    Spring pring是一个轻量级的DI和AOP容器框架. 说它轻量级有一大部分原因是相对与EJB的(虽然本人从没有接触过EJB的应用),重要的是,Spring是非侵入式的,基于spring开发的应 ...

  10. Java 设计模式(四)-工厂方法模式 (FactoryMethod Pattern)

    1     概念定义 1.1   定义 定义一个用于创建对象的接口,让子类决定实例化哪一个类.工厂方法使一个类的实例化延迟到其子类. 1.2   类型 创建类模式 2     原理特征 2.1   类 ...