HBase介绍
- Apache的三篇论文,GFS谷歌文件系统->HDFS;MR -> MR ; BigTable ->HBase;
- HBase是hadoop数据库,一种分布式、可扩展的大数据NoSQL数据库之一。
- 适合对于
大量数据
进行随机、实时
的读写操作
HBase数据模型
- Bigtable是一个稀疏的(如果某个列没有值,那么这个列直接不维护,传统的关系型数据库会维护一个null值)、分布式的、持久的多维(维度信息主要保存在key中,value一般是单纯的值)排序map
- 改映射由行键、列键和时间戳索引组成;映射的每个值都是一个字节数组。
- 用户将数据行存储在带标签的表中,数据行具有
可排序
的键和任意数量
的列。 - 数据模型的关键在于稀疏、分布式、多维、排序的映射
HBase逻辑结构
- row_key按照字典序排序,数据存储整体有序,存储的数据都是字节数据
- 所有列必须在列族的内部,没有单独的列
- 没有数据的部分,对于该行数据来说,直接没有该列,也不存储null值。
- 划分列族的好处是为了方便存储,将同一列族的数据存储到一起
- 每个region每个列族划分的区域称为一个store
HBase物理存储结构
- 同一row_key,同一列族,同一列的数据根据时间戳排序
- 根据时间戳来区分数据的版本,一般保留最新版本
数据模型术语
- NameSpace命名空间
- hbase
- default
- Table: 定义表时只需要声明列族即可,具体的列可以动态、按需指定
- Row: 由一个RowKey和多个Column组成,数据是按照rowkey的字典序存储的,查询数据只能根据rowkey检索,所以rowkey的设计十分重要。
- Column: 列族:列
- Time Stamp: 用于标识数据的不同版本
- Cell = rowkey + column family + column qualifier + timestamp 唯一确定的单元
HBase基础架构
- Master
- master通过监控region server是否正常运行
- master负责所有元数据的变化
- 监控执行region的故障转移和拆分线程
- RegionServer
- 负责数据Cell的处理
- 在执行区域的拆分和合并时,由RegionServer来实际执行
- HDFS: 保证数据存储的可靠
HBase的安装
- 配置环境变量
- vim hbase-env.sh, 126行,改为用外置的zookeeper。
- vim hbase-site.xml文件,改为分布式集群,告诉集群zookeeper的地址,数据存储位置,wal(写前日志)
- 端口号默认为16010
时间同步问题
- 如果RegionServer和Master的时间超过30s,就会触发ClockOutOfSyncException
HBase Shell基本操作
- hbase shell, 启动一个hbase shell
- help 命令名/ 组名 查看所有命令
- ddl命令
- 查看所有的表:list
- 建表:create ‘mydb:t1’, {name=>‘cf1’, version=>3}
- 简写:create t2, ‘col1’, ‘col2’
- 查看表的详情: describe ‘mydb:t1’ , 可以简写为desc
- 修改表:
- alter ‘t2’ , {name=>‘cf1’,version=>3}, ‘cf4’
- alter ‘t2’ ‘delete’ => ‘cf2’
- 删除表: drop ‘t2’,删除前需要先禁用表disable ‘t2’, 之后再删除
- 是否存在exists ‘t1’
- 查看表的region信息:list_regions ‘t1’
- namespace命令
- 查看所有的namespace: list_namespace
- 查看指定namespace下面的表:list_namespace_tables ‘hbase’; 里面有meta和namespace两张表
- 创建一个数据库:create_namespace ‘mydb’
- 查看数据库详情:descrbe_namespace ‘mydb’
- 修改namespace: alter_namespace ‘mydb1’ , {method = ‘set’, ‘author’=>‘wyh’}
- 删除namespace属性: alter_namespace ‘mydb1’ ,{method=‘unset’, name=>‘author’}
- dml命令(数据的增删改查 )
- 插入数据:put ‘t1’ ‘1001’, ‘cf1:name’, ‘zhangsan’
- 查询数据:get ‘t1’ ‘1001’
- 扫描数据:san ‘t1’ 扫描表中所有的数据
- 修改数据: put ‘t1’ ‘1001’ ‘cf1:name’, ‘zhangxiaosan’
- 删除数据:delete ‘t1’ , ‘1001’, ‘cf1:name’; truncate命令是直接删除文件,不是打标记