Hadoop(五)HBase基础

Apache HBase是Hadoop的数据库,一个分布式的,可扩展的,大数据存储组件。

Apache HBase适合随机的、实时的读写你的大数据场景,HBase的目标是管理非常大的表,在商业硬件集群上管理10亿行级别和500W列级别的数据。HBase是一个开源的,分布式的,版本化的非关系数据库,模仿Google的Bigtable,BigTable是结构化数据分布式存储系统。正如Bigtable利用Google的分布式文件系统,提供分布式数据存储,Apache HBase在Hadoop和HDFS之上,提供类似Bigtable的功能。

HBase可支持千万级别的QPS,PB级别的存储。

一,概述

HBase一般使用Hadoop HDFS作为它的数据存储,使用MapReduce处理数据,Zookeeper作为分布式协调服务。

HBase存储<K,V>数据,支持数据版本。HBase的几个关键概念:

表(Table)

HBase会将数据组织进一张张的表里面,但是需要注意的是表名必须是能用在文件路径里的合法名字,因为HBase的表是映射成hdfs上面的文件。

行(Row) 

在表里面,每一行代表着一个数据对象,每一行都是以一个行键(Row Key)来进行唯一标识的,行键并没有什么特定的数据类型,以二进制的字节来存储。

rowkey

  • 决定一行数据的唯一标识
  • RowKey是按照字典顺序排序的。
  • Row key最多只能存储64k的字节数据。

列簇

  • HBase的每个列都属于某个列簇,列簇表结构定义的一部分预先给出,如create 'user' 'info' 'office'
  • 列名以列簇作为前缀,每个“列簇”都可以有多个列成员(column,每个列族中可以存放几千~上千万个列);如 info:name, office:company,新的列簇成员(列)可以随后按需、动态加入。列簇下面可以有多个列,所以可以简单的理解为,HBase中的列是二级列,也就是说列簇是第一级列,列是第二级列。两个是父子关系。
  •  权限控制、存储以及调优都是在列簇层面进行的。
  • HBase把同一列簇里面的数据存储在同一目录下,由几个文件保存。

时间戳

  • 在HBase每个cell存储单元对同一份数据有多个版本,根据唯一的时间 戳来区分每个版本之间的差异,不同版本的数据按照时间倒序排序,最新的数据版本排在最前面。
  • 时间戳的类型是64位整型。
  • 时间戳可以由HBase(在数据写入时自动)赋值,此时时间戳是精确到毫 秒的当前系统时间。
  • 时间戳也可以由客户显式赋值,如果应用程序要避免数据版本冲突, 就必须自己生成具有唯一性的时间戳。

Cell单元格:

  • 由行和列的坐标交叉决定;
  • 单元格是有版本的(由时间戳来作为版本);
  • 单元格的内容是未解析的字节数组(Byte[]),cell中的数据是没有类型的,全部是字节码形式存贮。
  • 由{row key,column(=<family> +<qualifier>),version}唯一确定的单元。

使用关系数据库的理解方式去看待HBase的各个基本概念,如下图。

ä¸è½½.jpg

 

二,应用场景

HBase可以用作数据库,也可以用作存储,拥有双重属性的HBase具有广阔的应用场景。引入MOB,可以存储10M左右的对象,完全适应对象存储。

对象存储,HBase的引入MOB支持对象存储,新闻,图片,网页,文件,文档都可以认为是对象。

时序数据,HBase之上有OpenTSDB模块,满足时序类场景需求。

推荐画像,用户画像,稀疏矩阵。

时空数据,主要有轨迹,气象,网络等数据。

CubeDB OLAP,基于离线计算构建cube,存储在hbase之中,满足在线报表查询。

消息/订单,在电信、银行领域,订单,通信,消息的同步应用构建在HBase之上。

Feeds流,类似于xxx朋友圈的应用。

NewSQL,基于Phoenix插件,满足二级索引,SQL需求。但是不支持事务。

三,搭建、运行单节点Hbase

单节点也具有所有HBase的关键组成,Master,RegionServer,Zookeeper,在Java JVM中运行,数据持久化到本地文件系统。通过了解最基本的配置文件,了解Hbase Shell了解如何创建表,插入表,扫描表等关于HBase的各种操作。

HBase依赖JDK,首先安装JDK。

3.1,下载

下载官方Stable版本二进制tar包安装

[root@ecs-7bc6-0001 hbase]# wget https://mirrors.tuna.tsinghua.edu.cn/apache/hbase/stable/hbase-1.4.10-bin.tar.gz

解压,并进入目录

[root@ecs-7bc6-0001 hbase]# tar -zxvf hbase-1.4.10-bin.tar.gz

[root@ecs-7bc6-0001 hbase]# cd hbase-1.4.10

3.2,配置

在启动HBase之前,首先需要设置Java环境变量,或者需要在./conf/hbase.env中配置,配置自己的Java安装目录。hbase-site.xml是HBase主要的配置文件,接下来需要指定一个本地文件系统的目录,HBase和Zookeeper在这个目录写数据,确认风险。默认情况下,在/tmp目录下会创建一个新的目录,很多服务都会在系统重启的时候删除/tmp下的内容,所以你需要保存数据在别的地方。下面是如何配置目录,目录在testuse的用户主目录,将<property>标记粘贴到<configuration>标签下面,在新安装HBase的hbase-site.xml中<configuration>下应该为空。

<configuration>
  <property>
    <name>hbase.rootdir</name>
    <value>file:///home/root/hbase</value>
  </property>
  <property>
    <name>hbase.zookeeper.property.dataDir</name>
    <value>/home/root/zookeeper</value>
  </property>
  <property>
    <name>hbase.unsafe.stream.capability.enforce</name>
    <value>false</value>
    <description>
      Controls whether HBase will check for stream capabilities (hflush/hsync).
Disable this if you intend to run on LocalFileSystem, denoted by a rootdir
      with the 'file://' scheme, but be mindful of the NOTE below.
WARNING: Setting this to false blinds you to potential data loss and
      inconsistent system state in the event of process and/or node failures. If
      HBase is complaining of an inability to use hsync or hflush it's most
      likely not a false positive.
    </description>
  </property>
</configuration>

不需要创建目录,HBase会自动创建目录,如果是基于Hadoop的HBase,需要配置类似

hdfs://namenode.example.org:8020/hbase

3.3,启动并测试

启动

./bin/start-base.sh

启动之后使用jps查看JVM进程。可以看到HMaster进程。

[root@ecs-7bc6-0001 hbase-2.2.0]# jps

17171 HMaster

27322 Jps

测试

3.3.1,连接到HBase shell,使用HBase安装目录下的bin目录下的hbase shell命令打开HBase shell

[root@ecs-7bc6-0001 hbase-2.2.0]# ./bin/hbase shell
SLF4J: Class path contains multiple SLF4J bindings.
SLF4J: Found binding in [jar:file:/home/work/package/hadoop/hadoop-2.7.7/share/hadoop/common/lib/slf4j-log4j12-1.7.10.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in [jar:file:/home/work/docker/hbase/hbase-2.2.0/lib/client-facing-thirdparty/slf4j-log4j12-1.7.25.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation.
SLF4J: Actual binding is of type [org.slf4j.impl.Log4jLoggerFactory]
HBase Shell
Use "help" to get list of supported commands.
Use "exit" to quit this interactive shell.
For Reference, please visit: http://hbase.apache.org/2.0/book.html#shell
Version 2.2.0, rUnknown, Tue Jun 11 04:30:30 UTC 2019
Took 0.0030 seconds                                                                                                                                                                                                                             
hbase(main):001:0>

3.3.2,创建表,使用create命令创建表,需要指定表明和列簇名称

hbase(main):004:0* create 'user', 'info'
Created table user
Took 1.7162 seconds                                                                                                                                                                                                                             
=> Hbase::Table - user

3.3.3,列出创建表的信息

使用list命令查看表是否存在

hbase(main):006:0* list 'user'
TABLE                                                                                                                                                                                                                                           
user                                                                                                                                                                                                                                            
1 row(s)
Took 0.0168 seconds                                                                                                                                                                                                                             
=> ["user"]

使用describe命令查看表的详细信息,包括默认的配置。

hbase(main):008:0> describe 'user'
Table user is ENABLED                                                                                                                                                                                                                           
user                                                                                                                                                                                                                                            
COLUMN FAMILIES DESCRIPTION                                                                                                                                                                                                                     
{NAME => 'info', VERSIONS => '1', EVICT_BLOCKS_ON_CLOSE => 'false', NEW_VERSION_BEHAVIOR => 'false', KEEP_DELETED_CELLS => 'FALSE', CACHE_DATA_ON_WRITE => 'false', DATA_BLOCK_ENCODING => 'NONE', TTL => 'FOREVER', MIN_VERSIONS => '0', REPLIC
ATION_SCOPE => '0', BLOOMFILTER => 'ROW', CACHE_INDEX_ON_WRITE => 'false', IN_MEMORY => 'false', CACHE_BLOOMS_ON_WRITE => 'false', PREFETCH_BLOCKS_ON_OPEN => 'false', COMPRESSION => 'NONE', BLOCKCACHE => 'true', BLOCKSIZE => '65536'}       

1 row(s)

QUOTAS                                                                                                                                                                                                                                          
0 row(s)
Took 0.0287 seconds

3.3.4,给表中插入数据,使用put命令

hbase(main):015:0* put 'user', 'row1', 'info:name', 'weihoa'
Took 0.1102 seconds                                                                                                                                                                                                                             
hbase(main):019:0* put 'user', 'row1', 'info:age', '25'
Took 0.0066 seconds                                                                                                                                                                                                                             
hbase(main):022:0* put 'user', 'row1', 'info:address', 'xian'
Took 0.0039 seconds                                                                                                                                                                                                                             
hbase(main):025:0* put 'user', 'row1', 'info:sex', 'male'

3.3.5,一次性查找表的所有数据,scan命令是一种从HBase查询数据的方式,scan命令全表扫描数据,也可以limit输出,现在查询所有数据。

hbase(main):038:0* scan 'user'
ROW                                                           COLUMN+CELL                                                                                                                                                                       
 row1                                                         column=info:address, timestamp=1564034929590, value=xian                                                                                                                          
 row1                                                         column=info:age, timestamp=1564034921709, value=25                                                                                                                                
 row1                                                         column=info:name, timestamp=1564034907973, value=weihoa                                                                                                                           
 row1                                                         column=info:phone, timestamp=1564034998413, value=18888888888                                                                                                                     
 row1                                                         column=info:sex, timestamp=1564034946493, value=male                                                                                                                              
1 row(s)
Took 0.0093 seconds

插入三条记录,其中row1是rowkey,info:name代表info列簇下的info列,weihao代表info列的值

3.3.6,获取一行数据,使用get命令,通过指定rowkey

hbase(main):041:0* get 'user', 'row1'
COLUMN                                                        CELL                                                                                                                                                                              
 info:address                                                 timestamp=1564034929590, value=xian                                                                                                                                               
 info:age                                                     timestamp=1564034921709, value=25                                                                                                                                                 
 info:name                                                    timestamp=1564034907973, value=weihoa                                                                                                                                             
 info:phone                                                   timestamp=1564034998413, value=18888888888                                                                                                                                        
 info:sex                                                     timestamp=1564034946493, value=male                                                                                                                                               
1 row(s)
Took 0.0233 seconds 

3.3.7,失效表,如果你想删除表或者想该表表的设置,或者在其他的场景中,你需要先失效这张表,使用disable命令,可以使用enable命令重新启用表

hbase(main):044:0* disable 'user'
Took 0.8237 seconds
hbase(main):046:0> describe 'user'
Table user is DISABLED                                                                                                                                                                                                                          
user                                                                                                                                                                                                                                            
COLUMN FAMILIES DESCRIPTION                                                                                                                                                                                                                     
{NAME => 'info', VERSIONS => '1', EVICT_BLOCKS_ON_CLOSE => 'false', NEW_VERSION_BEHAVIOR => 'false', KEEP_DELETED_CELLS => 'FALSE', CACHE_DATA_ON_WRITE => 'false', DATA_BLOCK_ENCODING => 'NONE', TTL => 'FOREVER', MIN_VERSIONS => '0', REPLIC
ATION_SCOPE => '0', BLOOMFILTER => 'ROW', CACHE_INDEX_ON_WRITE => 'false', IN_MEMORY => 'false', CACHE_BLOOMS_ON_WRITE => 'false', PREFETCH_BLOCKS_ON_OPEN => 'false', COMPRESSION => 'NONE', BLOCKCACHE => 'true', BLOCKSIZE => '65536'}     

1 row(s)

QUOTAS                                                                                                                                                                                                                                          
0 row(s)
Took 0.0393 seconds                                                                                                                                                                                                                             
hbase(main):047:0> get 'user', 'row1'
COLUMN                                                        CELL                                                                                                                                                                              

ERROR: Table user is disabled!

For usage try 'help "get"'

Took 0.6623 seconds                                                                                                                                                                                                                             
hbase(main):048:0> enable 'user'
Took 0.7444 seconds                                                                                                                                                                                                                             
hbase(main):049:0> get 'user', 'row1'
COLUMN                                                        CELL                                                                                                                                                                              
 info:address                                                 timestamp=1564034929590, value=xian                                                                                                                                               
 info:age                                                     timestamp=1564034921709, value=25                                                                                                                                                 
 info:name                                                    timestamp=1564034907973, value=weihoa                                                                                                                                             
 info:phone                                                   timestamp=1564034998413, value=18888888888                                                                                                                                        
 info:sex                                                     timestamp=1564034946493, value=male                                                                                                                                               
1 row(s)
Took 0.0407 seconds
  

3.3.8,删除表,使用drop命令删除表。

hbase(main):052:0* drop 'user'

ERROR: Table user is enabled. Disable it first.

For usage try 'help "drop"'

Took 0.0178 seconds                                                                                                                                                                                                                             
hbase(main):053:0> 
hbase(main):054:0* 
hbase(main):055:0* 
hbase(main):056:0* disable 'user'
Took 0.7429 seconds                                                                                                                                                                                                                             
hbase(main):057:0> drop 'user'
Took 0.4543 seconds

3.3.9,退出Hbase Shell使用quit或者Ctrl+C退出Hbase。

(完)(^_^)

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值