zoukankan      html  css  js  c++  java
  • 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.结束语

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

  • 相关阅读:
    构建工具系列二--Grunt
    构建工具系列一--Travis-cli
    Windows平台下如何使用node.js显示系统盘符
    【译文】采用chrome的DevTool中TimeLine和profile工具提升Web app性能
    浏览器重绘和重排
    迁移oracle数据库至新分区
    模拟app上商品详情点击图片放大并且可以切换大图
    JavaScript 复制内容到剪贴板
    原生js ajax
    原型与原型链
  • 原文地址:https://www.cnblogs.com/qq575654643/p/11748037.html
Copyright © 2011-2022 走看看