目录
一、hbase 和hive
1.Hbase
Hadoop database 的简称,也就是基于Hadoop数据库,哈希内存,是一种NoSQL数据库,主要适用于海量明细数据(十亿、百亿)的随机实时查询,如日志明细、交易清单、轨迹行为等;
2.Hive
Hive是Hadoop数据仓库,不是数据库,主要是让开发人员能够通过SQL来计算和处理HDFS上的结构化数据,底层逻辑是通过map-reduce包,将sql转化成map-reduce程序进行处理和计算,适用于离线的批量数据计算。
3.hbase 和hive的关系:
- Hive用于批处理,而HBase用于事务处理。
- Hive是查询引擎,而Hbase是 非结构化数据的数据存储。
- Hive是运行MapReduce作业的类似SQL的引擎,而HBase 是Hadoop上的NoSQL键/值数据库
4.HDFS分布式文件系统
HDFS是Hadoop两大核心组成部分之一,提供了大规模分布式文件存储能力,支持大流量数据读写
1)HDFS架构
- 遵循主从(master/slave)架构,一个HDFS由一个名称节点(NameNode)和若干个数据节点(DataNode)组成
- 名称节点:中心服务器,负责管理文件系统的命名空间及客户端对文件的访问
- 数据节点:杜泽处理文件系统客户端的读写请求,在名称节点的统一调度下完成数据库创建、复制和删除操作
- 客户端访问流程:把文件名发送给 名称节点,名称节点根据文件名找到对应的数据块,从数据块中找到实际存储的数据节点的位置,把位置发给客户端;客户端直接访问数据节点获取数据
2)HDFS存储特点
- 冗余数据存储:HDFS采用多副本冗余存储,一个数据块的多个副本存在不同的数据节点,加快数据传输速度、易于检查数据错误、保障数据可靠性
- 数据存取策略:HDFS对数据存储,读取、复制进行经精细化的设计,提升系统整体读写性能
- 数据错误和恢复:无论名称节点还是数据节点出错,HDFS都可以检测到错误并自动恢复
3)HDFS的shell命令
二、hbase的逻辑结构和物理存储
1.逻辑结构
- hbase采用列存储,本质上是key-value存储系统,其中row key相当于key,列簇的集合相当于value
- row key用来检索记录的主键,它必须存在一张表中且唯一
- hbase一张表由一个或多个region组成:下图的一张表由三个region组成,按照row key的字典序排列在不同的region里
- 列族:下表被划分为两个列族class_info(name,age,class列)和 contact_info(mobile,adress列)
2.物理存储
实际的物理存储是column family是列族,column qualifier 是列名,time stamp是自动生成的,也可以手动指定,type表示数据以插入方式写进去的,value是该列的直
3.Hbase各项特征汇总
HBASE 特征汇总 | |||
开发语言 | Java | 数据分区 | 一致性哈希 |
数据模型 | key-value | 索引 | 支持 |
系统架构 | 1.zookeeper进行maser选举 2.数据存储到hdfs实现容错能力 | 数据一致性 | 强一致性 |
存储方式 | 列簇存储 | 数据编写 | 随机读写和删除 更新操作:插入一条新TIME STAMP |
4.Hbase支持的访问接口
5.Hbase的shell命令
三、hbase的增删改查
1.创建表:
//创建客户表,新增两个列族,第一个是基本信息,第二是财产信息
create 'customer','baseinfo','property'
2.修改表:
修改列族baseinfo的VERSIONS的值为3
$ alter 'customer',{NAME=>'baseinfo',VERSIONS=>2}
3.查看所有表:
list
4.增/改表数据:put
//语法:put <table>,<rowkey>,<family:column>,<value>,<timestamp>
//新增或者覆盖数据 put '表名','键名','列名(不是列簇名)','值'
//指定的列名下单元格有值就覆盖..没有值就创建.所以HBase的添加数据和修改数据都是put语句..
//最后的时间戳可以不写..默认为系统时间,如果要写..切记不可使用引号括起来
给customer表,rowkey是1的baseinfo列族新增数据
$ put 'customer','1','baseinfo:name','zhengshangchao',1462241148
$ put 'customer','1','baseinfo:age','29'
$ put 'customer','1','baseinfo:phone','13006214788'
$ put 'customer','1','baseinfo:address','shanghai'
给customer表,rowkey是1的property列族新增数据
$ put 'customer','1','property:wechatpay','1000',1462241148
$ put 'customer','1','property:alipay','1000'
$ put 'customer','1','property:bankcard','20000'
$ put 'customer','1','property:cash','100'
5.查表数据:
//查看全表内容
$ scan 'customer'
//查customer表里的RowKey为1的数据
$ get 'customer','1'
//查看列族
$ get 'customer', '1', 'baseinfo'
$ get 'customer', '1', 'property'
//看下customer表两个列族支持的版本VERSIONS的值是多少,运行命令
$ describe 'customer'
6.删表数据:
//删除某个单元值的值 会删除所有版本
//语法:delete <table>, <rowkey>, <family:column> , <timestamp>,必须指定列名
//测试后发现后边跟时间戳也没有用,依然会删除所有版本
$ delete 'customer','1','baseinfo:phone'
//删除行或者整个列簇
//语法:deleteall <table>, <rowkey>, <family:column> , <timestamp>,可以不指定列名,删除整行数据
$ deleteall 'customer','1'
$ deleteall 'customer'
//清空表数据
//语法: truncate <table>
//等同于 disable -> drop -> create
hbase shell> truncate 'customer'
//删除表:必须要先禁用,才能删除
$ disable 'customer'
$ drop 'customer'