Hive On HBase实战

1.概述

HBase是一款非关系型、分布式的KV存储数据库。用来存储海量的数据,用于键值对操作。目前HBase是原生是不包含SQL操作,虽然说Apache Phoenix可以用来操作HBase表,但是需要集成对应的Phoenix依赖包到HBase集群中,同时需要编写对应的Schema才能实现SQL操作HBase。

本篇博客,笔者将为大家介绍另一位一种SQL方式来操作HBase,那就是Hive。

2.内容

2.1 使用场景

熟悉大数据的同学应该都知道,Hive是一个分布式的数据仓库,它能够将海量数据,结构化存储到HDFS上,然后通过SQL的方式对这些海量数据进行业务处理。而且,Hive学习成本很低,熟悉SQL的同学,很快就能编写一个Hive应用程序。

我们通过Hive把数据加载到HBase表中时,数据源可以是文件,也可以是表。当HBase集群集成Hive后,如果对Hive表追加数据的同时,HBase表中的数据也会增加。在原生的HBase集群中,HBase表不支持连接查询或是分组查询等,但是我们可以通过Hive On HBase的方式来让HBase集群支持这些功能。比如,事先将数据加载到Hive表中,然后通过Hive SQL的JOIN、GROUP BY等语法来操作。

2.2 基础环境

实战的基础环境信息如下所示:

组件 版本
Hadoop 2.7.4
Hive 3.1.2
HBase 1.2.0
JDK 1.8

2.3 Hive On HBase表

Hive字段和HBase中的列都是通过Storage Handler来维护的。创建Hive表时,把存储格式指定为Storage Handler,这个程序被编译成一个独立的模块,在Java中它就是一个独立的Jar包,比如hive-hbase-handler-{version}.jar,Hive的客户端必须要能够识别到这个JAR,可以通过--auxpath来指定,操作命令如下:

hive --auxpath hive-hbase-handler-{version}.jar --hiveconf hbase.master=hbasemaster:60000

接着将HBase安装目录lib下的包复制到Hive安装目录lib中,操作命令如下:

cp -r $HBASE_HOME/lib/* $HIVE_HOME/lib

最后,执行hive命令启动Hive客户端窗口。

在Hive集成HBase时,可以有效的利用HBase的存储个性,比如更新和索引等。Hive表需要与HBase之间建立映射关系,创建Hive表名如下:

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"
);

然后,执行hbase shell来查看创建的HBase表,命令如下:

hbase(main):001:0> list
xyz
1 row(s) in 0.0530 seconds
hbase(main):002:0> describe ‘xyz‘
DESCRIPTION                                                             ENABLED
 {NAME => ‘xyz‘, FAMILIES => [{NAME => ‘cf1‘, COMPRESSION => ‘NONE‘, VE true
 RSIONS => ‘3‘, TTL => ‘2147483647‘, BLOCKSIZE => ‘65536‘, IN_MEMORY =>
  ‘false‘, BLOCKCACHE => ‘true‘}]}
1 row(s) in 0.0220 seconds
hbase(main):003:0> scan ‘xyz‘
ROW                          COLUMN+CELL

2.4 加载数据源到Hive表

然后,将HDFS上的文本文件加载到一个临时的Hive表中,操作命令如下所示:

hive -e "load data local inpath ‘/hbase/hive/data/testdata.txt‘ overwrite into table hive_on_hbase_test;"

接着,把hive_on_hbase_test表中的数据加载到hbase_table_1表中,操作命令如下:

insert overwrite table hbase_table_1 select * from hive_on_hbase_test;

2.4.1 查询Hive表

查询hbase_table_1表是否有数据,查询语句如下:

hive> select * from hbase_table_1;
Total MapReduce jobs = 1
Launching Job 1 out of 1
...
OK
100    val_100
Time taken: 3.582 seconds

正常情况下,显示结果会与testdata.txt文件中的数据是一致的。

2.4.2 查询HBase表

当hbase_table_1表正常加载数据后,我们可以使用HBase的Scan命令来查看数据,具体操作命令如下:

hbase(main):001:0> scan ‘xyz‘,LIMIT=>1
ROW                       COLUMN+CELL
100                       column=cf1:val, timestamp=1572154138015, value=val_100
1 row(s) in 0.0110 seconds

这里防止数据显示过多,我们设置一下限制条件。

由于WAL开销,插入大量数据可能会很慢;如果要禁用此功能,可以执行如下命令:

set hive.hbase.wal.enabled=false;

这里需要注意的是,如果HBase发生故障,禁用WAL可能会导致数据丢失,因此只有在有其他可用的恢复策略时才建议使用此选项。

2.4.3 外部表

如果需要使用Hive访问已存在的HBase表时,可以使用Hive外部表,操作命令如下:

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" = "xyz2",
    "hbase.mapred.output.outputtable" = "xyz2"
);

然后,在Hive客户端中查询外部表的数据,操作命令如下:

select * from hbase_table_2;

3.总结

Hive On HBase集成比较简单,实现难度不算太大。如果有离线场景(延时要求不高),或者需要使用SQL来做JOIN、GROUP BY等操作的业务场景,可以尝试用Hive On HBase的方式来实现。

4.结束语

这篇博客就和大家分享到这里,如果大家在研究学习的过程当中有什么问题,可以加群进行讨论或发送邮件给我,我会尽我所能为您解答,与君共勉!

另外,博主出书了《Kafka并不难学》和《Hadoop大数据挖掘从入门到进阶实战》,喜欢的朋友或同学, 可以在公告栏那里点击购买链接购买博主的书进行学习,在此感谢大家的支持。关注下面公众号,根据提示,可免费获取书籍的教学视频。

原文地址:https://www.cnblogs.com/smartloli/p/11747324.html

时间: 2024-08-01 00:41:59

Hive On HBase实战的相关文章

HBase 实战(1)--HBase的数据导入方式

前言: 作为Hadoop生态系统中重要的一员, HBase作为分布式列式存储, 在线实时处理的特性, 备受瞩目, 将来能在很多应用场景, 取代传统关系型数据库的江湖地位. 本篇博文重点讲解HBase的数据导入, 描述三种方式, Client API, Bulkload, 以及Hive Over HBase. *). Client API实现借助HBase的Client API来导入, 是最简易学的方式. Configuration config = HBaseConfiguration.crea

Hive 整合Hbase

摘要 Hive提供了与HBase的集成,使得能够在HBase表上使用HQL语句进行查询 插入操作以及进行Join和Union等复杂查询.同时也可以将hive表中的数据映射到Hbase中. ? ? 应用场景 2.1 将ETL操作的数据存入HBase ? ? ? ? ?? ? 2.2 HBase作为Hive的数据源 ? ? ? ? 2.3 构建低延时的数据仓库 环境准备 ? ? ? ? 3.1 hive与hbase整合环境配置 修改hive-site.xml文件,添加配置属性(zookeeper的地

HIVE和HBASE区别

1. 两者分别是什么? Apache Hive是一个构建在Hadoop基础设施之上的数据仓库.通过Hive可以使用HQL语言查询存放在HDFS上的数据.HQL是一种类SQL语言,这种语言最终被转化为Map/Reduce. 虽然Hive提供了SQL查询功能,但是Hive不能够进行交互查询--因为它只能够在Haoop上批量的执行Hadoop. Apache HBase是一种Key/Value系统,它运行在HDFS之上.和Hive不一样,Hbase的能够在它的数据库上实时运行,而不是运行MapRedu

Hive集成HBase;安装pig

Hive集成HBase 配置 将hive的lib/中的HBase.jar包用实际安装的Hbase的jar包替换掉 cd /opt/hive/lib/ ls hbase-0.94.2* rm -rf hbase-0.92* cp /opt/hbase/hbase-0.94.2* 将Hive的lib/中的zookeeper.jar包用HBase中lib/中的替换掉 步骤同上 在hive-site.xml中添加: <property> <name>hive.aux.jars.path&l

基于微博数据应用的HBase实战开发_HBase视频教程

基于微博数据应用的HBase实战开发 课程观看地址:http://www.xuetuwuyou.com/course/150 课程出自学途无忧网:http://www.xuetuwuyou.com 一.课程用到的软件 1.centos6.7 2.apache-tomcat-7.0.47 3.solr-5.5 4.zookeeper 3.4.6 5.eclipse-jee-neon-R-win32-x86_64  6.jdk1.7_49 7.HBase1.2.2 8.Ganglia3.7.2 9.

Hive(五):hive与hbase整合

配置 hive 与 hbase 整合的目的是利用 HQL 语法实现对 hbase 数据库的增删改查操作,基本原理就是利用两者本身对外的API接口互相进行通信,两者通信主要是依靠hive_hbase-handler.jar工具类. 但请注意:使用Hive操作HBase中的表,只是提供了便捷性,前面章节已经介绍,hiveQL引擎使用的是MapReduce,对于性能上,表现比较糟糕,在实际应用过程中可针对不同的场景酌情使用. 注意:本文介绍的内容适用的版本见我前面章节,HDP2.4.2 ( HBase

HBase 实战(2)--时间序列检索和面检索的应用场景实战

前言: 作为Hadoop生态系统中重要的一员, HBase作为分布式列式存储, 在线实时处理的特性, 备受瞩目, 将来能在很多应用场景, 取代传统关系型数据库的江湖地位. 本篇主要讲述面向时间序列/面检索的应用场景时, 如何利用HBase的特性去处理和优化. 构造应用场景 某气象局对各个站点的信息进行采集和汇总, 这些信息包括站点id, 时间点, 采集要素(要素特别多). 然后对这些采集的数据, 提出如下检索需求: 1). 时间序列检索(检索出该站点的在某个时间范围内的全要素信息) 2). 面检

Hive和Hbase的区别

1. 两者分别是什么? Apache Hive是一个构建在Hadoop基础设施之上的数据仓库.通过Hive可以使用HQL语言查询存放在HDFS上的数据.HQL是一种类SQL语言,这种语言最终被转化为Map/Reduce. 虽然Hive提供了SQL查询功能,但是Hive不能够进行交互查询--因为它只能够在Haoop上批量的执行Hadoop. Apache HBase是一种Key/Value系统,它运行在HDFS之上.和Hive不一样,Hbase的能够在它的数据库上实时运行,而不是运行MapRedu

Hadoop Hive与Hbase关系 整合

用hbase做数据库,但因为hbase没有类sql查询方式,所以操作和计算数据很不方便,于是整合hive,让hive支撑在hbase数据库层面 的 hql查询.hive也即 做数据仓库 1. 基于Hadoop+Hive架构对海量数据进行查询:http://blog.csdn.net/kunshan_shenbin/article/details/7105319 2. HBase 0.90.5 + Hadoop 1.0.0 集成:http://blog.csdn.net/kunshan_shenb