Hive和HBase整合用户指南
本文讲解的Hive和HBase整合意思是使用Hive读取Hbase中的数据。我们可以使用HQL语句在HBase表上进行查询、插入操作;甚至是进行Join和Union等复杂查询。此功能是从Hive 0.6.0开始引入的,详情可以参见HIVE-705。Hive与HBase整合的实现是利用两者本身对外的API接口互相进行通信,相互通信主要是依靠hive-hbase-handler-1.2.0.jar工具里面的类实现的。
使用
启动
我们可以使用下面命令启动Hive,使之拥有读取Hbase的功能,如果你的Hbase只有一台机器(single-node HBase server),可以使用下面命令启动hive client:
$HIVE_HOME/bin/hive --auxpath $HIVE_HOME/lib/hive-hbase-handler-1.2.0.jar,$HIVE_HOME/lib/hbase-0.92.0.jar,$HIVE_HOME/lib/zookeeper-3.3.4.jar,$HIVE_HOME/lib/guava-r09.jar --hiveconf hbase.master=www.iteblog.com:60000 |
如果你的Hbase master是通过Zookeeper维护的,那么你可以在启动Hive Client的时候指定Zookeeper的地址:
$HIVE_HOME/bin/hive --auxpath $HIVE_HOME/lib/hive-hbase-handler-1.2.0.jar,$HIVE_HOME/lib/hbase-0.92.0.jar,$HIVE_HOME/lib/zookeeper-3.3.4.jar,$HIVE_HOME/lib/guava-r09.jar --hiveconf hbase.zookeeper.quorum=www.iteblog.com |
上面直接将Hbase相关的依赖加到启动命令行后面实在不太方便,我们可以在hive-site.xml进行配置:
<property> <name>hive.querylog.location</name> <value>/home/iteblog/hive/logs</value> </property> <property> <name>hive.aux.jars.path</name> <value> $HIVE_HOME/lib/hive-hbase-handler-1.2.0.jar, $HIVE_HOME/lib/hbase-0.92.0.jar, $HIVE_HOME/lib/zookeeper-3.3.4.jar, $HIVE_HOME/lib/guava-r09.jar </value> </property> <property> <name>hive.zookeeper.quorum</name> <value>www.iteblog.com</value> </property> |
从Hive中创建HBase表
使用HQL语句创建一个指向HBase的Hive表
//Hive中的表名iteblogCREATE TABLE iteblog(key int, value string) //指定存储处理器STORED BY 'org.apache.hadoop.hive.hbase.HBaseStorageHandler'//声明列族,列名WITH SERDEPROPERTIES ("hbase.columns.mapping" = ":key,cf1:val") //hbase.table.name声明HBase表名,为可选属性默认与Hive的表名相同,//hbase.mapred.output.outputtable指定插入数据时写入的表,如果以后需要往该表插入数据就需要指定该值TBLPROPERTIES ("hbase.table.name" = "iteblog", "hbase.mapred.output.outputtable" = "iteblog"); |
通过HBase shell可以查看刚刚创建的HBase表的属性
$ hbase shellHBase Shell; enter 'help<RETURN>' for list of supported commands.Version: 0.20.3, r902334, Mon Jan 25 13:13:08 PST 2010hbase(main):001:0> listiteblogrow(s) in 0.0530 secondshbase(main):002:0> describe "iteblog"DESCRIPTION ENABLED {NAME => 'iteblog', FAMILIES => [{NAME => 'cf1', COMPRESSION => true 'NONE', VERSIONS => '3', TTL => '2147483647', BLOCKSIZE => '65536', IN_MEMORY => 'false', BLOCKCACHE => 'true'}]}row(s) in 0.0220 seconds hbase(main):003:0> scan "iteblog"ROW COLUMN+CELL row(s) in 0.0060 seconds |
插入数据
INSERT OVERWRITE TABLE iteblog SELECT * FROM pokes WHERE foo=98; |
在HBase端查看插入的数据
hbase(main):009:0> scan "iteblog"ROW COLUMN+CELL 98 column=cf1:val, timestamp=1267737987733, value=val_98 1 row(s) in 0.0110 seconds |
使用Hive中映射HBase中已经存在的表
创建一个指向已经存在的HBase表的Hive表
CREATE EXTERNAL TABLE iteblog2(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"); |
该Hive表一个外部表,所以删除该表并不会删除HBase表中的数据,有几点需要注意的是:
1、建表或映射表的时候如果没有指定:key则第一个列默认就是行键
2、HBase对应的Hive表中没有时间戳概念,默认返回的就是最新版本的值
3、由于HBase中没有数据类型信息,所以在存储数据的时候都转化为String类型
多列及多列族的映射
如下表:value1和value2来自列族a对应的b c列,value3来自列族d对应的列e:
CREATE TABLE iteblog(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 iteblog SELECT foo, bar, foo+1, foo+2 FROM pokes WHERE foo=98 OR foo=100; |
在Hbase中看起来是这样的:
hbase(main):014:0> describe "iteblog"DESCRIPTION ENABLED {NAME => 'iteblog', FAMILIES => [{NAME => 'a', COMPRESSION => 'N true ONE', VERSIONS => '3', TTL => '2147483647', BLOCKSIZE => '65536', IN_M EMORY => 'false', BLOCKCACHE => 'true'}, {NAME => 'd', COMPRESSION => 'NONE', VERSIONS => '3', TTL => '2147483647', BLOCKSIZE => '65536', IN _MEMORY => 'false', BLOCKCACHE => 'true'}]} 1 row(s) in 0.0170 secondshbase(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 |
如果你在Hive中查询是这样的:
hive> select * from iteblog;Total MapReduce jobs = 1Launching Job 1 out of 1...OK100 val_100 101 10298 val_98 99 100Time taken: 4.054 seconds |
Hive Map类型在HBase中的映射规则
如下表:通过Hive的Map数据类型映射HBase表,这样每行都可以有不同的列组合,列名与map中的key对应,列值与map中的value对应
CREATE TABLE iteblog(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 iteblog SELECT map(bar, foo), foo FROM pokes WHERE foo=98 OR foo=100; |
cf为列族,其列名对应map中的bar,列值对应map中的foo。执行完上面的语句,在Hbase中看起来是这样的:
hbase(main):012:0> scan "iteblog"ROW COLUMN+CELL 100 column=cf:val_100, timestamp=1267739509194, value=100 98 column=cf:val_98, timestamp=1267739509194, value=98 2 row(s) in 0.0080 seconds |
Hive中查询是这样的:
hive> select * from iteblog;Total MapReduce jobs = 1Launching Job 1 out of 1...OK{"val_100":100} 100{"val_98":98} 98Time taken: 3.808 seconds |
注意:由于map中的key是作为HBase的列名使用的,所以map中的key类型必须为String类型。以下映射语句会报错:
CREATE TABLE iteblog(key int, value map<int,int>) STORED BY 'org.apache.hadoop.hive.hbase.HBaseStorageHandler'WITH SERDEPROPERTIES ("hbase.columns.mapping" = ":key,cf:");FAILED: Error in metadata: java.lang.RuntimeException: MetaException(message:org.apache.hadoop.hive.serde2.SerDeException org.apache.hadoop.hive.hbase.HBaseSerDe: hbase column family 'cf:' should be mapped to map<string,?> but is mapped to map<int,int>) |
因为map中的key必须是String,其最终需要变成HBase中列的名称。
支持简单的复合行键
如下:创建一张指向HBase的Hive表,行键有两个字段,字段之间使用~分隔
CREATE EXTERNAL TABLE iteblog(key struct<f1:string, f2:string>, value string) ROW FORMAT DELIMITED COLLECTION ITEMS TERMINATED BY '~'STORED BY 'org.apache.hadoop.hive.hbase.HBaseStorageHandler'WITH SERDEPROPERTIES ( 'hbase.columns.mapping'=':key,f:c1'); |
最后,使用Hive集成HBase表的需注意以下几点:
1、对HBase表进行预分区,增大其MapReduce作业的并行度
2、合理的设计rowkey使其尽可能的分布在预先分区好的Region上
3、通过set hbase.client.scanner.caching设置合理的扫描缓存
Hive和HBase整合用户指南的更多相关文章
- 大数据工具篇之Hive与HBase整合完整教程
大数据工具篇之Hive与HBase整合完整教程 一.引言 最近的一次培训,用户特意提到Hadoop环境下HDFS中存储的文件如何才能导入到HBase,关于这部分基于HBase Java API的写入方 ...
- Hadoop Hive与Hbase整合+thrift
Hadoop Hive与Hbase整合+thrift 1. 简介 Hive是基于Hadoop的一个数据仓库工具,可以将结构化的数据文件映射为一张数据库表,并提供完整的sql查询功能,可以将sql语句 ...
- Hive(五):hive与hbase整合
配置 hive 与 hbase 整合的目的是利用 HQL 语法实现对 hbase 数据库的增删改查操作,基本原理就是利用两者本身对外的API接口互相进行通信,两者通信主要是依靠hive_hbase-h ...
- Hive与Hbase整合
Hive与Hbase整合 1.文档 Hive HBase Integration 2.拷贝jar文件 2.1.把Hbase的lib目录下面的jar文件全部拷贝到Hive的lib目录下面 cd /hom ...
- Hive和Hbase整合
Hive只支持insert和delete操作,并不支持update操作,所以无法实施更新hive里的数据,而HBASE正好弥补了这一点,所以在某些场景下需要将hive和hbase整合起来一起使用. 整 ...
- hive与hbase整合过程
实现目标 Hive可以实时查询Hbase中的数据. hive中的表插入数据会同步更新到hbase对应的表中. 可以将hbase中不同的表中的列通过 left 或 inner join 方式映射到hiv ...
- hive和hbase整合的原因和原理
为什么要进行hive和hbase的整合? hive是高延迟.结构化和面向分析的: hbase是低延迟.非结构化和面向编程的. Hive集成Hbase就是为了使用hbase的一些特性.或者说是中和它们的 ...
- Hive篇---Hive与Hbase整合
一.前述 Hive会经常和Hbase结合使用,把Hbase作为Hive的存储路径,所以Hive整合Hbase尤其重要. 二.具体步骤 hive和hbase同步https://cwiki.apache ...
- hive存储处理器(StorageHandlers)以及hive与hbase整合
此篇文章基于hive官方英文文档翻译,有些不好理解的地方加入了我个人的理解,官方的英文地址为: 1.https://cwiki.apache.org/confluence/display/Hive/S ...
随机推荐
- 一个文件搞定Asp.net core 3.1动态页面转静态页面
最近一个Asp.net core项目需要静态化页面,百度查找了一下,没有发现合适的.原因如下 配置麻烦. 类库引用了第三方类,修改起来麻烦. 有只支持MVC,不支持PageModel. 继承Actio ...
- 将BeyondCompare设置为TortoiseSVN的扩展比较工具
1)点击鼠标右键 -> 点击TortoiseSVN -> Settings,如下图: 2)选择Diff Viewer - > 选择External(并配置好参数),具体如下图: 3) ...
- MySQL事务锁等待超时 Lock wait timeout exceeded; try restarting transaction
工作中处理定时任务分发消息时出现的问题,在查找并解决问题的时候,将相关的问题博客收集整理,在此记录下,以便之后再遇到相同的问题,方便查阅. 问题场景 问题出现的场景: 在消息队列处理消息时,同一事务内 ...
- 同一父进程下的子进程之间的通信(pipe通信)
首先对于fork命令 通过fork命令创建进程 父进程返回子进程id 子进程返回0 失败返回-1 对于pipe通讯机制 pipe通讯是半双工的 也就是说只能一方读一方写 题目中想要P1的输出作为 ...
- C语言数据类型整理
基本类型: 它们是算术类型,包括两种类型:整数类型和浮点类型. 枚举类型: 它们也是算术类型,被用来定义在程序中只能赋予其一定的离散整数值的变量. void 类型: 类型说明符 void 表明没有可用 ...
- RESTful api 功能测试
0 为什么要写测试代码 代码写好了,如果能点或者能看,开发人员一般会自己点点或看看,如果没有发现问题就提交测试:更进一步,代码写好后,运行测试代码,通过后提交测试.将流程抽象下: 功能1编码-> ...
- winform 数据(双向)绑定 快速更新实体
写点东西感觉特别累,也已经很久没写了. 最近在做一个winform类型的系统,其涉及到大量的表,有些表又包含大量的字段,所以当添加.更新实体时便会十分的繁琐,一方面:需要把界面上的字段绑定到对应的实体 ...
- 才华能力出众的ReentrantLock
主要内容 1. synchronized介绍 2. ReentrantLock介绍 3. ReentrantLock和synchronized的可伸缩性比较 4. Condition变量 5. Ree ...
- parrot os安装drozer
dz需要支持 大部分parrot都装好了,只有Protobuf未安装 apt install Protobuf 安装dz 下面下载https://labs.f-secure.com/tools/dro ...
- Alpha冲刺 —— 5.3
这个作业属于哪个课程 软件工程 这个作业要求在哪里 团队作业第五次--Alpha冲刺 这个作业的目标 Alpha冲刺 作业正文 正文 github链接 项目地址 其他参考文献 无 一.会议内容 1.展 ...