@zhangyy
2020-06-02T09:06:16.000000Z
字数 5679
阅读 192
hbase的部分
- 一:hbase 简介与架构功能
- 二:hbase 安装与配置
- 三:hbase 常见shell 命令操作
传统的RDBMS关系型数据库(例如SQL)存储一定量数据时进行数据检索没
有问题,可当数据量上升到非常巨大规模的数据(TB或PB)级别时,传统的
RDBMS已无法支撑,这时候就需要一种新型的数据库系统更好更快的处理这
些数据。我们可以选择HBase。
1.2.1 HBase技术来源于 Fay Chang 所撰写的Google论文“Bigtable:一个结构化数
据的分布式存储系统”。
1.2.2 HBase是Apache的Hadoop项目的子项目。HBase不同于一般的关系数据库,它
是一个适合于非结构化数据存储的数据库。另一个不同的是HBase基于列的而不
是基于行的模式。
1.2.3 HBase – Hadoop Database,是一个高可靠性、高性能、面向列、可伸缩的分布
式存储系统,利用HBase技术可在廉价PC Server上搭建起大规模结构化存储集群。
1.2.4 HBase实际上是一个Hadoop的数据库系统,它的主要作用和传统数据库系统一样
存储数据和检索数据。不同的是,HBase可以存储海量数据及海量数据的检索。
1.5.1 HBase是水平扩展的、分布式的、开源有序映射数据库。
1.5.2 Hbase运行在Hadoop文件系统HDFS上。它不要求有预定义的模式,可以被看做
弹性扩展的多维表格,通过动态添加列,在数据插入或查询之前修改列结构,
以支持任意的数据结构。
1.5.3 HBase是一个建立在HDFS上的列存储数据库,具有至此线性扩展(横向扩
展)、自动故障转移、自动分区及模式自由等特性。
Master:
为HBase的主节点,用来协调客户端应用程序和RegionServer的关系,同时用来监控和记录
元数据的变化和管理。
RegionServer:
是从节点,用region的形式处理实际的表。region是HBase表的基础单元组件,它存储了分
布式表。所以HBase表和HBase集群利用Master和RegionServer来协同工作。
ZooKeeper:
是一个高性能、集中化、分布式应用程序协调服务,它为HBase提供了分布式同步和组服务。
在HBase中,它用来选举集群主节点Master,以便跟踪可用的在线服务器,同时维护集群的
元数据。一般安装多个,用于提供Master的高可用性。
通常,Master和Hadoop的NameNode进程运行在同一台主机上,与DataNode通信
以读写HDFS的数据。RegionServer跟Hadoop的DataNode运行在同一台主机上。
HBase不是以关系设计为中心,它是根据用户需求更灵活的开放设计。它提
供了在行键上的单一索引,这在关系世界里称为主键。我们可以通过把行划
分为列族和列来避免大的读取和写入操作,并且这种方式支持水平切分和垂
直切分。
一个HBase表由以下几部分组成:
行键:
这是HBase表中每个记录的唯一键,无论选择什么类型数据作为行健,它在 内部、
磁盘或内存里,都将转换为字节数组进行存储。
表中的每条数据有唯一的标识符,即rowkey,类似于关系型数据库的主键。
列族:
一张HBase表由表的不同列集合在一起。将相同功能或类型的列分类组合在 一起,
这样做的好处是可以更快的分开存储在HBase磁盘上的列族中检索出所需的列。
列:
列属于某一个column family列族。
版本:
HBase能够为一个单元格元组(行、列族和列)保存多个值,每个单元格被 称为一个记录的
版本。版本制定为基于时间戳的长整形。默认情况下,HBase保留3个版本 的记录。当然,我
们也可以改变保留版本的数量,我们也可以通过指定来获取某个特定的版 本。
时间戳:
对于每个插入的数据,当前的时间戳与值是相关的,它表示了数值插入到表中的时间。
单元格
最小或基本的存储单元,在内部是一个列的实际值存储。故插单元格数 据时必须包含
rowkey+ columnfamily(列族名)+columnname(列名)+timestamp:val ue。
1.8.1 HBase中没有花哨的数据类型,它所有都是字节数组。它是一种字节进字节
出的数据库,其特征在于,当插入一个值时,HBase隐式地通过序列号框架
将数据转换成字节数组,然后存储进单元格,或者给出字节数组。
1.8.2 当添加或者获取数值时,它隐式地转换成等价的数据展示出来。
1.8.3 HBase的单元格只能容纳字节数组。任何可以转换成字节的数据都可以存储
在HBase中。
1.8.4 可以存储10-15MB的值到HBase的单元格中,但如果值太大,可以将文件存
储到HDFS中,然后在HBase中存储文件的路径。
1.8.5 不建议将一个巨大的文件或值转换成字节数组存储在HBase中;但是HDFS用
到的主机文件和文件元数据可以存储到HBase中。
下载:
hbase-0.98.6-cdh5.3.6.tar.gz
tar -zxvf hbase-0.98.6-cdh5.3.6.tar.gz
mv hbase-0.98.6-cdh5.3.6 yangyang/hbase
cd /home/hadoop/yangyang/hbase/conf
vim hbase-env.sh
jdk 目录:
export JAVA_HOME=/home/hadoop/yangyang/jdk
关闭 hbase 自身的zookeeper
export HBASE_MANAGES_ZK=false
vim hbase-site.xml
增加 如下内容
<configuration>
<property>
<name>hbase.rootdir</name>
<value>hdfs://namenode01.hadoop.com:8020/hbase</value>
</property>
<property>
<name>hbase.cluster.distributed</name>
<value>true</value>
</property>
<property>
<name>hbase.zookeeper.property.dataDir</name>
<value>/home/hadoop/yangyang/hbase/zookeeper</value>
</property>
<property>
<name>hbase.zookeeper.quorum</name>
<value>namenode01.hadoop.com</value>
</property>
<!-- hbase 的权限 设定-->
<property>
<name>hbase.superuser</name>
<value>hadoop</value>
</property>
<property>
<name>hbase.coprocessor.region.classes</name>
<value>org.apache.hadoop.hbase.security.access.AccessController</value>
</property>
<property>
<name>hbase.coprocessor.master.classes</name>
<value>org.apache.hadoop.hbase.security.access.AccessController </value>
</property>
<property>
<name>hbase.rpc.engine</name>
<value>org.apache.hadoop.hbase.ipc.SecureRpcEngine</value>
</property>
<property>
<name>hbase.security.authorization</name>
<value>true</value>
</property>
</configuration>
单机hbase 配置
echo "namenode01.hadoop.com " > regionservers
bin/start-hbase.sh
bin/hbase shell
hbase(main)> list
# 语法:create <table>, {NAME => <family>, VERSIONS => <VERSIONS>}
# 例如:创建表zaofans, 列簇为info
hbase(main)> create 'user','info';
# 语法:describe <table>
# 例如:查看表user的结构
hbase(main)> describe 'user'
分两步:首先disable,然后drop
例如:删除表zaofans
hbase(main)> disable 'zaofans'
hbase(main)> drop 'zaofans'
# 语法 : grant <user> <permissions> <table> <column family> <column qualifier> 参数后面用逗号分隔
# 权限用五个字母表示: "RWXCA".
# READ('R'), WRITE('W'), EXEC('X'), CREATE('C'), ADMIN('A')
# 例如,给用户‘test'分配对表user有读写的权限,
grant 'test','RW','user'
# 语法:user_permission <table>
# 例如,查看表user的权限列表
hbase(main)> user_permission 'user'
# 与分配权限类似,语法:revoke <user> <table> <column family> <column qualifier>
# 例如,收回test用户在表t1上的权限
hbase(main)> revoke 'test','user'
# 语法:put <table>,<rowkey>,<family:column>,<value>,<timestamp>
# 例如:给表user的添加一行记录:rowkey是1001,family name:info,column name:name,value:tom,timestamp:系统默认
hbase(main)> put 'user','1001','info:name','tom'
hbase 查询数据分三种:
1. 根据表的rowkey的 进行的查询 这种情况主要的是get 查询
2. scan range 范围扫描
3. scan 全表扫描
---
4. 统计行数
1. get 查询:
hbase(main)> get 'user','1001'
2. scan range 范围查询:
hbase(main)> scan 'user', { STARTROW => '1002' , ENDROW => '1003' }
范围查询包头不包尾
3. scan 全表扫描
hbase(main)> scan 'user'
注: 因现实情况下数据量比较大 一般不用全表扫描
统计数据表的行数
hbase(main)> count 'user'
删除行中的某个列值
# 语法:delete <table>, <rowkey>, <family:column> , <timestamp>,必须指定列名
# 例如:删除表user,1000中的info:sex的数据
hbase(main)> delete 'user','1000','info:sex'
# 语法:deleteall <table>, <rowkey>, <family:column> , <timestamp>,可以不指定列名,删除整行数据
# 例如:删除表user,1003的数据
hbase(main)> deleteall 'user','1003'
删除表中的所有数据
# 语法: truncate <table>
# 其具体过程是:disable table -> drop table -> create table
# 例如:删除表user的所有数据
hbase(main)> truncate 'user'
create namespace ns1:
在命名空间上建立表:
create 'ns1:student1','info'
查找命名空间上的表
list_namespace_tables 'ns1'
方式一:
create 't1', 'f1', SPLITS => ['10', '20', '30', '40']
ti(rowkey) Start Key End Key
region1 10
region2 10 20
region3 20 30
region4 30 40
region5 40
----
方式二:
cd /home/hadoop/
vim region.txt
20160601
20160602
20160603
20160604
create 't2', 'f1', SPLITS_FILE => '/home/hadoop/region.txt', OWNER => 'johndoe'
---
方式三: 采用十六进制的这种方式创建
create 't3', 'f1', {NUMREGIONS => 15, SPLITALGO => 'HexStringSplit'}