4Hbase安装配置和应用实践.docx
《4Hbase安装配置和应用实践.docx》由会员分享,可在线阅读,更多相关《4Hbase安装配置和应用实践.docx(29页珍藏版)》请在冰豆网上搜索。
4Hbase安装配置和应用实践
HBase集群的安装配置和应用实践
1、实验目的
1、掌握Hbase在Hadoop集群体系结构中发挥的作用和使用过程。
2、掌握安装和配置HBase基本方法。
3、掌握HBase基本应用开发知识。
2、实验原理
HBase–HadoopDatabase,是一个高可靠性、高性能、面向列、可伸缩的分布式存储系统,利用HBase技术可在廉价PCServer上搭建起大规模结构化存储集群。
HBase是GoogleBigtable的开源实现,类似GoogleBigtable利用GFS作为其文件存储系统,HBase利用HadoopHDFS作为其文件存储系统;Google运行MapReduce来处理Bigtable中的海量数据,HBase同样利用HadoopMapReduce来处理HBase中的海量数据;GoogleBigtable利用Chubby作为协同服务,HBase利用Zookeeper作为对应。
[HBase是GoogleBigtable的开源实现,它利用HadoopHDFS作为其文件存储系统,利用HadoopMapReduce来处理HBase中的海量数据,利用Zookeeper作为协同服务。
]
上图描述了HadoopEcoSystem中的各层系统,其中HBase位于结构化存储层,HadoopHDFS为HBase提供了高可靠性的底层存储支持,HadoopMapReduce为HBase提供了高性能的计算能力,Zookeeper为HBase提供了稳定服务和failover机制。
此外,Pig和Hive还为HBase提供了高层语言支持,使得在HBase上进行数据统计处理变的非常简单。
Sqoop则为HBase提供了方便的RDBMS数据导入功能,使得传统数据库数据向HBase中迁移变的非常方便。
HBase具有以下特性:
1、线性及模块可扩展性。
2、严格一致读写性。
3、可配置的表自动分割策略。
4、RegionServer自动故障恢复。
5、便利地备份MapReduce作业的基类。
6、便于客户端访问的JavaAPI。
7、为实时查询提供了块缓存和BloomFilter。
8、可通过服务器端的过滤器进行查询下推预测。
9、提供XML、Protobuf及二进制编码的Thrift网管和REST-ful网络服务。
10、可扩展的JIRB(jruby-based)shell。
11、支持通过Hadoop或JMX将度量标准倒出到文件或Ganglia中。
三、实验内容
实验的主要内容有如下几点:
1、ntp时间同步服务器搭建与使用
2、Zookeeper集群环境安装过程详解
3、HBase的安装和配置。
4、HBase开发实践。
4、实验步骤
本实验以unbutu14.04,hadoop2.20集群为前提进行实验。
Zookeeper安装版本为zookeeper-3.4.5,HBase安装版本为hbase-0.96.2-hadoop2。
Hadoop集群ip及角色分配如下
10.31.44.117master(namenode)
10.31.44.200slaver1(datanode)
10.31.44.201slaver2(datanode)
第一部分:
准备工作(Hadoop、SSH、NTP)
1、Hadoop完全分布式的安装:
必须可以正常启动HDFS系统,确保hdfs能够上传和读写文件。
2、SSH无密验证双向互通:
这个具体安装,并且达到无密码登录前面已经介绍。
但是要达到双向无密码互通我们只需要将每台机器的公钥均写入到同一个授权文件,然后将授权文件复制到每台机器上即可(具体公钥写入授权文件的方法参考Hadoop完全分布式的安装试验)。
这样就可以达到双向无密码互通。
这样Hadoop的脚本才可以远程操控其他的Hadoop和Hbase进程。
3、Ntp时间同步服务器安装配置:
集群的时钟要保证基本的一致。
稍有不一致是可以容忍的,但是很大的不一致会造成奇怪的行为。
运行NTP或者其他什么东西来同步你的时间.下面对Ntp时间同步服务器NTP安装配置步骤如下:
3.1、服务端(master)
apt-getinstallntp
安装后默认启动服务,如果没有启动,启动之。
/etc/init.d/ntpstart
vim/etc/ntp.conf修改为如下:
重启ntp服务
/etc/init.d/ntprestart
3.2、客户端(slaver1、slaver2)
1)使用ntpdate命令,如果不存在这个命令,则先安装apt-getinstallntp
2)/usr/sbin/ntpdate10.31.44.117//即使用ip为10.31.44.117的ntp服务器同步时间
3)设置定时同步
vim/etc/crontab
系统便会在每天早上1点30分自动将系统时间同步到ntp服务器的时间
当然这里crontab的时间是指客户端的时间,同步后等同于ntp服务器的时间
另外,可以使用以下命令同步服务器时间
ulimit和nproc设置(集群均配置)
HBase是数据库,会在同一时间使用很多的文件句柄。
大多数Ubuntu系统使用的默认值1024是不能满足的,所以你需要修改你的最大文件句柄限制。
可以设置到10k.你还需要修改hbase用户的nproc,如果过低会造成OutOfMemoryError异常。
需要澄清的,这两个设置是针对操作系统的,不是Hbase本身的。
有一个常见的错误是Hbase运行的用户,和设置最大值的用户不是一个用户。
在Hbase启动的时候,第一行日志会现在ulimit信息,所以你最好检查一下。
vim /etc/security/limits.conf添加如下内容:
root-nofile32768
rootsoft/hardnproc32000
在/etc/pam.d/common-session加上这一行:
sessionrequiredpam_limits.so
如下:
否则在/etc/security/limits.conf上的配置不会生效.
还有注销再登录,这些配置才能生效!
root- nofile32768root最大能打开的文件数不超过65536
roothard nproc 16384root用户最大能开启的进程数不超过16384
pam_limits.so模块可以使用在对一般应用程序使用的资源限制方面。
如果需要在SSH服务器上对来自不同用户的ssh访问进行限制,就可以调用该模块来实现相关功能。
当需要限制用户admin登录到SSH服务器时的最大连接数(防止同一个用户开启过多的登录进程),就可以在/etc/pam.d/sshd文件中增加一行对pam_limits.so模块的调用
第二部分:
ZooKeeper集群环境的安装配置
Zookeeper是一个分布式开源框架,提供了协调分布式应用的基本服务,它向外部应用暴露一组通用服务——分布式同步(DistributedSynchronization)、命名服务(NamingService)、集群维护(GroupMaintenance)等,简化分布式应用协调及其管理的难度,提供高性能的分布式服务。
ZooKeeper本身可以以单机模式安装运行,不过它的长处在于通过分布式ZooKeeper集群(一个Leader,多个Follower),基于一定的策略来保证ZooKeeper集群的稳定性和可用性,从而实现分布式应用的可靠性。
ZooKeeper安装过程
以下步骤均在master服务器上操作,除非有特殊说明等完成以后再进行分发至其他服务器。
1、解压zookeeper-3.4.5.tar.gz至/root目录下
解压:
tar-zxfzookeeper-3.4.5.tar.gz
更改名字为zookeeper:
mvzookeeper-3.4.5u-zookeeper
2、修改zoo.cfg配置文件
在Zookeeper集群环境下只要一半以上的机器正常启动了,那么Zookeeper服务将是可用的。
因此,集群上部署Zookeeper最好使用奇数台机器,这样如果有5台机器,只要3台正常工作则服务将正常,
下面我们将对Zookeeper的配置文件的参数进行设置
进入到u-zookeeper的conf目录下将zoo_sample.cfg文件拷贝一份,命名为为:
zoo.cfg
vimzoo.cfg修改内容如下:
dataDir=/root/u-zookeeper/data
#这两个目录需要创建
dataLogDir=/root/u-zookeeper/log
server.1=192.168.60.198:
2888:
3888
server.2=192.168.60.178:
2888:
3888
server.3=192.168.60.179:
2888:
3888
注意上图的配置中master,slave1分别为主机名。
在上面的配置文件中"server.id=host:
port:
port"中的第一个port是从机器(follower)连接到主机器(leader)的端口号,第二个port是进行leadership选举的端口号。
接下来在dataDir所指定的目录下创建一个文件名为myid的文件,文件中的内容只有一行,为本主机对应的id值,也就是上图中server.id中的id。
例如:
在服务器1中的myid的内容应该写入1,在服务器2中的myid的内容应该写入2。
4、配置环境变量
vim/etc/profile
:
/root/u-zookeeper/conf
vim/etc/environment
/root/u-zookeeper/bin:
6、远程复制分发安装文件
接下来将上面的安装文件拷贝到集群中的其他机器上对应的目录下:
同理拷贝/etc/profile,/etc/environment至slaver1,slaver2中
拷贝完成后修改对应的机器上的myid。
例如修改slaver1中的myid如下:
echo"2">/roor/u-zookeeper/data/myid
cat/roor/u-zookeeper/data/myid
2
例如修改slaver2中的myid如下:
echo"3">/roor/u-zookeeper/data/myid
cat/roor/u-zookeeper/data/myid
3
以上操作完成后,请所有节点服务器重启。
一定要reboot
7、启动zookeeper集群
在ZooKeeper集群的每个结点上,执行启动ZooKeeper服务的脚本:
zkServer.shstart
如下图所示:
其中,QuorumPeerMain是zookeeper进程,启动正常。
如上依次启动了所有机器上的Zookeeper之后可以通过ZooKeeper的脚本来查看启动状态,包括集群中各个结点的角色(或是Leader,或是Follower),如下所示,是在ZooKeeper集群中的每个结点上查询的结果:
通过上面状态查询结果可见,slaver1是集群的Leader,其余的两个结点是Follower
另外,可以通过客户端脚本,连接到ZooKeeper集群上。
对于客户端来说,ZooKeeper是一个整体(ensemble),连接到ZooKeeper集群实际上感觉在独享整个集群的服务,所以,你可以在任何一个结点上建立到服务集群的连接,例如:
:
退出:
quit
8、停止zookeeper进程:
zkServer.shstop
至此,Zookeeper集群安装完成!
第三部分:
Hbase的安装设置
1、解压hbase-0.96.2-hadoop2-bin.tar.gz.tar,并更名为u-hbase
tar-xzvfhbase-0.96.2-hadoop2-bin.tar.gz.tar
u-hbase目录结构如下:
2、配置conf/hbase-env.sh
vim/root/u-hbase/conf/hbase-env.sh
添加内容如下:
?
?
?
?
?
?
?
?
Hbase?
?
?
?
zookeeper?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
zookeeper?
?
?
?
?
?
?
Hbase?
?
?
?
?
zookeep?
?
,即Hbase默认自带一个zookeep集群?
?
?
?
?
?
?
?
Hbase?
?
?
?
?
?
?
而在实际的商业项目中通常?
?
?
?
?
?
zookeeper?
?
更便于优化配置提高集群工作效率,?
?
?
?
?
Hbase?
?
?
?
?
conf/hbase-env.sh?
?
?
HBASE_MANAGES_ZK?
?
?
?
?
?
?
?
?
?
true?
?
?
?
?
Hbase?
?
?
?
?
?
?
?
?
?
zookeeper.在本实验中,我们采用独立运行zookeeper集群的方式,故将其属性值改为false.
3、配置conf/hbase-site.xml
配置效果图如下:
hbase.rootdir
hdfs:
//192.168.60.198:
9000/hbase
hbase.master
hdfs:
//192.168.60.198:
60000
hbase.tmp.dir
file:
/root/u-hbase/tmp
hbase.zookeeper.property.dataDir
file:
/root/u-zookeeper/data
hbase.cluster.distributed
true
hbase.zookeeper.quorum
master,slaver1,slaver2
hbase.zookeeper.property.clientPort
2181
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
hbase.cluster.distributed?
?
?
true?
?
?
hbase.rootdir?
?
?
HDFS?
NameNode?
?
?
hbase.rootdir:
?
?
?
?
?
regionserver?
?
?
?
?
?
?
?
?
?
Hbase?
URL?
?
?
'?
?
?
?
'?
?
?
?
?
?
?
?
?
?
scheme
hbase.cluster.distributed :
Hbase?
?
?
?
?
?
false?
?
?
?
?
true?
?
?
?
?
?
?
?
?
false,Hbase?
Zookeeper?
?
?
?
?
?
?
JVM?
?
?
?
hbase-site.xml?
?
zookeeper:
?
Hbase?
?
zookeeper?
?
?
?
?
?
?
?
?
?
zoo.cfg?
?
?
zookeeper,?
?
zookeepr?
?
?
?
?
?
?
?
hbase-site.xml?
?
?
zookeepr?
ensembleservers,?
?
?
?
?
?
hbase.zookeeper.quorum.在这里列出Zookeeper?
?
?
?
?
?
?
?
?
?
?
?
。
hbase.zookeeper.property.clientPort:
ZooKeeper?
zoo.conf?
?
?
?
?
?
?
?
?
?
?
?
?
hbase.zookeeper.property.dataDir:
ZooKeeper?
zoo.conf?
?
?
?
?
?
?
?
?
?
Zookeeper,?
?
?
Zookeeper?
host?
?
?
?
需要?
hbase-site.xml?
?
?
。
4、配置conf/regionservers
写入:
slaver1、slaver2
?
?
?
?
?
?
?
?
?
?
?
?
?
?
HRegionServer,?
?
?
?
?
host(?
?
Hadoop?
?
?
slaves?
?
).?
?
?
?
?
server?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
.
5、分发hbase
上面我们配置完毕,?
?
?
?
?
?
?
?
?
?
?
?
?
slave?
?
:
scp-r/root/u-hbaseslaver1:
/root/
scp-r/root/u-hbaseslaver2:
/root/
6、运行和测试
在master上执行:
1、start-dfs.sh
2、start-yarn.sh
3、zkServer.shstart(各个节点均执行)
4、start-hbase.sh
(先启动zookeeper然后hadoop再然后hbase)
使用jps查看进程,在master上:
在slaver1、slaver2(slave节点)上
?
?
?
?
?
?
?
60010,60030?
?
查看
http:
//10.31.44.117:
60010/
http:
//10.31.44.118:
60030/rs-status
第四部分:
Hbase应用实践
1、HBase表结构介绍
在使用HBase之前,先介绍HBase的表结构,这样有利于实验的实践。
HBase以表的形式存储数据。
表有行和列组成。
列划分为若干个列族/列簇(columnfamily)。
RowKey
column-family1
column-family2
column-family3
column1
column2
column1
column2
column3
column1
key1
key2
key3
如上图所示,key1,key2,key3是三条记录的唯一的rowkey值,column-family1,column-family2,column-family3是三个列族,每个列族下又包括几列。
比如column-family1这个列族下包括两列,名字是column1和column2,t1:
abc,t2:
gdxdf是由rowkey1和column-family1-column1唯一确定的一个单元cell。
这个cell中有两个数据,abc和gdxdf。
两个值的时间戳不一样,分别是t1,t2,hbase会返回最新时间的值给请求者。
这些名词的具体含义如下:
(1) RowKey
与nosql数据库们一样,rowkey是用来检索记录的主键。
访问hbasetable中的行,只有三种方式:
(1.1)通过单个rowkey访问
(1.2)通过rowkey的range
(1.3)全表扫描
Rowkey行键(Rowkey)可以是任意字符串(最大长度是64KB,实际应用中长度一般为10-100bytes),在hbase内部,rowkey保存为字节数组。
存储时,数据按照Rowkey的字典序(byteorder)排序存储。
设计key时,要充分排序存储这个特性,将经常一起读取的行存储放到一起。
(位置相关性)
注意:
字典序对int排序的结果是
1,10,100,11,12,13,14,15,16,17,18,19,2,20,21,…,9,91,92,93,94,95,96,97,98,99。
要保持整形的自然序,行键必须用0作左填充。
行的一次读写是原子操作(不论一次读写多少列)。
这个设计决策能够使用户很容易的理解程序在对同一个行进行并发更新操作时的行为。
(2) 列族columnfamily
hbase表中的每个列,都归属与某个列族。
列族是表的chema的一部分(而列不是),必须在使用表之前定义。
列名都以列族作为前缀。
例如courses:
history,courses:
math都属于courses这个列族。
访问控制、磁盘和内存的使用统计都是在列族层面进行的。
实际应用中,列族上的控制权限能帮助我们管理不同类型的应用:
我们允许一些应用可以添加新的基本数据、一些应用可以读取基本数据并创建继承的列族、一些应用则只允许浏览数据(甚至可能因为隐私的原因不能浏览所有数据)。
(3)单元 Cell
HBase中通过row和columns确定的为一个存贮单元称为cell。
由{rowkey,column(=+
cell中的数据是没有类型的,全部是字节码形式存贮。
(4) 时间戳timestamp
每个cell都保存着同一份数据的多个版本。
版本通过时间戳来索引。
时间戳的类型是64位整型。
时间戳可以由hbase(在数据写入时自动)赋值,此时时间戳是精确到毫秒的当前系统时间。
时间戳也可以由客户显式赋值。
如果应用程序要避免数据版本冲突,就必须自己生成具有唯一性的时间戳。
每个cell中,不同版本的数据按照时间倒序排序,即最新的数据排在最前面。
为了避免数据存在过多版本造成的的管理(包括存贮和索引)负担,hbase提供了两种数据版本回收方式。
一是保存数据的最后n个版本,二是保存最近一段时间内的版本(比如最近七天)。
用户可以针对每个列族进行设置。
2、实例创建一张学生成绩表
下面我们要创建以下一张学生成绩表:
name
grad
course
math
art
Tom
5
97
87
Jim
4
89
80
?
?
grad?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
course?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
math?
art,?
?
?
?
?
?
?
?
?
?
?
?
?
?
course?
?
?
?
?
?
?
?
?
computer,physics?
?
?
?
?
?
?
?
course?
?
?
(1)?
?
?
?
?
scores,?
?
?
?
?
grad?
courese
代码如下:
hbase(main):
001:
0>create‘scores','grade',‘course'
可以使?
list?
?
?
?
?
?
?
HBase?
?
?
?
?
?
?
?
describe?
?
?
?
?
?
?
?
?
(?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
)
(2)?
?
?
?
?
?
?
?
?
?
:
?
?
?
?
:
put‘scores','Tom','grade:
','5'
put‘scores','Tom','course:
math','97'
put‘scores','Tom','course:
art','87'
put‘scores','Jim','grade','4'
put‘scores','Jim','course:
math','89'
put‘scores','Jim','course:
art','80'
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?