最近更新时间:2024-11-19 16:26:58
HBase是一个开源、分布式、版本化的非关系型数据库,是Apache基金会Hadoop项目的一部分,采用Java语言实现。它运行在Hadoop Distributed File System (HDFS)上,是Apache Hadoop的主要组件。HBase提供了存储稀疏数据集的容错方式,适用于许多大数据用例,尤其在实时数据处理和大量数据的随机读写访问方面表现出色。HBase更类似于典型的Apache MapReduce应用程序。HBase支持以Apache Avro、REST和Thrift编写应用程序。
HBase是BigTable的开源Java版本,建立在HDFS上,提供高可靠性、高性能、列存储、可伸缩、实时读写NoSql的数据库系统。介于NoSql和RDBMS之间,仅能通过主键(row key)和主键范围检索数据,仅支持单行事务(可通过Hive支持实现多表join等复杂操作)。主要用于存储结构化和半结构化的松散数据。HBase查询数据功能简单,不支持复杂操作,不支持复杂的事务(行级事务)。
分布式架构: HBase采用分布式架构,在集群中横向扩展,处理大规模数据。数据分片存储在不同节点上,实现数据的并行处理和高可用性,适用于海量数据处理。
列式存储: HBase采用列式存储方式,高效读取特定列或列族的数据,适用于需要快速随机读写大量数据的场景。
高可靠性: 通过数据复制和自动故障恢复提供高可靠性。数据在集群中多个节点之间进行复制,实现数据冗余和容错,自动恢复数据以确保可用性和持久性。
实时读写: 提供高吞吐量和低延迟的读写操作,支持随机访问和范围扫描,适用于实时响应和处理大量并发请求的应用场景。
强一致性: 提供强一致性的数据模型,支持原子性的读写操作,确保读取到的是最新写入数据,适用于需要数据一致性和可靠性的应用,如金融交易和在线订单处理。
监控RegionServer
处理RegionServer 故障转移
处理元数据的变更
处理region 的分配或移除
在空闲时间进行数据的负载均衡
通过 Zookeeper 发布自己的位置给客户
负责存储 HBase 的实际数据
处理分配给它的 Region
刷新缓存到 HDFS
维护 HLog
执行压缩
负责处理 Region 分片
HBase 的修改记录,当对 HBase 读写数据的时候,数据不是直接写进磁盘,它会在内存中保留一段时间(时间以及数据量阈值可以设定)。但把数据保存在内存中可能有更高的概率引起数据丢失,为了解决这个问题,数据会先写在一个叫做 Write-Ahead logfile 的文件中,然后再写入内存中。所以在系统出现故障的时候,数据可以通过这个日志文件重建。
这是在磁盘上保存原始数据的实际的物理文件,是实际的存储文件。
HFile 存储在 Store 中,一个 Store 对应 HBase 表中的一个列族。
内存存储,位于内存中,用来保存当前的数据操作,所以当数据保存在 WAL 中之后,RegsionServer 会在内存中存储键值对。
Hbase 表的分片,HBase 表会根据 RowKey 值被切分成不同的 region 存储在RegionServer 中,在一个 RegionServer 中可以有多个不同的 region。
执行hbase shell连接HBase.
成功连接后,控制台打印版本信息和hbase:001:0>提示符。运行help命令查看HBase Shell命令列表。
查询服务器状态:status
查询版本号:version
create 'my_table', 'my_column_family','my_column_family2'
list
describe 'my_table'
alter 'my_table', {NAME=>'my_column_family',METHOD=>'delete'}
把表设置为disable: disable 'my_table'
删除这个表drop 'my_table'
exists 'my_table'
is_enabled 'my_table'
put命令向指定表写入数据,指定表名、行、列和需要写入的值:
put 'my_table', 'row1', 'my_column_family:column1', 'value1'
put 'my_table', 'row1', 'my_column_family:column2', 'value2'
获取my_table表的row1行的所有数据:get 'my_table', 'row1'
获取 my_table 表的 row1 行 my_column_family列族的所有数据:get 'my_table', 'row1', {COLUMN=>'my_column_family'}
更新 my_table 表的 row1 行、my_column_family 列族中 column1 列的值:put 'my_table', 'row1', 'my_column_family:column1', 'new_value'
运行get命令获取行或者单元格的数据,例如:
get 'my_table', 'row1', {COLUMN=>'my_column_family:column1'}
纯净模式
