[喵咪大数据]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.0160secondshbase(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 = 1hbase(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.0140secondshbase(main):059:0>incr 'member','xiaofeng','info:age'
COUNTER VALUE = 2hbase(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的协议比如我们后面要说的的
/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实时写入的问题.
注:笔者能力有限有说的不对的地方希望大家能够指出,也希望多多交流!
[喵咪大数据]Hbase搭建和基本使用相关推荐
- [喵咪大数据]Hive2搭建和基本操作
[喵咪大数据]Hive2搭建和基本操作 说的Hadoop生态有一个不得不提的组件那就是,Hive是基于Hadoop结构化存储引擎,能够存储海量的数据,Hive提供了类SQL的方式对数据进行查询检索汇总 ...
- [喵咪大数据]初识大数据
大数据互联网时代下大家耳熟能详的名词,但是我们离大数据有多远呢?从2011Hadoop1.0问世到现在,渐渐地大数据解决方案已经趋向成熟,笔者觉得也是时间来学习接触一下大数据解决一些在工作中实际遇到的 ...
- [喵咪大数据]Hive+Hbase关联
在之前的章节中我们已经一同学习的Hive和HBase相关的知识,但是Hive和HBase都存在各自的问题,Hive实时性不强单条写入数据慢,HBase查询能力差不具备复杂查询的能力,但是Hive和HB ...
- [喵咪大数据]Hadoop单机模式
千里之行始于足下,学习大数据我们首先就要先接触Hadoop,上节介绍到Hadoop分为Hadoop-HDFS,Hadoop-YARN,Hadoop-Mapreduce组成,分别负责分布式文件存储,任务 ...
- [喵咪大数据]Hadoop集群模式
既然是大数据无论存储和处理都需要相当大的磁盘或者是处理的资源消耗,那么单机肯定是满足不了我们的需求的,所以本节我们就来了解Hadoop的集群模式搭建,在集群情况下一同配合处理任务分发,存储分担等相关的 ...
- [喵咪大数据]HUE大数据管理工具
日常的大数据使用中经常是在服务器命名行中进行操作,可视化功能仅仅依靠着各个组件自带的网页进行,那么有没有一个可以结合大家能在一个网页上的管理工具呢?答案是肯定的,今天就和大家一起来探索大数据管理工具H ...
- [喵咪大数据]Presto查询引擎
如果大家正在按照笔者的教程尝试使用大数据组件还是之前有使用过相关的组件,大家会发现一个问题HIVE在负责的查询下调用Mapreduce会很慢,在这个场景下就涌现出很多查询引擎来优化,比如大家熟悉的Sp ...
- 2021年大数据HBase(六):HBase的高可用!【建议收藏】
全网最详细的大数据HBase文章系列,强烈建议收藏加关注! 新文章都已经列出历史文章目录,帮助大家回顾前面的知识重点. 目录 系列历史文章 前言 HBase的高可用 一.HBASE高可用的简介 二.搭 ...
- 大数据平台搭建及集群规划
CDH大数据平台搭建之集群规划_码上_成功的博客-CSDN博客_cdh集群规划 大数据Hadoop分布式集群部署(详细版)_arnoldmp的博客-CSDN博客_分布式集群部署 大数据平台的硬件规划. ...
最新文章
- 算法笔记-归并排序、归并排序时间复杂度、例题
- SQL Server 2005 数据库邮件 使用要点
- php ajax轮询推送,[PHP]PHP+AJAX实现轮询代码
- JQuery中checkbox勾选/取消勾选的诡异问题(attr和prop)
- 【最长公共前缀】算法优化笔记
- iPhone开发过程中调试多次Release问题 message sent to deallocated
- java Socket通信(一)
- GIS二次开发之初探
- Python gevent学习笔记 1
- 如何用 Visual Studio 2017 开发 Arduino 应用程序
- r语言之散点图类型type参数
- 中国主要的区块链公司以及融资情况
- 关于word2010指定位置插入页码及三线表格绘制问题
- c语言中四种简单的数组排序
- centos7时间校准
- 定时任务框架Quartz
- (1)我们的代码被 “送进城里 ” 后发生了什么 ^o^ —— 「进程」篇
- Sql Server 字符串、日期函数 收藏
- 安森美python25K NOIP1SN025K成像采集电路设计
- Android变脸幕后的魔法师:各巨头…
热门文章
- 深入理解计算机系统|Attack Lab
- 如何在局域网使用手机访问电脑文件?
- C语言初阶-C语言中的数据类型以及变量的作用域和生命周期,常量的类型
- python实现sql_如何利用Python实现SQL自动化?
- 2008年秋季学期文兴小学图书室工作计划
- N皇后问题 (c++)
- java计算机毕业设计班级同学录网站源码+数据库+系统+lw文档+部署
- oracle数据库实例的账号密码,正确修改Oracle数据库的默认账号密码的方法
- php网站的构成,网站组成部分基础知识
- Asp.net MVC 上传大文件(超过50M)的设置