当前位置: 代码迷 >> 综合 >> HBASE扩展
  详细解决方案

HBASE扩展

热度:85   发布时间:2024-03-10 00:19:29.0

 HBase与Hive的对比

1.Hive

(1) 数据仓库

Hive的本质其实就相当于将HDFS中已经存储的文件在Mysql中做了一个双射关系,以方便使用HQL去管理查询。

(2) 用于数据分析、清洗

Hive适用于离线的数据分析和清洗,延迟较高。

(3) 基于HDFS、MapReduce

Hive存储的数据依旧在DataNode上,编写的HQL语句终将是转换为MapReduce代码执行。

2.HBase

(1) 数据库

是一种面向列存储的非关系型数据库。

(2) 用于存储结构化和非结构化的数据

适用于单表非关系型数据的存储,不适合做关联查询,类似JOIN等操作。

(3) 基于HDFS

数据持久化存储的体现形式是Hfile,存放于DataNode中,被ResionServer以region的形式进行管理。

(4) 延迟较低,接入在线业务使用

面对大量的企业数据,HBase可以直线单表大量数据的存储,同时提供了高效的数据访问速度。

 

2 HBase与Hive集成使用

尖叫提示:HBase与Hive的集成在最新的两个版本中无法兼容。所以,我们只能含着泪勇敢的重新编译:hive-HBase-handler-1.2.2.jar!!

1.环境准备

因为我们后续可能会在操作Hive的同时对HBase也会产生影响,所以Hive需要持有操作HBase的Jar,那么接下来拷贝Hive所依赖的Jar包(或者使用软连接的形式)。

让hive持有可以读写hbase的jar包在HIVE_HOME/lib/下,将操作hbase的jar包以软连接的形式,持有!

export HBASE_HOME=/opt/module/HBase

export HIVE_HOME=/opt/module/hive

//源链接     链接名

ln -s $HBASE_HOME/lib/HBase-common-1.3.1.jar  $HIVE_HOME/lib/HBase-common-1.3.1.jar

ln -s $HBASE_HOME/lib/HBase-server-1.3.1.jar $HIVE_HOME/lib/HBase-server-1.3.1.jar

ln -s $HBASE_HOME/lib/HBase-client-1.3.1.jar $HIVE_HOME/lib/HBase-client-1.3.1.jar

ln -s $HBASE_HOME/lib/HBase-protocol-1.3.1.jar $HIVE_HOME/lib/HBase-protocol-1.3.1.jar

ln -s $HBASE_HOME/lib/HBase-it-1.3.1.jar $HIVE_HOME/lib/HBase-it-1.3.1.jar

ln -s $HBASE_HOME/lib/htrace-core-3.1.0-incubating.jar $HIVE_HOME/lib/htrace-core-3.1.0-incubating.jar

ln -s $HBASE_HOME/lib/HBase-hadoop2-compat-1.3.1.jar $HIVE_HOME/lib/HBase-hadoop2-compat-1.3.1.jar

ln -s $HBASE_HOME/lib/HBase-hadoop-compat-1.3.1.jar $HIVE_HOME/lib/HBase-hadoop-compat-1.3.1.jar

同时在hive-site.xml中修改zookeeper的属性,如下:

<property>

  <name>hive.zookeeper.quorum</name>

  <value>hadoop102,hadoop103,hadoop104</value>

  <description>The list of ZooKeeper servers to talk to. This is only needed for read/write locks.</description>

</property>

<property>

  <name>hive.zookeeper.client.port</name>

  <value>2181</value>

  <description>The port of ZooKeeper servers to talk to. This is only needed for read/write locks.</description>

</property>

2.hive表与HBASE中的数据进行映射

在hive中建表,这个表需要和hbase中的数据进行映射; 只能创建external non-native table

a) 数据已经在hbase中,只需要在hive建表,查询即可(只能创建hive外部表,数据实际在HBASE)

HBASE中有几列,hive表中就有几列,并且要加上RowKey列族;
create external table hbase_t3(
   id int,
   age int,
   gender string,
   name string
)
STORED BY 'org.apache.hadoop.hive.hbase.HBaseStorageHandler'
WITH SERDEPROPERTIES ("hbase.columns.mapping" = ":key,info:age,info:gender,info:name")
TBLPROPERTIES ("hbase.table.name" = "t3");

注意:序列化器,序列化映射字段,


b) 数据还尚未插入到hbase,可以在hive中建表,建表后,在hive中执行数据的导入
        将数据导入到hbase,再分析。 表必须是managed non-native table!
        ①建表
CREATE  TABLE `hbase_emp`(
  `empno` int, 
  `ename` string, 
  `job` string, 
  `mgr` int, 
  `hiredate` string, 
  `sal` double, 
  `comm` double, 
  `deptno` int)
STORED BY 'org.apache.hadoop.hive.hbase.HBaseStorageHandler'
WITH SERDEPROPERTIES ("hbase.columns.mapping" = ":key,info:ename,info:job,info:mgr,
info:hiredate,info:sal,info:comm,info:deptno")
TBLPROPERTIES ("hbase.table.name" = "emp");
        ②替换hive-hbase-handler.jar
        ③使用insert向表中导入数据(注意表中是否有空值,空值不行)
insert into table hbase_emp select * from emp
            

④注意事项:
        a)在建表时,hive中的表字段的类型要和hbase中表列的类型一致,以避免类型转换失败造成数据丢失。
        b) row format 的作用是指定表在读取数据时,使用什么分隔符来切割数据,只有正确的分隔符,才能正确切分字段
        c) 管理表:managed_table
                    由hive的表管理数据的生命周期!在hive中,执行droptable时,
                    不禁将hive中表的元数据删除,还把表目录中的数据删除
            外部表: external_table
                    hive表不负责数据的生命周期!在hive中,执行droptable时,
                    只会将hive中表的元数据删除,不把表目录中的数据删除    
    

1.案例一

目标:建立Hive表,关联HBase表,插入数据到Hive表的同时能够影响HBase表。

分步实现:

(1) 在Hive中创建表同时关联HBase

CREATE TABLE hive_HBase_emp_table(

empno int,

ename string,

job string,

mgr int,

hiredate string,

sal double,

comm double,

deptno int)

STORED BY 'org.apache.hadoop.hive.hbase.HBaseStorageHandler'

WITH SERDEPROPERTIES ("hbase.columns.mapping" = ":key,info:ename,info:job,info:mgr,info:hiredate,info:sal,info:comm,info:deptno")

TBLPROPERTIES ("hbase.table.name" = "hbase_emp_table");

提示:完成之后,可以分别进入HiveHBase查看,都生成了对应的表

(2) 在Hive中创建临时中间表,用于load文件中的数据

提示:不能将数据直接load进Hive所关联HBase的那张表中

CREATE TABLE emp(

empno int,

ename string,

job string,

mgr int,

hiredate string,

sal double,

comm double,

deptno int)

row format delimited fields terminated by '\t';

(3) 向Hive中间表中load数据

hive> load data local inpath '/home/admin/softwares/data/emp.txt' into table emp;

(4) 通过insert命令将中间表中的数据导入到Hive关联HBase的那张表中

hive> insert into table hive_hbase_emp_table select * from emp;

(5) 查看Hive以及关联的HBase表中是否已经成功的同步插入了数据

Hive:

hive> select * from hive_HBase_emp_table;

HBase:

HBase> scan ‘HBase_emp_table’

2.案例二

目标:在HBase中已经存储了某一张表HBase_emp_table,然后在Hive中创建一个外部表来关联HBase中的HBase_emp_table这张表,使之可以借助Hive来分析HBase这张表中的数据。

注:该案例2紧跟案例1的脚步,所以完成此案例前,请先完成案例1。

分步实现:

(1) 在Hive中创建外部表

CREATE EXTERNAL TABLE relevance_HBase_emp(

empno int,

ename string,

job string,

mgr int,

hiredate string,

sal double,

comm double,

deptno int)

STORED BY

'org.apache.hadoop.hive.hbase.HBaseStorageHandler'

WITH SERDEPROPERTIES ("hbase.columns.mapping" =

":key,info:ename,info:job,info:mgr,info:hiredate,info:sal,info:comm,info:deptno")

TBLPROPERTIES ("hbase.table.name" = "HBase_emp_table");

(2) 关联后就可以使用Hive函数进行一些分析操作了

hive (default)> select * from relevance_HBase_emp;

 

hive集成hbase理论

1.Storage Handlers
        Storage Handlers是一个扩展模块,帮助hive分析不在hdfs存储的数据
        例如数据存储在hbase上,可以使用hive提供的对hbase的Storage Handlers,来读写hbase中的数据!
        
        
        native table: 本地表! hive无需通过Storage Handlers就能访问的表。
                例如之前创建的表,都是native table!
        non-native table : hive必须通过Storage Handlers才能访问的表!
                例如和hbase继承的表!
                
2. 在建表时
        创建native表:
                [ROW FORMAT row_format] [STORED AS file_format]
                        file_format: ORC|TEXTFILE|SEQUNCEFILE|PARQUET
                        都是hive中支持的文件格式,由hive负责数据的读写!
        或
        创建non-native表:
                STORED BY 'storage.handler.class.name' [WITH SERDEPROPERTIES (...)]
                        数据在外部存储,hive通过Storage Handlers来读写数据!
                        
3. SERDE:
        序列化器和反序列化器
        
        表中的数据是什么样的格式,就必须使用什么样的SerDe!
            纯文本:  row format delimited ,默认使用LazySimpleSerDe
            JSON格式:  使用JsonSerde
            ORC:    使用读取ORC的SerDe
            Paquet:  使用读取PaquetSerDe
        
        普通的文件数据,以及在建表时,如果不指定serde,默认使用LazySimpleSerDe!
        
例如: 数据中全部是JSON格式
{"name":"songsong","friends":["bingbing","lili"]}
{"name":"songsong1","friends": ["bingbing1" , "lili1"]}

错误写法:
create table testSerde(
name string,
friends array<string>
)
row format delimited fields terminated by ','
collection items terminated by ','
lines terminated by '\n';

如果指定了row format delimited ,此时默认使用LazySimpleSerDe!
LazySimpleSerDe只能处理有分隔符的普通文本!

现在数据是JSON,格式{},只能用JSONSerDE
create table testSerde2(
name string,
friends array<string>
)
ROW FORMAT SERDE 
'org.apache.hive.hcatalog.data.JsonSerDe' 
STORED AS TEXTFILE