文档章节

[喵咪大数据]Hbase搭建和基本使用

喵了_个咪
 喵了_个咪
发布于 2017/12/31 10:56
字数 2939
阅读 232
收藏 13

[喵咪大数据]Hbase搭建和基本使用

说完了Hive我们接着来看另外一个建立在Hadoop基础上的存储引擎HBase,HBase以内存作为缓存数据落地到HDFS的Key-Value数据库,因为使用内存缓存极大保障了数据的实时性和实时查询能力,在实时场景的大数据存储HBase是不可或缺的解决方案,常见又在使用这项技术的业务就是短链,比如你在微信给你的朋友发个URL最终你的朋友获取到的是微信的一个短链接(QQ淘宝都是如此),在HBase中就存储了这样一个对应关系,这一切都归功于HBase的吞吐量和实时响应速度.

附上:

Hbase官网:Apache HBase – Apache HBase™ Home

喵了个咪的博客:w-blog.cn

1. 准备工作

准备软件包

zookeeper-3.4.10.tar.gz
hbase-1.3.1-bin.tar.gz

Hbase依赖于Zookeeper和Hadoop集群所以我们在之前配置好的Hadoop集群下来配置整体的Hbase集群 服务器清单

$ hadoop-1      192.168.1.101    NameNode DataNode
$ hadoop-2      192.168.1.102    DataNode
$ hadoop-3      192.168.1.103    DataNode

Zookeeper安装

> cd /app/install/
> tar -zxvf zookeeper-3.4.10.tar.gz
> mv zookeeper-3.4.10 /usr/local/

修改配置文件

> cd /usr/local/zookeeper-3.4.10/conf/
> cp zoo_sample.cfg zoo.cfg
> vim zoo.cfg
tickTime=2000
dataDir=/usr/local/zookeeper-3.4.10/data
clientPort=2181
initLimit=10
syncLimit=5
server.1=hadoop-1:2888:3888
server.2=hadoop-2:2888:3888
server.3=hadoop-3:2888:3888

所有节点修改环境变量

> vim /etc/profile
# zookeeper
export ZOOKEEPER_HOME=/usr/local/zookeeper-3.4.10
export PATH=$ZOOKEEPER_HOME/bin:$PATH
> source /etc/profile

将zookeeper目录复制到其他节点上

> scp -r /usr/local/zookeeper-3.4.10/ root@hadoop-2:/usr/local/zookeeper-3.4.10
> scp -r /usr/local/zookeeper-3.4.10/ root@hadoop-3:/usr/local/zookeeper-3.4.10

添加myid文件(每节点都需要)

> cd /usr/local/zookeeper-3.4.10
> mkdir data
> echo "1" > data/myid

注意,每个节点myid文件要不一致

启动并测试

# 在三台机器上分别执行
> zkServer.sh start

# 查看状态
[root@hadoop-1 zookeeper-3.4.10]#  zkServer.sh status
ZooKeeper JMX enabled by default
Using config: /usr/local/zookeeper-3.4.10/bin/../conf/zoo.cfg
Mode: follower

[root@hadoop-2 zookeeper-3.4.10]# zkServer.sh status
ZooKeeper JMX enabled by default
Using config: /usr/local/zookeeper-3.4.10/bin/../conf/zoo.cfg
Mode: leader

[root@hadoop-3 zookeeper-3.4.10]#  zkServer.sh status
ZooKeeper JMX enabled by default
Using config: /usr/local/zookeeper-3.4.10/bin/../conf/zoo.cfg
Mode: follower

2.安装HBase

> cd /app/install/
> tar -zxvf hbase-1.3.1-bin.tar.gz 
> mv hbase-1.3.1 /usr/local/

修改配置文件

> vim /usr/local/hbase-1.3.1/conf/hbase-env.sh
# 配置Java环境变量
export JAVA_HOME=/usr/local/jdk1.8
# hbase使用外部的zk
export HBASE_MANAGES_ZK=false

增加相应配置

> vim /usr/local/hbase-1.3.1/conf/hbase-site.xml
<configuration>
    <!-- 指定hbase在HDFS上存储的路径 -->
    <property>
        <name>hbase.rootdir</name>
        <value>hdfs://hadoop-1:9000/hbase</value>
    </property>
    <!-- 指定hbase是分布式的 -->
    <property>
        <name>hbase.cluster.distributed</name>
        <value>true</value>
    </property>
    <!-- 指定zk的地址,多个用“,”分割 -->
    <property>
        <name>hbase.zookeeper.quorum</name>
        <value>hadoop-1:2181,hadoop-2:2181,hadoop-3:2181</value>
    </property>
</configuration>

增加子节点

> vim /usr/local/hbase-1.3.1/conf/regionservers
hadoop-2
hadoop-3

创建hdfs中数据存放路径b

> hdfs dfs -mkdir /user/hadoop/hbase

复制到其他节点

> scp -r /usr/local/hbase-1.3.1/ root@hadoop-2:/usr/local/hbase-1.3.1
> scp -r /usr/local/hbase-1.3.1/ root@hadoop-3:/usr/local/hbase-1.3.1
# 分别赋予权限
chown -R hadoop:hadoop /usr/local/hbase-1.3.1/

所有节点配置环境变量

> vim /etc/profile
# hbase
export HBASE_HOME=/usr/local/hbase-1.3.1
export PATH=$HBASE_HOME/bin:$PATH
> source /etc/profile

启动集群

su hadoop
start-hbase.sh

通过JPS可以查看到主节点上有HMaster进程子节点上有HRegionServer进程

内网可以访问Hbase管理界面 http://hadoop-1:16010

3.基本操作

通过如下命令可以进入Hbase的shell操作界面

hbase shell
hbase(main):001:0> 

一般操作

查询服务器状态

hbase(main):024:0>status
1 active master, 0 backup masters, 2 servers, 0 dead, 1.0000 average load

查询HBase版本信息

hbase(main):025:0>version
1.3.1, r930b9a55528fe45d8edce7af42fef2d35e77677a, Thu Apr  6 19:36:54 PDT 2017

二、DDL操作

1.创建一个表

hbase(main):011:0>create 'member','member_id','address','info'   
0 row(s) in 1.2210seconds

2.获得表的描述

hbase(main):012:0>list
TABLE                                                                                                                                                       
member                                                                                                                                                      
1 row(s) in 0.0160seconds

hbase(main):006:0>describe 'member'
DESCRIPTION                                                                                          ENABLED                                               
 {NAME => 'member', FAMILIES => [{NAME=> 'address', BLOOMFILTER => 'NONE', REPLICATION_SCOPE => '0', true                                                 
  VERSIONS => '3', COMPRESSION => 'NONE',TTL => '2147483647', BLOCKSIZE => '65536', IN_MEMORY => 'fa                                                       
 lse', BLOCKCACHE => 'true'}, {NAME =>'info', BLOOMFILTER => 'NONE', REPLICATION_SCOPE => '0', VERSI                                                       
 ONS => '3', COMPRESSION => 'NONE', TTL=> '2147483647', BLOCKSIZE => '65536', IN_MEMORY => 'false',                                                        
 BLOCKCACHE => 'true'}]}                                                                                                                                    
1 row(s) in 0.0230seconds

3.删除一个列族,alter,disable,enable

我们之前建了3个列族,但是发现member_id这个列族是多余的,因为他就是主键,所以我们要将其删除。

hbase(main):003:0>alter 'member',{NAME=>'member_id',METHOD=>'delete'}
ERROR: Table memberis enabled. Disable it first before altering.

直接操作会报错,如果需要删除列族的时候必须先将表给disable掉。

hbase(main):004:0>disable 'member'                                  
0 row(s) in 2.0390seconds
hbase(main):005:0>alter'member',{NAME=>'member_id',METHOD=>'delete'}
0 row(s) in 0.0560seconds
hbase(main):006:0>describe 'member'
DESCRIPTION                                                                                          ENABLED                                               
 {NAME => 'member', FAMILIES => [{NAME=> 'address', BLOOMFILTER => 'NONE', REPLICATION_SCOPE => '0',false                                                 
  VERSIONS => '3', COMPRESSION => 'NONE',TTL => '2147483647', BLOCKSIZE => '65536', IN_MEMORY => 'fa                                                       
 lse', BLOCKCACHE => 'true'}, {NAME =>'info', BLOOMFILTER => 'NONE', REPLICATION_SCOPE => '0', VERSI                                                       
 ONS => '3', COMPRESSION => 'NONE', TTL=> '2147483647', BLOCKSIZE => '65536', IN_MEMORY => 'false',                                                        
 BLOCKCACHE => 'true'}]}                                                                                                                                    
1 row(s) in 0.0230seconds

该列族已经删除,我们继续将表enable

hbase(main):008:0> enable 'member'  
0 row(s) in 2.0420seconds

4.列出所有的表

hbase(main):028:0>list
TABLE                                                                                                                                                       
member                                                                                                                                                      
temp_table                                                                                                                                                  
2 row(s) in 0.0150seconds

5.drop一个表

hbase(main):029:0>disable 'temp_table'
0 row(s) in 2.0590seconds
hbase(main):030:0>drop 'temp_table'
0 row(s) in 1.1070seconds

6.查询表是否存在

hbase(main):021:0>exists 'member'
Table member doesexist                                                                                                                                     
0 row(s) in 0.1610seconds

7.判断表是否enable

hbase(main):034:0>is_enabled 'member'
true                                                                                                                                                        
0 row(s) in 0.0110seconds

8.判断表是否disable

hbase(main):032:0>is_disabled 'member'
false                                                                                                                                                       
0 row(s) in 0.0110seconds

三、DML操作

1.插入几条记录

put'member','scutshuxue','info:age','24'
put'member','scutshuxue','info:birthday','1987-06-17'
put'member','scutshuxue','info:company','alibaba'
put'member','scutshuxue','address:contry','china'
put'member','scutshuxue','address:province','zhejiang'
put'member','scutshuxue','address:city','hangzhou'
put'member','xiaofeng','info:birthday','1987-4-17'
put'member','xiaofeng','info:favorite','movie' 
put'member','xiaofeng','info:company','alibaba'
put'member','xiaofeng','address:contry','china'
put'member','xiaofeng','address:province','guangdong'
put'member','xiaofeng','address:city','jieyang'
put'member','xiaofeng','address:town','xianqiao'

2.获取一条数据

获取一个id的所有数据

hbase(main):001:0>get 'member','scutshuxue'
COLUMN                                   CELL                                                                                                               
 address:city                           timestamp=1321586240244, value=hangzhou                                                                            
 address:contry                         timestamp=1321586239126, value=china                                                                               
 address:province                       timestamp=1321586239197, value=zhejiang                                                                            
 info:age                               timestamp=1321586238965, value=24                                                                                  
 info:birthday                          timestamp=1321586239015, value=1987-06-17                                                                          
 info:company                           timestamp=1321586239071, value=alibaba                                                                             
6 row(s) in 0.4720seconds

获取一个id,一个列族的所有数据

hbase(main):002:0>get 'member','scutshuxue','info'
COLUMN                                   CELL                                                                                                               
 info:age                               timestamp=1321586238965, value=24                                                                                  
 info:birthday                          timestamp=1321586239015, value=1987-06-17                                                                          
 info:company                           timestamp=1321586239071, value=alibaba                                                                             
3 row(s) in 0.0210seconds

获取一个id,一个列族中一个列的所有数据

hbase(main):002:0>get 'member','scutshuxue','info:age' 
COLUMN                                   CELL                                                                                                               
 info:age                               timestamp=1321586238965, value=24                                                                                  
1 row(s) in 0.0320seconds

6.更新一条记录

将scutshuxue的年龄改成99

hbase(main):004:0>put 'member','scutshuxue','info:age' ,'99'
0 row(s) in 0.0210seconds
hbase(main):005:0>get 'member','scutshuxue','info:age' 
COLUMN                                   CELL                                                                                                               
 info:age                               timestamp=1321586571843, value=99                                                                                  
1 row(s) in 0.0180seconds

3.通过timestamp来获取两个版本的数据

hbase(main):010:0>get 'member','scutshuxue',{COLUMN=>'info:age',TIMESTAMP=>1321586238965}
COLUMN                                   CELL                                                                                                               
 info:age                               timestamp=1321586238965, value=24                                                                                  
1 row(s) in 0.0140seconds
hbase(main):011:0>get 'member','scutshuxue',{COLUMN=>'info:age',TIMESTAMP=>1321586571843}
COLUMN                                   CELL                                                                                                               
 info:age                               timestamp=1321586571843, value=99                                                                                  
1 row(s) in 0.0180seconds

4.全表扫描:

hbase(main):013:0>scan 'member'
ROW                                     COLUMN+CELL                                                                                                        
 scutshuxue                             column=address:city, timestamp=1321586240244, value=hangzhou                                                       
 scutshuxue                             column=address:contry, timestamp=1321586239126, value=china                                                        
 scutshuxue                             column=address:province, timestamp=1321586239197, value=zhejiang                                                   
 scutshuxue                              column=info:age,timestamp=1321586571843, value=99                                                                 
 scutshuxue                             column=info:birthday, timestamp=1321586239015, value=1987-06-17                                                    
 scutshuxue                             column=info:company, timestamp=1321586239071, value=alibaba                                                        
 temp                                   column=info:age, timestamp=1321589609775, value=59                                                                 
 xiaofeng                               column=address:city, timestamp=1321586248400, value=jieyang                                                        
 xiaofeng                               column=address:contry, timestamp=1321586248316, value=china                                                        
 xiaofeng                               column=address:province, timestamp=1321586248355, value=guangdong                                                  
 xiaofeng                               column=address:town, timestamp=1321586249564, value=xianqiao                                                       
 xiaofeng                               column=info:birthday, timestamp=1321586248202, value=1987-4-17                                                     
 xiaofeng                               column=info:company, timestamp=1321586248277, value=alibaba                                                        
 xiaofeng                               column=info:favorite, timestamp=1321586248241, value=movie                                                         
3 row(s) in 0.0570seconds

5.删除id为temp的值的‘info:age’字段

hbase(main):016:0>delete 'member','temp','info:age'
0 row(s) in 0.0150seconds
hbase(main):018:0>get 'member','temp'
COLUMN                                   CELL                                                                                                               
0 row(s) in 0.0150seconds

6.删除整行

hbase(main):001:0>deleteall 'member','xiaofeng'
0 row(s) in 0.3990seconds

7.查询表中有多少行:

hbase(main):019:0>count 'member'                                        
2 row(s) in 0.0160seconds

8.给”xiaofeng”这个id增加'info:age'字段,并使用counter实现递增

hbase(main):057:0*incr 'member','xiaofeng','info:age'                    
COUNTER VALUE = 1

hbase(main):058:0>get 'member','xiaofeng','info:age' 
COLUMN                                   CELL                                                                                                               
 info:age                               timestamp=1321590997648, value=\x00\x00\x00\x00\x00\x00\x00\x01                                                    
1 row(s) in 0.0140seconds

hbase(main):059:0>incr 'member','xiaofeng','info:age'
COUNTER VALUE = 2

hbase(main):060:0>get 'member','xiaofeng','info:age' 
COLUMN                                   CELL                                                                                                               
 info:age                               timestamp=1321591025110, value=\x00\x00\x00\x00\x00\x00\x00\x02                                                    
1 row(s) in 0.0160seconds

获取当前count的值

hbase(main):069:0>get_counter 'member','xiaofeng','info:age' 
COUNTER VALUE = 2

9.将整张表清空:

hbase(main):035:0>truncate 'member'
Truncating 'member'table (it may take a while):
 - Disabling table...
 - Dropping table...
 - Creating table...
0 row(s) in 4.3430seconds

可以看出,hbase是先将掉disable掉,然后drop掉后重建表来实现truncate的功能的。

4. 其他

导出Hbase数据

# 导出到hdfs
hbase org.apache.hadoop.hbase.mapreduce.Driver export member /hbase/export/member
# 导出文件列表
[hadoop@sunmi-hadoop-1 hbase-1.3.1]$ hdfs dfs -ls /hbase/export/member
Found 2 items
-rw-r--r--   2 hadoop supergroup          0 2017-08-01 15:11 /hbase/export/member/_SUCCESS
-rw-r--r--   2 hadoop supergroup        775 2017-08-01 15:11 /hbase/export/member/part-m-00000
# 导入需要先创建表
create 'member2','address','info'   
$ 通过导出的数据导入
hbase org.apache.hadoop.hbase.mapreduce.Driver import member2 /hbase/export/member
# 查询数据	
get 'member2','sc utshuxue'

预分区

类似于Hive的分区和桶的概念,用法如下

> create 't1', 'cf', SPLITS => ['20150501000000000', '20150515000000000', '20150601000000000']

或者

> create 't2', 'cf', SPLITS_FILE => '/home/hadoop/splitfile.txt'

/home/hadoop/splitfile.txt中存储内容如下:
20150501000000000
20150515000000000
20150601000000000

从HBase的Web UI中可以查看到表的分区

启动thrift 服务

Hbase 有两套Thrift调用方式 分别是Thrift1 和 thrift2 大部分开源和Thrift相结合的都是使用 thrift1 但是 Thrift2 是对于 thrift1 的简化 更适合编写代码中使用 可以通过指定端口的方式来同时运行两个服务 --infoport 9096 -p 9091 推荐thrift模式 thrift2 使用指定端口

PS:但是有些服务仅仅支持thrift1的协议比如我们后面要说的的 <HUE>

/usr/local/hbase-1.3.1/bin/hbase-daemon.sh --config /usr/local/hbase-1.3.1/conf foreground_start thrift --infoport 9096 -p 9091

启动 Thrift2 服务

# 开启本机的thrift服务
hbase-daemon.sh start thrift2
# 开启集群其余机器thrift服务
hbase-daemons.sh start thrift2

使用Supervisor守护进程方式前台运行

/usr/local/hbase-1.3.1/bin/hbase-daemon.sh --config /usr/local/hbase-1.3.1/conf foreground_start thrift2

注意如果程序长连接使用HBase服务会出现过一段时间断开的问题应为 超时机制 60S 超时断掉了 这个时候可以通过设置配置文件来解决,因此在conf/hbase-site.xml中添加上配置即可:

> vim /usr/local/hbase-1.3.1/conf/hbase-site.xml
<property>
         <name>hbase.thrift.server.socket.read.timeout</name>
         <value>6000000</value>
         <description>eg:milisecond</description>
</property>

服务持续运行

一般使用Supervisor来进行持续执行,当服务因为异常原因终止之后会自己拉起来,但是运行程序的一定要是前台运行的程序,Hbase主要运行hbasemaster和hbaseregionserver就可以正常提供服务了

# hbaseregionserver
/usr/local/hbase-1.3.1/bin/hbase-daemon.sh --config /usr/local/hbase-1.3.1/conf foreground_start regionserver
# hbasemaster
/usr/local/hbase-1.3.1/bin/hbase-daemon.sh --config /usr/local/hbase-1.3.1/conf foreground_start master

5 总结

经过本节的介绍大家对HBase也有了一定的了解,HBase在集群模式下能够带来更大的性能和容量优势,但是HBase在统计汇总能力比较弱,下节将介绍HBase和Hive互相结合集成Hive的结构化方便查询统计优点也结合HBase速度的优势,并且解决Hive实时写入的问题.

注:笔者能力有限有说的不对的地方希望大家能够指出,也希望多多交流!

© 著作权归作者所有

共有 人打赏支持
喵了_个咪
粉丝 303
博文 146
码字总数 190043
作品 4
杨浦
技术主管
私信 提问
大数据平台搭建-hbase集群的搭建

本系列文章主要阐述大数据计算平台相关框架的搭建,包括如下内容: 虚拟服务器安装 基础环境安装 zookeeper集群的搭建 kafka集群的搭建 hadoop/hbase集群的搭建 spark集群的搭建 flink集群的...

molyeo
07/25
0
0
大数据学习系列之九---- Hive整合Spark和HBase以及相关测试

前言 在之前的大数据学习系列之七 ----- Hadoop+Spark+Zookeeper+HBase+Hive集群搭建 中介绍了集群的环境搭建,但是在使用hive进行数据查询的时候会非常的慢,因为hive默认使用的引擎是MapRe...

虚无境
08/24
0
0
大数据学习系列之二 ----- HBase环境搭建(单机)

引言 在上一篇中搭建了Hadoop的单机环境,这一篇则搭建HBase的单机环境 环境准备 1,服务器选择 阿里云服务器:入门型(按量付费) 操作系统:linux CentOS 6.8 Cpu:1核 内存:1G 硬盘:40G 2,配...

虚无境
08/16
0
0
用 Java 对 hbase 进行CRUD增删改查操作

本文以HBase 0.90.2为例,介绍如何在Windows系统,Eclipse IDE集成环境下,使用Java语言,进行HBase客户端编程,包含建立表、删除表、插入记录、删除记录、各种方式下的查询操作等。 1. 准备...

大数据之路
2012/11/29
0
5
R语言与Hadoop和Hbase的联合使用

HBase和rhbase的安装与使用,分为3个章节。 1. 环境准备及HBase安装2. rhbase安装3. rhbase程序用例 每一章节,都会分为”文字说明部分”和”代码部分”,保持文字说明与代码的连贯性。 注:...

openthings
2015/07/02
0
0

没有更多内容

加载失败,请刷新页面

加载更多

小程序异步操作 跨js执行 在微信小程序里面实现跨页面通信

我们知道,在小程序里面一个页面的变化,是通过调用 setData 函数来实现的。所以想做到在二级页面里让一级页面产生变化,最 Quick And Dirty 的做法就是把一级页面的 this 传入到二级页面去,...

xiaogg
28分钟前
1
0
授于管理员登录其它用户

1.沙盒中,授予管理员登录 安全性控制==>登录访问权限政策

在山的那边
30分钟前
4
0
线程安全的CopyOnWriteArrayList介绍

证明CopyOnWriteArrayList是线程安全的 先写一段代码证明CopyOnWriteArrayList确实是线程安全的。 ReadThread.java import java.util.List; public class ReadThread implements Runnable {......

绝地逢生
33分钟前
1
0
Java重写的7个规则

几年前你可能会遇到这样一个面试题:“重写和重载的区别”、而现在随着科技的更迭、面试的问题越来越高级、面试官的问题也越来越深入、此文是上述面试题的一个延伸、让你从简单的重写规则中更...

architect刘源源
33分钟前
2
0
JavaScript异步编程:Generator与Async

从Promise开始,JavaScript就在引入新功能,来帮助更简单的方法来处理异步编程,帮助我们远离回调地狱。 Promise是下边要讲的Generator/yield与async/await的基础,希望你已经提前了解了它。...

前端攻城老湿
33分钟前
14
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部