Day8 —— 大数据技术之HBase

HBase快速入门系列

HBase的概述

什么是HBase?

HBase 是一个开源的、分布式的、面向列的 NoSQL 数据库,它构建在 Apache Hadoop 之上,提供了高可靠性、高性能和可伸缩性的数据存储解决方案。HBase 的设计灵感来自于 Google 的 Bigtable。

主要特点和功能包括

  1. 面向列的存储: HBase 采用面向列的存储模型,数据按行键(Row Key)和列族(Column Family)存储,可以支持动态列。

  2. 分布式存储: HBase 是基于 Hadoop 的分布式文件系统(如 HDFS)构建的,可以水平扩展以处理大规模数据集。

  3. 高可靠性和高可用性: HBase 提供数据的自动复制和容错机制,确保数据的可靠性和可用性。

  4. 快速读写: HBase 提供了高性能的读写操作,支持随机读写访问,并能够处理大量并发请求。

  5. 强一致性: HBase 提供强一致性的数据访问模型,确保数据的一致性性。

  6. 支持自动分区和负载均衡: HBase 可以自动管理数据的分区和负载均衡,使得数据在集群中分布均匀。

  7. 支持多种操作接口: HBase 提供了多种操作接口,包括 Java API、REST API、Thrift API 等,方便用户进行数据访问和操作。

使用场景

  • 实时数据存储和分析: HBase 适用于需要实时存储和分析大量数据的场景,如日志数据、传感器数据等。

  • 在线交易处理(OLTP): HBase 支持高并发的随机读写操作,适用于在线交易处理系统。

  • 实时推荐系统: HBase 可以作为实时推荐系统的数据存储引擎,支持快速的数据检索和更新。

  • 时序数据存储: HBase 适用于存储时序数据,如传感器数据、日志数据等,支持按时间范围的快速查询。

HBase的架构

  • HMaster:

    HMaster 是 HBase 的主节点,负责管理整个集群的元数据、负载均衡、Region 的分配和调度、故障恢复等工作。HMaster 通过 ZooKeeper 进行协调和通信。

  • RegionServer:

    RegionServer 是 HBase 的工作节点,负责管理存储数据的 Region。

    每个RegionServer 可以管理多个 Region,负责处理读写请求、数据的存储和 检索等操作。

  • Region:

    Region 是 HBase 中数据存储和管理的基本单元,数据按照 Row Key 范围划分为多个 Region,每个 Region 存储一定范围的数据。RegionServer 负责管理和处理特定的 Region。

  • HLog(Write-ahead Log):

    HLog 是 HBase 中的写前日志,用于记录数据的变更操作,确保数据的持久性和一致性。HLog 会先将数据写入日志,然后再写入内存和磁盘中。

  • MemStore:

    MemStore 是位于 RegionServer 中的内存缓存,用于暂时存储写入的数据,当数据量达到一定阈值时,会将数据刷写到磁盘中的 HFile 中。

  • HFile:

    HFile 是 HBase 中数据存储的文件格式,数据按列族存储在 HFile 中,提供快速的数据检索和访问。

  • ZooKeeper:

    ZooKeeper 是 HBase 集群中的协调服务,用于管理集群的状态信息、选举 Master、协调 RegionServer 等。HBase 使用 ZooKeeper 来确保集群的一致性和可靠性。

  • HBase Client:

    HBase Client 是用户与 HBase 集群交互的接口,用户可以通过 HBase Client 发送读写请求、管理数据等操作。

HBase部署与启动

下载、解压缩,在/etc/profile全局配置文件中添加

export HBASE_HOME=/export/servers/hbase-2.4.5

export PATH=$ PATH:$HBASE_HOME/bin

下载、解压缩,在/etc/profile全局配置文件中添加

export HBASE_HOME=/export/servers/hbase-2.4.5

export PATH=$ PATH:$HBASE_HOME/bin

下载、解压缩,在/etc/profile全局配置文件中添加

xml 复制代码
<configuration>
  <!-- hbase数据存放的目录-->
  	<property>
       <name>hbase.rootdir</name>
       <value>hdfs://my2308-host:9000/hbase</value>
    </property>

    <!-- zk的位置 -->
    <property>
        <name>hbase.zookeeper.quorum</name>
        <value>localhost</value>
        <description>my2308-host:2181</description>
    </property>

<!--hbase.cluster.distributed表示是否分布式部署,指定为true-->
    <property>
         <name>hbase.cluster.distributed</name>
         <value>true</value>
    </property>

    <!-- hbase主节点的位置 -->
    <property>
         <name>hbase.master</name>
         <value>my2308-host:60000</value>
     </property>
</configuration>

拷贝zookeeper的conf/zoo.cfg到hbase的conf/下

启动HBase,执行start-hbase.sh脚本

注意:为了方便启动,可在/etc/profile中添加环境变量

export HBASE_HOME=/export/servers/hbase-2.4.5

export PATH=$ PATH:$ HBASE_HOME/bin

HBase基本操作

前提条件

数据库操作

进入 hbase 客户端

hbase shell

查看所有库(命名空间)

list_namespace

创建一个名称为'mydb'的库

create_namespace 'mydb'

删除'mydb'库

drop_namespace 'mydb'

进入 hbase 客户端

hbase shell

表操作

查看 'mydb'库下的表

list_namespace_tables 'mydb'

查看所有自己创建的表

list

在'mydb'库下创建名为test的表,并创建'f1'、'f2'两个列族

create 'mydb:test','f1','f2'

注意:创建表时若不指定库名,默认在default库下创建表,创建表要至少指定一个列族

查看表详细信息

describe 'mydb:test' 或 desc 'mydb:test'

增加列族

alter 'mydb:test','f3'

删除列族

alter 'mydb:test','delete'=>'f2'

删除表

disable 'mydb:test'

drop 'mydb:test'

注意:删除表需要先进行disable,再进行drop

数据的CRUD操作

先在 default 库下创建一个名为stu的表,列族名称是 info

create 'stu','info'

插入数据

put 'stu','1001','info:name','linghc'

put 'stu','1001','info:sex','man'

put 'stu','1001','info:age','26'

put 'stu','1002','info:name','renyy'

put 'stu','1002','info:sex','female'

put 'stu','1002','info:age','24'

put 'stu','1003','info:name','yilin'

put 'stu','1003','info:sex','female'

put 'stu','1003','info:age','18'

某一行的列的个数可以不一样

put 'stu','1004','info:name','dongfangb'

put 'stu','1004','info:sex','female'

put 'stu','1004','info:age','28'

put 'stu','1004','info:party','rysj'

根据row key(行键)查询

get 'stu','1004'

根据行键、列名查询

get 'stu','1004','info:name','info:age'

扫描表数据

scan 'stu'

按rowkey范围扫描 {STARTROW => '1001' ,STOPROW => '1003'} :左闭右开,此时只查询到 1002

scan 'stu',{STARTROW => '1001' ,STOPROW => '1003'}

指定STOPROW 后加!,可以实现左闭右闭

scan 'stu',{STARTROW => '1001' ,STOPROW => '1003!'}

修改数据:直接put进行覆盖

put 'stu','1001','info:name','linghc1'

注意:修改数据后,其实只是在原来的基础上增加了一条数据,查询的时候返回了时间戳最新的一个版本,旧版本的数据还在

查寻每个单元格的2个版本数据

scan 'stu',{RAW=>true,VERSIONS=>2}

注意RAW参数必须和VERSIONS一起使用,旧版本的数据在适当的时候会被释放;如果想要保留最新两个版本的数据,可以将某个表的 VERSIONS设置为2

更改表的VERSIONS

alter 'stu',{NAME=>'info',VERSIONS=>2}

注意:创建表时若不指定库名,默认在default库下创建表,创建表要至少指定一个列族

删除数据

delete 'stu','1001','info:sex'

此时查询会发现无数据

get 'stu','1001','info:sex'

再通过版本号查询

scan 'stu',{RAW=>true,VERSIONS=>2}

会发现删除的数据有Delete标注

  • 根据行键和列名删除列

deleteall 'stu','1001','info:sex'

标注为:DeleteColumn

  • 根据行键删除列族

deleteall 'stu','1004'

标注为:DeleteFamily

  • 删除表中所有数据

truncate 'stu'

truncate命令将删除表中的所有数据行,但是保留表的结构和配置信息。

HBase的不足

当涉及到某些特定的应用场景时,HBase并不总是首选解决方案。举例来说,HBase本身并不支持复杂的聚合运算,如Join和GroupBy操作。在这种情况下,可以考虑在HBase之上集成Phoenix或Spark组件。Phoenix适用于小规模聚合的OLTP场景,而Spark则适用于大规模聚合的OLAP场景。

此外,HBase原生不支持二级索引功能,这意味着无法直接进行二级索引查找。不过,有许多第三方解决方案可以为HBase提供二级索引支持,比如Phoenix提供的二级索引功能。

另一个限制是HBase没有实现全局跨行事务,只支持单行事务模型。针对这一点,Phoenix提供了全局事务模型组件,可以弥补HBase在这方面的不足。

尽管如此,HBase作为一个高可靠性、高性能和可伸缩性的分布式NoSQL数据库,在Hadoop生态系统的支持下,通过集成Phoenix、Spark或其他第三方组件,仍然能够满足广泛的大数据存储和处理需求。

相关推荐
Elastic 中国社区官方博客4 分钟前
使用 Elastic AI Assistant for Search 和 Azure OpenAI 实现从 0 到 60 的转变
大数据·人工智能·elasticsearch·microsoft·搜索引擎·ai·azure
Python私教2 小时前
model中能定义字段声明不存储到数据库吗
数据库·oracle
Francek Chen2 小时前
【大数据技术基础 | 实验十二】Hive实验:Hive分区
大数据·数据仓库·hive·hadoop·分布式
BestandW1shEs4 小时前
谈谈Mysql的常见基础问题
数据库·mysql
重生之Java开发工程师4 小时前
MySQL中的CAST类型转换函数
数据库·sql·mysql
教练、我想打篮球4 小时前
66 mysql 的 表自增长锁
数据库·mysql
Ljw...4 小时前
表的操作(MySQL)
数据库·mysql·表的操作
哥谭居民00014 小时前
MySQL的权限管理机制--授权表
数据库
wqq_9922502774 小时前
ssm旅游推荐系统的设计与开发
数据库·旅游