70图,2万字,讲透HBase知识点,文末送书(全网最全干货)

点击上方卡片进入教你学懂大数据主页

然后点击右上角 “设为星标”

比别人更快接收好文章

文档大纲:

ca900199c89538ba13a54196e356a189.png

前言

各位小伙伴大家好,最近因为公司电脑固态硬盘坏掉和大院拆迁被迫搬家的事情,心情一直比较苦闷;在周末搬完家后,想着怎么写个专题类的文章跟各位小伙伴们一起在知识的海洋中遨游下,好好用知识让我们自己放松下,最终确认下来干一篇非常全面的 HBase 文章,大家可以一键三连加评论,有相关的意见和想法可以一起讨论学习。话不多说,直接开始我们今天的正题,让我们在 HBase 海洋中尽情遨游吧:

一 HBase 简介

HBase 是一个 高可靠性高性能面向列可伸缩 的分布式存储系统,利用 HBase 技术可在廉价 PC Server 上搭建起大规模结构化存储集群。HBase 的目标是存储并处理大型的数据,更具体来说是仅需使用普通的硬件配置,就能够处理由成千上万的行和列所组成的大型数据。HBase 是  的开源实现,但是也有很多不同之处。比如:Google Bigtable 利用 GFS 作为其文件存储系统,HBase 利用 Hadoop HDFS 作为其文件存储系统;Google 运行 MAPREDUCE 来处理 Bigtable 中的海量数据,HBase 同样利用 Hadoop MapReduce 来处理 HBASE 中的海量数据;Google Bigtable 利用 Chubby 作为协同服务,HBase 利用 Zookeeper 作为对应。它介于 nosql 和 RDBMS 之间,仅能通过主键(row key)和主键的 range 来检索数据,仅支持单行事务(可通过 hive 支持来实现多表 join 等复杂操作)。主要用来存储非结构化和半结构化的松散数据。

  • HBase 与 mysql、oralce、db2、sqlserver 等关系型数据库不同,它是一个 NoSQL 数据库(非关系型数据库)

  • HBase 的表模型与关系型数据库的表模型不同:

  • HBase 与 mysql、oralce、db2、sqlserver 等关系型数据库不同,它是一个 NoSQL 数据库(非关系型数据库)

  • HBase 的表模型与关系型数据库的表模型不同:

  • HBase 的表没有固定的字段定义;

  • HBase 的表中每行存储的都是一些 key-value 对;

  • Hbase 的表中有列族的划分,用户可以指定将哪些 kv  插入哪个列族;

  • Hbase 的表在物理存储上,是按照列族来分割的,不同列族的数据一定存储在不同的文件中;

  • Hbase 的表中的每一行都固定有一个行键,而且每一行的行键在表中不能重复;

  • Hbase 中的数据,包含行键,包含 key,包含 value,都是 byte[]类型,hbase 不负责为用户维护数据类型;

  • HBASE 对事务的支持很差;

  • HBASE 相比于其他 nosql 数据库(mongodb、redis、cassendra、hazelcast)的特点:

  • Hbase 的表数据存储在 HDFS 文件系统中,所以,hbase 具备如下特性:

    • 海量存储

    • 列式存储

    • 数据存储的安全性可靠性极高

    • 支持高并发

    • 存储容量可以线性扩展

二 HBase 表的数据模型

9229b1c723a0c19023125937d9ee21f9.png
1 rowkey 行键

table 的主键,table 中的记录按照 rowkey 的字典序进行排序 Row key 行键可以是任意字符串(最大长度是 64KB,实际应用中长度一般为 10-100bytes)

2 Column Family 列族

列族或列簇 HBase 表中的每个列,都归属与某个列族 列族是表的 schema 的一部分(而列不是),即建表时至少指定一个列族 比如创建一张表,名为 user,有两个列族,分别是 info 和 data,建表语句 create 'user', 'info', 'data'

3 Column 列

列肯定是表的某一列族下的一个列,用列族名:列名表示,如 info 列族下的 name 列,表示为 info:name 属于某一个 ColumnFamily,类似于我们 mysql 当中创建的具体的列

4 cell 单元格

指定 row key 行键、列族、列,可以确定的一个 cell 单元格 cell 中的数据是没有类型的,全部是以字节数组进行存储

5 Timestamp 时间戳

可以对表中的 Cell 多次赋值,每次赋值操作时的时间戳 timestamp,可看成 Cell 值的版本号 version number;即一个 Cell 可以有多个版本的值

三 HBase 整体架构

1 Client 客户端

Client 是操作 HBase 集群的入口;对于管理类的操作,如表的增、删、改操纵,Client 通过 RPC 与 HMaster 通信完成;对于表数据的读写操作,Client 通过 RPC 与 RegionServer 交互,读写数据 Client 类型:HBase shell Java 编程接口 Thrift、Avro、Rest 等等

2 ZooKeeper 集群

作用: 实现了 HMaster 的高可用,多 HMaster 间进行主备选举;保存了 HBase 的元数据信息 meta 表,提供了 HBase 表中 region 的寻址入口的线索数据;对 HMaster 和 HRegionServer 实现了监控;

3 HMaster

HBase 集群也是主从架构,HMaster 是主的角色,是老大 主要负责 Table 表和 Region 的相关管理工作:关于 Table 管理 Client 对 Table 的增删改的操作 关于 Region 在 Region 分裂后,负责新 Region 分配到指定的 HRegionServer 上 管理 HRegionServer 间的负载均衡,迁移 region 分布 当 HRegionServer 宕机后,负责其上的 region 的迁移

4 HRegionServer

HBase 集群中的从角色,是小弟 作用:响应客户端的读写数据请求 负责管理一系列的 Region 切分在运行过程中变大的 region

5 Region

HBase 集群中分布式存储的最小单元 一个 Region 对应一个 Table 表的部分数据 HBase 使用,主要有两种形式:① 命令;②Java 编程

四 HBase 安装

HBASE 是一个分布式系统 其中有一个管理角色:HMaster(一般 2 台,一台 active,一台 backup) 其他的数据节点角色:HRegionServer(很多台,看数据量)

1 安装准备

需要先有一个 java 环境 首先,要有一个 HDFS 集群,并正常运行;regionserver 应该跟 hdfs 中的 datanode 在一起 其次,还需要一个 zookeeper 集群,并正常运行,然后,安装 HBase 角色分配如下:Hdp01: namenode datanode regionserver hmaster zookeeper Hdp02: datanode regionserver zookeeper Hdp03: datanode regionserver zookeeper

2 安装步骤

解压 HBase 安装包 修改 hbase-env.sh

export JAVA_HOME=/root/apps/jdk1.7.0_67
export HBASE_MANAGES_ZK=false

修改 hbase-site.xml

<configuration>
        <property>
                <name>hbase.rootdir</name>
                <value>hdfs://hdp01:9000/hbase</value>
        </property>

        <property>
                <name>hbase.cluster.distributed</name>
                <value>true</value>
        </property>

        <property>
                <name>hbase.zookeeper.quorum</name>
                <value>hdp01:2181,hdp02:2181,hdp03:2181</value>
        </property>
</configuration>

修改 regionservers

hdp01
hdp02
hdp03

3 启动 HBase 集群

cd /kkb/install/hbase-1.2.0-cdh5.14.2
bin/start-hbase.sh

启动完后,还可以在集群中找任意一台机器启动一个备用的 master

bin/hbase-daemon.sh start master

新启的这个 master 会处于 backup 状态

4 停止 HBase 集群

cd /kkb/install/hbase-1.2.0-cdh5.14.2
bin/stop-hbase.sh

五 HBase shell 命令基本操作

1 进入 HBase 客户端命令操作界面

node01 执行以下命令,进入 HBase 的 shell 客户端

cd /kkb/install/hbase-1.2.0-cdh5.14.2
bin/hbase shell
41dbc664fde5c1b6b332526002d28cfa.png

如果出现下图所示情况,说明 HBase 未正常启动

499ee13aeb8f3009e0066c36e6d99f62.png

以下为正常启动页面,并且有相关进程

fce3aa0716c2dd81fcb3b94b9ab6c936.png


① list 查看当前数据库中有哪些表

6954defc82ea0bc3af80e7629cf50440.png

② 查看 HBase 集群状态

6de7bd9e2eb49f4c8ce0464ac4b63a46.png

③ 查看 HBase 集群版本

907337008ac5b463c96b0b25e2672a1f.png

ps:NameSpace 操作

HBase 系统默认定义了两个缺省的 namespace
hbase:系统内建表,包括 namespace 和 meta 表
default:用户建表时未指定 namespace 的表都创建在此

创建:create_namespace 'lzc'
删除:drop_namespace 'lzc'
查看:describe_namespace 'lzc'
列出所有:list_namespace
在 namespace 下创建表:create 'lzc:user_info','id','name','age'
查看 namespace 下的表 :list_namespace_tables 'lzc'
2 HBase 表模型特点
dfd6715f2cf510eaf550a5132e856b38.png

1.一个表,有表名

2.一个表可以分为多个列族(不同列族的数据会存储在不同文件中)

3.表中的每一行有一个“行键 rowkey”,而且行键在表中不能重复

4.表中的每一对 kv 数据称作一个 cell

5.hbase 可以对数据存储多个历史版本(历史版本数量可配置)

6.整张表由于数据量过大,会被横向切分成若干个 region(用 rowkey 范围标识),不同 region 的数据也存储在不同文件中

0e7c8e0a7fe92befcc53b2760e416aa2.png

7.hbase 会对插入的数据按顺序存储:要点一:首先会按行键排序 要点二:同一行里面的 kv 会按列族排序,再按 k 排序

3 HBase 数据类型

hbase 中只支持 byte[] 此处的 byte[] 包括了:rowkey,key,value,列族名,表名

4 HBase 命令行操作

70320a304916778f48bc0ff4725cd45a.png

① help 帮助命令 hbase(main):005:0> help

b0103264e415c326ff277e6c4da69c71.png

查看具体命令的帮助信息 hbase(main):006:0> help 'create'

f2533f0674e1f728ac1e4b01b330b424.png

② create 创建表 创建 user 表,包含 info、data 两个列族 使用 create 命令 hbase(main):008:0> create 'user', 'info', 'data' 0 row(s) in 1.3080 seconds 或者 => Hbase::Table - user hbase(main):009:0> create 'user',{NAME => 'info', VERSIONS => '3'},{NAME => 'data'} ERROR: Table already exists: user!

370535b0ba2fae210ec59b012567e97e.png

③ put 插入数据操作 向表中插入数据 使用 put 命令 向 user 表中插入信息,row key 为 rk0001,列族 info 中添加名为 name 的列,值为 zhangsan HBase(main):011:0> put 'user', 'rk0001', 'info:name', 'zhangsan'

向 user 表中插入信息,row key 为 rk0001,列族 info 中添加名为 gender 的列,值为 female HBase(main):012:0> put 'user', 'rk0001', 'info:gender', 'female'

向 user 表中插入信息,row key 为 rk0001,列族 info 中添加名为 age 的列,值为 20 HBase(main):013:0> put 'user', 'rk0001', 'info:age', 20

向 user 表中插入信息,row key 为 rk0001,列族 data 中添加名为 pic 的列,值为 picture HBase(main):014:0> put 'user', 'rk0001', 'data:pic', 'picture'

956c49d1046c1afb67d94ed650c15f53.png

④ 查询数据操作一 查询方式一 使用 get 命令通过 rowkey 进行查询 获取 user 表中 row key 为 rk0001 的所有信息(即所有 cell 的数据) 使用 get 命令 HBase(main):015:0> get 'user', 'rk0001'

6c2a3094911aaed8251345f061695402.png

使用 get 命令查看 rowkey 下某个列族的信息 获取 user 表中 row key 为 rk0001,info 列族的所有信息 HBase(main):016:0> get ‘user’, ‘rk0001’, ‘info’

10a9616cce1db0a427a5b8e6b9142cef.png

使用 get 命令查看 rowkey 指定列族指定字段的值 获取 user 表中 row key 为 rk0001,info 列族的 name、age 列的信息 HBase(main):017:0> get 'user', 'rk0001', 'info:name', 'info:age'

48a8e49a16bc3df29b92763ce2ced48c.png cdbf9a6ea5e52438d99a836a642208e5.png

使用 get 命令查看 rowkey 指定多个列族的信息 获取 user 表中 row key 为 rk0001,info、data 列族的信息 HBase(main):018:0> get 'user', 'rk0001', 'info', 'data'

或者你也可以这样写 HBase(main):019:0> get 'user', 'rk0001', {COLUMN => ['info', 'data']}

或者你也可以这样写,也行 HBase(main):020:0> get 'user', 'rk0001', {COLUMN => ['info:name', 'data:pic']}

57d67e8bc3167945a3d61ab6d6a28cda.png

使用 get 命令指定 rowkey 与列值过滤器查询 获取 user 表中 row key 为 rk0001,cell 的值为 zhangsan 的信息 HBase(main):021:0> get 'user', 'rk0001', {FILTER => "ValueFilter(=, 'binary:zhangsan')"}

983af4867e24c7420299e61a527f5ff7.png

使用 get 命令指定 rowkey 与列名模糊查询 获取 user 表中 row key 为 rk0001,列标示符中含有 a 的信息 HBase(main):022:0> get 'user', 'rk0001', {FILTER => "QualifierFilter(=,'substring:a')"}

75b5747e2877b5a1d22030972cfb553c.png

继续插入一批数据 HBase(main):023:0> put 'user', 'rk0002', 'info:name', 'fanbingbing' HBase(main):024:0> put 'user', 'rk0002', 'info:gender', 'female' HBase(main):025:0> put 'user', 'rk0002', 'info:nationality', '中国' HBase(main):026:0> get 'user', 'rk0002', {FILTER => "ValueFilter(=, 'binary:中国')"}

bc39b1a6a735d0e824af9b5a127c17c3.png

⑤ 查询所有行的数据二查询 user 表中的所有信息 使用 scan 命令 HBase(main):027:0> scan 'user'

a28d5d6d6543f897f13f983e8f204de7.png

使用 scan 命令进行列族查询 查询 user 表中列族为 info 的信息

scan 'user', {COLUMNS => 'info'}

dd2cdc7c82f5235fb7ff922b316f3044.png

//当把某些列的值删除后,具体的数据并不会马上从存储文件中删除;查询的时候,不显示被删除的数据;如果想要查询出来的话,RAW => true scan 'user', {COLUMNS => 'info', RAW => true, VERSIONS => 5}

cf228b1e98674c7524cd8fb7bdf2200b.png

scan 'user', {COLUMNS => 'info', RAW => true, VERSIONS => 3}

80f6aac22fdcb46c0a2163cf0d7e922c.png

使用 scan 命令进行多列族查询 查询 user 表中列族为 info 和 data 的信息 scan 'user', {COLUMNS => ['info', 'data']}

b6f5acbace07cf90a9338142cb03d16c.png

使用 scan 命令指定列族与某个列名查询 查询 user 表中列族为 info、列标示符为 name 的信息 scan 'user', {COLUMNS => 'info:name'}

5fcba220104c9c48c75813a0af2f7ffd.png

查询 info:name 列、data:pic 列的数据 scan 'user', {COLUMNS => ['info:name', 'data:pic']}

425727caba0ba7cf25778d48bdcc6b21.png

查询 user 表中列族为 info、列标示符为 name 的信息,并且版本最新的 5 个 scan 'user', {COLUMNS => 'info:name', VERSIONS => 5}

198db375195b35584f3615f6988fbc55.png

使用 scan 命令指定多个列族与条件模糊查询 查询 user 表中列族为 info 和 data 且列标示符中含有 a 字符的信息 scan 'user', {COLUMNS => ['info', 'data'], FILTER => "QualifierFilter(=,'substring:a')"}

30146b3a7263eeccdd4f25f7ef9b6261.png

使用 scan 命令指定 rowkey 的范围查询 查询 user 表中列族为 info,rk 范围是[rk0001, rk0003)的数据 scan 'user', {COLUMNS => 'info', STARTROW => 'rk0001', ENDROW => 'rk0003'}

dbd2f428190717ee56667d6a97d04fbe.png

使用 scan 命令指定 rowkey 模糊查询 查询 user 表中 row key 以 rk 字符开头的数据7813f0b587251258c7b2e14c3d160dbb.png

使用 scan 命令指定数据版本的范围查询 查询 user 表中指定范围的数据(前闭后开) scan 'user', {TIMERANGE => [1392368783980, 1392380169184]}

0e92d7151a4a2f77eded418813dc962c.png

hbase(main):039:0> scan 'user', {TIMERANGE => [1615386788707,1615386809222]}

63f91db3a95850c035e26357e0d90d57.png

⑥ 更新数据操作 1 更新数据值 更新操作同插入操作一模一样,只不过有数据就更新,没数据就添加 使用 put 命令 2 更新版本号 将 user 表的 f1 列族版本数改为 5 HBase(main):040:0> alter 'user', NAME => 'info', VERSIONS => 5

673ad7ef5eff6db2cc3d955c00021fe1.png

⑦ 删除数据以及删除表操作 1 指定 rowkey 以及列名进行删除 删除 user 表 row key 为 rk0001,列标示符为 info:name 的数据(删除一个 kv 数据) HBase(main):041:0> delete 'user', 'rk0001', 'info:name'

753fe9c515c2a3a70c794f61d8fcc682.png

删除整行数据

hbase(main):024:0> deleteall 't_user_info','001'
0 row(s) in 0.0090 seconds
hbase(main):025:0> get 't_user_info','001'
COLUMN CELL  
0 row(s) in 0.0110 seconds

2 指定 rowkey,列名以及版本号进行删除 删除 user 表 row key 为 rk0001,列标示符为 info:name,timestamp 为 1392383705316 的数据 hbase(main):042:0> delete 'user', 'rk0001', 'info:name', 1392383705316

40fc4fc8916239eace6d9ba47b4d74ee.png

3 删除一个列族 删除一个列族:alter 'user', NAME => 'info', METHOD => 'delete' 或 alter 'user', 'delete' => 'info'

426dd6cb8dc57ca8cc565dfa3e8362be.png

4 清空表数据 HBase(main):045:0> truncate 'user'

36e1431a30ba3c7cf5c8bbe91612669f.png

5 删除表 首先需要先让该表为 disable 状态,使用命令:HBase(main):049:0> disable 'user' 然后使用 drop 命令删除这个表 HBase(main):050:0> drop 'user'

ca608f0d758e910ffe4460d3768943fa.png

(注意:如果直接 drop 表,会报错:Drop the named table. Table must first be disabled)

9480c5253c9f099ed7559cd9adaccb0e.png

⑧ 统计一张表有多少行数据 HBase(main):046:0> count 'user'

460da6e1a6b94cc5a1d5a600b9e64c47.png

六 HBase 的高级 shell 管理命令

1 status 例如:显示服务器状态 HBase(main):051:0> status 'node01'

b455844bc1e7349a7c428286d35c56ef.png

2 whoami 显示 HBase 当前用户,例如:HBase> whoami

b137046784a532fc30c5467baf3d38a6.png

3 list 显示当前所有的表 HBase > list

d987f31477f7ce3190b05ed61af006e6.png

4 count 统计指定表的记录数,例如:HBase> count 'user'

1420694a63d1e79382ac7681839ebe3d.png

为了展示下面功能,然后重新创建 user 表,并插入数据 创建 user 表,包含 info、data 两个列族 使用 create 命令

hbase(main):008:0> create 'user', 'info', 'data'
0 row(s) in 1.3080 seconds

向表中插入数据 使用 put 命令 向 user 表中插入信息,row key 为 rk0001,列族 info 中添加名为 name 的列,值为 zhangsan

HBase(main):011:0> put 'user', 'rk0001', 'info:name', 'zhangsan'

向 user 表中插入信息,row key 为 rk0001,列族 info 中添加名为 gender 的列,值为 female

HBase(main):012:0> put 'user', 'rk0001', 'info:gender', 'female'

向 user 表中插入信息,row key 为 rk0001,列族 info 中添加名为 age 的列,值为 20

HBase(main):013:0> put 'user', 'rk0001', 'info:age', 20

向 user 表中插入信息,row key 为 rk0001,列族 data 中添加名为 pic 的列,值为 picture

HBase(main):014:0> put 'user', 'rk0001', 'data:pic', 'picture'

af2b364a96f372fe04c2fc7e84af53db.png

5 describe 展示表结构信息 HBase> describe 'user'

cdf98dc5184716b72ab6e565f4701737.png

6 exists 检查表是否存在,适用于表量特别多的情况

e4a49d4cbfefe838ccc4a7d697125b00.png

7 is_enabled、is_disabled 检查表是否启用或禁用 HBase> is_enabled 'user' HBase> is_disabled 'user'

7abf8452189846b2712a5f688be64e5f.png

8 alter 该命令可以改变表和列族的模式,例如:为当前表增加列族:HBase> alter ‘user’, NAME => 'CF2', VERSIONS => 2

033931061dcd082a7c8f1a9d5bd717bf.png

为当前表删除列族:HBase(main):002:0> alter 'user', 'delete' => 'CF2'

cfc3225abb79d3fb6f7790fb33534903.png

9 disable/enable 禁用一张表/启用一张表 HBase> disable 'user' HBase> enable 'user'

10 drop 删除一张表,记得在删除表之前必须先禁用

11 truncate 禁用表-删除表-创建表

七 Hive 与 HBase 的集成

Hive 提供了与 HBase 的集成,使得能够在 HBase 表上使⽤ HQL 语句进⾏查 询 插⼊操作以及进⾏ Join 和 Union 等复杂查询、同时也可以将 hive 表中的 数据映射到 Hbase 中。


版本说明: 

hbase 版本:hbase-1.2.0-cdh5.14.2

hive 版本:hive-1.1.0-cdh5.14.2

数据模型:

row,addres,age,username 

001,guangzhou,20,alex 

002,shenzhen,34,jack 

003,beijing,23,lili

create 'stu20210308','info'
put 'stu20210308','001','info:addres','guangzhou'
put 'stu20210308','001','info:age','20'
put 'stu20210308','001','info:username','alex'
put 'stu20210308','002','info:addres','shenzhen'
put 'stu20210308','002','info:age','34'
put 'stu20210308','002','info:username','jack'
put 'stu20210308','003','info:addres','beijing'
put 'stu20210308','003','info:age','23'
put 'stu20210308','003','info:username','lili'

创建 HBase 的数据:

create 'stu20210308','info'
put 'stu20210308','001','info:addres','guangzhou'
put 'stu20210308','001','info:age','20'
put 'stu20210308','001','info:username','alex'
put 'stu20210308','002','info:addres','shenzhen'
put 'stu20210308','002','info:age','34'
put 'stu20210308','002','info:username','jack'
put 'stu20210308','003','info:addres','beijing'
put 'stu20210308','003','info:age','23'
put 'stu20210308','003','info:username','lili'
ecec1223c1705ac0a9e7d994f849bf90.png f613e68f2499f03274d0fc5ed2cc78bd.png

ps:退出 HBASE 指令是!quit 创建与 HBase 集成的 Hive 的外部表:

CREATE EXTERNAL TABLE stu20210308(
id string,
addres string,
age string,
username string)
STORED BY 'org.apache.hadoop.hive.hbase.HBaseStorageHandler'
WITH SERDEPROPERTIES (
"hbase.columns.mapping" =
":key,info:addres,info:age,info:username")
TBLPROPERTIES ("hbase.table.name" = "stu20210308");
hive (test)> CREATE EXTERNAL TABLE stu20210308( > id string, > addres string, > age string, > username string) > STORED BY 'org.apache.hadoop.hive.hbase.HBaseStorageHandler' > WITH SERDEPROPERTIES ( > "hbase.columns.mapping" = > ":key,info:addres,info:age,info:username") > TBLPROPERTIES ("hbase.table.name" = "stu20210308");
OK
Time taken: 1.933 seconds
hive (test)> select * from stu20210308;
OK
stu20210308.id stu20210308.addres stu20210308.age stu20210308.username
001 guangzhou 20 alex
002 shenzhen 34 jack
003 beijing 23 lili
Time taken: 0.09 seconds, Fetched: 3 row(s)

fdd5191c3b062cd5bd91f0e6761e0ca2.png

ps:具体这里可查看 Hive 与 HBase 的集成 Hive 表映射 HBase 实例二 建 HBase 表 hbase(main):018:0> create ‘user_info’,‘info’ 数据插入 HBase info:order_amt info:order_id info:user_id info:user_name

fa5f1e89fbd690b4c0b56d79152ea0ab.png

建 hive 映射表

create external table wedw_tmp.t_user_info
(
id string
,order_id string
,order_amt string
,user_id string
,user_name string
)
STORED by 'org.apache.hadoop.hive.hbase.HBaseStorageHandler'
with serdeproperties("hbase.columns.mapping"=":key,info:order_id,info:order_amt,info:user_id,info:user_name")
tblproperties("hbase.table.name"="user_info");

查询映射好的 hive 表 select * from wedw_tmp.t_user_info;

f68f82a83d0d8e1efab8afd8f086c9e1.png

八 HBase 客户端 API 操作

表创建 增加数据 删除数据 全表扫描 过滤器 匹配

九 phoenix 操作 HBase

Phoenix,由 saleforce.com 开源的一个项目,后又捐给了 Apache。它相当于一个 Java 中间件,帮助开发者,像 使用 jdbc 访问关系型数据库一样,访问 NoSql 数据库 HBase。Apache Phoenix 与其他 Hadoop 产品完全集成,如 Spark,Hive,Pig,Flume 和 MapReduce。

1 安装 pheonix
1.1 下载 pheonix

http://phoenix.apache.org/download.html 注意:下载 Phoenix 的时候,请注意对应的版本,其中 4.14 版本可以运行在 HBase0.98、1.1、1.2、1.3、1.4 上。下载时也可以直接使用:

wget http://mirrors.shu.edu.cn/apache/phoenix/apache-phoenix-4.14.0-HBase-1.2/bin/apache-phoenix-4.14.0-HBase-1.2-bin.tar.gz
1.2 解压 pheonix
tar -zxvf apache-phoenix-4.14.0-HBase-1.2-bin.tar.gz
1.3 整合 phoenix 到 hbase

查看 Phoenix 下的所有的文件,将 phoenix-4.14.0-HBase-1.2-server.jar 拷贝到所有 HBase 节点(包括 Hmaster 以及 HregionServer)的 lib 目录下:

重启 HBase:
bin/stop-hbase.sh
bin/start-hbase.sh
1.4 使用 phoenix SQL 命令行

进入 Phoenix 的安装包,执行:

bin/sqlline.py bigdata1:2181

3a326c78720ca283d02ef0c5ab6ef8fb.png

1.4.1 创建表

在 Phoenix 终端下创建 us_population 表:

> > CREATE TABLE IF NOT EXISTS us_population (
> > state CHAR(2) NOT NULL,
> > city VARCHAR NOT NULL,
> > population BIGINT
> > CONSTRAINT my_pk PRIMARY KEY (state, city));

使用!tables 查看创建的表:

> > !tables

b76fbaf17e111bc028e23097e80fc00d.png

1.4.2 编辑并导入数据

在 Phoenix 目录下创建一个 data 目录,在 data 目录下创建:vi us_population.csv

NY,New York,8143197
CA,Los Angeles,3844829
IL,Chicago,2842518
TX,Houston,2016582
PA,Philadelphia,1463281
AZ,Phoenix,1461575
TX,San Antonio,1256509
CA,San Diego,1255540
TX,Dallas,1213825
CA,San Jose,912332

执行 bin/psql.py data/us_population.csv 导入数据。除了导入数据外,还可以使用 Phoenix 的语法插入数据:upsert into us_population values('NY','NewYork',8143197);

1.4.3 查询数据

方式一:在 data 目录下创建 us_population_queries.sql 文件:

SELECT state as "State",count(city) as "City Count",sum(population) as "Population Sum"
FROM us_population
GROUP BY state
ORDER BY sum(population) DESC;

执行 bin/psql.py data/us_population_queries.sql 检索数据。方式二:使用命令行终端

bin/sqlline.py bigdata1:2181

> > select * from us_populcation;

8bbcd1406ebce6357038d2c5d07278c9.png

2 Squirrel-sql 连接 Phoenix
2.1 下载 Squirrel-sql

http://www.squirrelsql.org/#installation

2.2 设置 Squirrel-sql 连接 Phoenix

拷贝 Phoenix Client jar【phoenix-4.14.0-HBase-1.2-client.jar】到 Squirrel-sql 的 lib 目录;

f002a6d893301745d23ffb824643d5f5.png

设置 Phoenix 连接的 Driver 信息,其中 localhost 为 zookeeper 所在的主机地址,填写一个即可。

1290781c7bdc2d4bf89ab84d44eafc29.png

7ca528859e64d3ae1b5072430b6eafb2.png

772d71f45629c7d56a1a49c6171e8083.png

3 Phoenix 映射 Hbase 表

进入 Hbase 命令行终端 bin/hbase shell 创建 Hbase 表’phoenix’:

– 创建 Hbase 表 Phoenix,列族 info create 'phoenix','info'

– 添加数据 put 'phoenix', 'row001','info:name','phoenix' put 'phoenix', 'row002','info:name','hbase'

映射 HBase 表的方式有两种,一直是视图映射,一种是表映射。两者的区别就是对 HBase 的物理表有没有影响;删除 Phoenix 视图映射不会对 Hbase 的表造成影响;删除 Phoenix 表映射会将 Hbase 的表也删除;非必要情况下一般创建视图映射。

3.1 视图映射

在 Phoenix 下创建视图映射 HBase 表:

-- 创建视图关联映射 Hbase 表
create view "phoenix" (
pk VARCHAR primary key,
"info"."name" VARCHAR
);

查询创建好的 Phoenix 视图:

969a4a97b741a0f835b046567a103e12.png

– 删除视图后,在 hbase shell 终端下查看 phoenix 依然存在

drop view "phoenix";
3.2 表映射

在 Phoenix 下创建表映射 HBase 表:– 创建表关联映射 Hbase 表,4.10 以后 Phoenix 优化了列映射,COLUMN_ENCODED_BYTES=0 禁用列映射。

create table "phoenix" (
pk VARCHAR primary key,
"info"."name" VARCHAR
) COLUMN_ENCODED_BYTES = 0;

查询数据:

5967da061cafc286e4113b09b408f51b.png

结语:本篇文章介绍到此结束,码字不易,如果本篇文章对您有所帮助,麻烦动动发财的小手,三连点赞,关注,收藏支持下。有需要沟通交流的,可随时沟通交流,多谢大家支持!!!

7a7d51374d65051b8b8e19f03e4b6aa1.png

本文档总共九章,因字数限制,本文只发了前四章,如获取此Hbase完整版文档,请给本文在看+转发朋友圈,然后下方扫码加我微信发送转发朋友圈截图即可获取完整版PDF文档!(人数较多,发完截图请耐心等待下)

152b37dc120fa9a57903bf5815aebcbb.png

如不方便转发朋友圈,加我微信说明情况也可获取完整版PDF文档!

--END--

aaf3a353f12849ef8d7d9e7d145a8d38.png

读者福利


书籍: 共1本, 《HBase 原理与实践 》

「HBase 原理与实践」,HBase PMC成员与网易资深工程师倾力打造,多位技术专家联袂推荐。深入HBase内核,抽丝剥茧,剖析HBase数据库的底层原理与开发运维。

02c47f7e3a07ff383af2fcc4ef27b37b.png

1c38dcbb7ad1a681b6f3ec5d1bd439b5.png

赠送规则: 「转发本文到朋友圈」+ 「留言」,文章内容相关或大数据相关走心留言才可上墙,留言点赞数最多读者将获得一本。

注意事项: 禁止刷赞,发现后将进入黑名单,取消资格,最终获赠者请在24小时内微信私聊我领取

加微信,进「教你学懂大数据」,备注「进群」, 群内有多位技术大佬在线答疑

d7bb1537efdb57a6d87d5e2dc6be44b7.png

欢迎加入知识星球,向我提问

7afa0f6501fdc971c1e825a9f2acaf6d.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值