集群环境下的安装部署:
配置一个10个节点的集群。节点的名字分别是master.foo.com,host1.foo.com到host9.foo.com。
HBase master与HDFS NameNode都运行在master.foo.com上。
Region服务器运行在host1.foo.com到host9.foo.com上。
3个节点的ZooKeeper分别运行在zk1.foo.com,zk2.foo.com,zk2.foo.com。
ZooKeeper的元数据目录设置为/var/zookeeper。
主要配置文件——hbase-site.xml、regionservers、hbase-env.sh都可以再Hbase的conf目录下找到。
配置如下:
1.hbase-site.xml
<configuration>
<property>
<name>hbase.zookeeper.quorum</name>
<value>zk1.foo.com,zk2.foo.com,zk3.foo.com</value>
</ property >
<property>
<name>hbase.zookeeper.property.dataDir</name>
<value>/var/zookeeper</value>
</ property >
<property>
<name>hbase.rootdir </name>
<value>hdfs://master.foo.com:9000/hbase </value>
</ property >
<property>
<name>dfs.replication </name>
<value>3 </value>
</ property >
<property>
<name>hbase.cluster.distributed </name>
<value>true </value>
</ property >
</ configuration>
2.regionservers
记录所有region服务器的主机列表。
host1.foo.com
host2.foo.com
host3.foo.com
host4.foo.com
host5.foo.com
host6.foo.com
host7.foo.com
host8.foo.com
host9.foo.com
3.hbase-env.sh
HBase的环境变量等信息需要在这个文件中设置。例如,Hbase守护进程的JVM启动参数:Java堆大小和垃圾回收策略。
还可以设置HBase配置文件的目录、日志目录、SSH选项、进程pid文件的目录等。
改变配置后需要重启HBase才能生效。
这里我们将HBase的堆设置为4GB,以替代默认的1GB。
export HBASE_HEAPSIZE=4096
export HBASE_MANAGES_ZK=false --不依赖Hbase管理集群
配置HBase自己管理ZK:
例:如果需要HBase在节点rs{1,2,3,4,5}.foo.com上管理ZooKeeper,并绑定客户端服务端口2222(默认2181)。
conf/hbase-env.sh
export HBASE_MANAGES_ZK=true
在conf/hbase-site.xml配置zk相关信息:
<property>
<name>hbase.zookeeper.quorum</name>
<value>zk1.foo.com,zk2.foo.com,zk3.foo.com</value>
</ property >
<property>
<name>hbase.zookeeper.property.dataDir</name>
<value>/var/zookeeper</value>
</ property >
<property>
<name>hbase.zookeeper.property.clientPort </name>
<value>2222 </value>
</ property >
注意:一旦用户编辑完配置文件,就需要文件同步到集群的所有服务器上。
用户可以使用rsync完成这项工作。
集群中每台集群上的配置都相同,每台机器都可以作为master
如:rsync -vaz /usr/local/hbase /usr/local
Hbase命令操作
Hbase管理命令:
Start-hbase.sh --启动hbase数据库
Hbase shell --进入hbase shell界面
Exit --退出hbase shell界面
Stop-hbase.sh --关闭数据库
hbase-daemon.sh start master --启动master
hbase-daemon.sh start master -backup 启动备份的master
hbase-daemon.sh stop regionserver 停止region
balance_switch false 关闭负载均衡
Graceful_stop.sh hostname 关闭hostname主机上的hbase(先移region,之后关闭)
balance_switch true 启动负载均衡
启动成功的守护进程:
HMaster
HQuarumPeer ——如果是ZooKeeper自己管理则是QuorumPeerMain
HRegionServer
ThriftServer
通用命令:
Status --提供Hbase的状态,如:服务器的数量
Version --提供正在使用Hbase的版本
Table_help --表引用命令提供帮助
Whoami --提供有关用户的信息
Debug --切换调试模式,非调试模式shell日志级别是error,不会在控制台打印
Debug? --查看当前的调试模式
数据定义语言
Create ‘test’,’cf1’ 创建表test,有一个cf1的列族
List --展示所有表
--删除表之前,一定要先将其禁用
Disable ‘test’
Is_disabled --验证表是否被禁用
Enable --启用一个表
Is_enabled 验证表是否已启用
Alter 改变一个表
Alter ‘test’,readonly(option) --设置表为只读
Alter ‘test’,’delete’=>’professional’ --删除指定列族professional
Drop ‘test’
Disable_all 用于禁用所有匹配给定正则表达式的表
Drop_all ‘t.*’ --删除匹配regex表,也要向禁用表
Exists ‘test’ 判断表是否存在
数据操纵语言
Put ‘test’,’row1’,’cf1’,’val1’
Put ‘test’,’row1’,’cf1’,’val2’ --没有更新语句,直接覆盖
Scan ‘test’ --查看表下的所有数据
Scan ‘test’,{versions=>3}
get ‘test’,’row1’,’cf1’ --获取单元格数据
get_counter --返回一个计数器数值
incr --给计数器加1
delete ‘test’,’row1’,’cf1’,’ql1’ --删除特定单元格
deleteall ‘test’,’row1’ --删除row1的所有单元格
count --计数并返回表中的行的数目
truncate --清空表数据
表授权语句:
Grant 授权
Revoke 撤销用户权限
User_permission 列出特定表的所有权限
- R - 代表读取权限
- W - 代表写权限
- X - 代表执行权限
- C - 代表创建权限
- A - 代表管理权限
Grant ‘Tutorialspoint’,’RWXCA’ --授予用户所有权限
Revoke ‘Tutorialspoint’ --撤销用户所有权限
User_permission ‘emp’ --查看emp表的所有用户权限
工具:
Assign --分配一个region到一台region服务器
Balance_switch --切换负载均衡状态
Balancer --启动负载均衡
Close_region --关闭一个region
Compact --开启某个region或一张表的异步合并操作
Move --移动一个region到不同的服务器中
Split --拆分一个region或一张表
Unassign --下线一个region
执行shell脚本:
Echo “status” | hbase shell
Cat ~/hbase-shell-status.rb
Hbase shell ~/hbase-shell-status.rb
客户端API:最佳实践
1. 禁止自动刷写 setAutoFlush(false)
这时,添加的put实例会被添加到一个相同的写入缓存中,在禁用自动刷写时,这些操作直到写缓冲区被填满时才会被送出。
或者用户调用flushCommits()方法
或调用HTable实例的close方法隐式调用flushCommits()方法
2. 使用扫描缓存setCaching()
如果使用默认值1,则map任务会在处理每条记录时都请求region服务器。
而如果设置为500,则一次可以传送500行数据到客户端进行处理。
这里要权衡传输数据的开销和内存的开销。
表级别的扫描缓存 setScannerCaching()
3. 限定扫描范围
Scan扫描的范围尽可能的小
4. 关闭ResultScanner
HTabel.getScanner()返回的ResultScanner实例会消耗大量资源。
一定要在try/catch的finally块中关闭ResultScanner
5. 块缓存用法
对Scan实例能够通过setCacheBlocks()方法来设置使用region服务器的块缓存。
如果在MapReduce作业中使用扫描,这个方法应当被设置成false。
对于那些频繁访问的行,建议使用块缓存。
6. 优化获取行健的方式
适当的选用过滤器,最快捷的返回数据
7. 关闭Put上的WAL(关闭日志)
服务器端不会把这个Put写到WAL中,而只把它写到memstore里。
使用put的wrireToWAL(false)来关闭WAL
配置上的一些优化措施:
1. 减少ZooKeeper超时的发生
Zookeeper.session.timeout 属性来设置
2. 增加处理线程
Hbase.regionserver.handler.count属性定义了响应外部用户访问数据表请求的线程数。
默认值10有点小。
3. 增加堆大小
在hbase-env.sh文件中调整HBASE_HEAPSIZE的设置
4. 启用数据压缩
推荐使用Snappy或者LZO
配置启动region服务器时检查压缩是否正确安装:
<property>
<name>hbase.regionserver.codecs</name>
<value>snappy,lzo</value>
</property>
启用压缩:
hbase支持列族级别上的数据压缩。
create ‘testtable’,{name=>’colfam1’,compression=>’GZ’} //创建表,并对’colfam1’列族上的数据启用GZ压缩
describe ‘testtable’
//修改表,并启用压缩
create ‘testtable2’,’colfam1’
disable ‘testtable2’ --修改表的属性时,一定要先禁用表
alter ‘testtable2’.{name=>’colfam1’,compression=>’GZ’}
enable ‘testtable2’
5. 增加region大小
更大的region可以减少集群总的region数目。
管理较少的region可以让集群的运行更平稳。
默认情况下,region的大小事256MB。可以配置1GB或者更大的region。
Hbase.hregion.max.filesize属性的值
6. 调整块缓存大小
控制堆中块缓存大小的属性是一个用浮点数类型的百分比,默认值是20%。
perf.hfile.block.cache.size
增大块缓存的情况:
Ø 如果块缓存的使用中,发现有很多的块被换出
Ø 用户负载大多数为读请求时,hbase将更加需要块缓存
7.调整memstore限制
memstore占用内存中堆大小的比例:
上限:hbase.regionserver.global.memstore.upperLimit (默认值为40%,设置为0.4)
下限:hbase.regionserver.global.memstore.lowerLimit(设置为0.35),用来控制服务器清空memstore之后剩余的大小。将上限和下限设置的接近一些可以避免过度刷写。
处理读请求时,可以考虑同时减少memstore的上下限来增加块缓存的空间。
8. 增加阻塞时存储文件数目
Hbase.hstore.blockingStoreFiles
决定了当存储文件的数目达到阀值时,更新操作(put,delete)将会被阻塞,并以此来给合并操作留出来时间减少存储文件的数目。
大负载的突发写入请求时,可以增加这个值。(默认值是7)
9. 增加阻塞倍率
Hbase.hregion.memstore.block.multiplier的默认值是2
阻塞客户端更新数据的请求的安全阀值。
增加这个值,可以更加平滑地处理写入突发流量:可以临时接受更多的数据
10. 减少最大日志文件限制
Hbase.regionserver.maxlogs=32 (默认值32)
控制基于磁盘的WAL文件数目,进而控制刷写频率。
对于写压力比较大的服务器,降低这个值会强迫服务器更频繁地将数据刷写到磁盘。这样刷写到磁盘上的数据所对应的日志就可以被丢弃了。
第12章 集群管理
减少节点
Shell命令:
Balance_switch false --关闭负载均衡
Hbase-daemon.sh stop regionserver --停止集群中的一个region服务器
Balance_switch true --启用负载均衡
过程分析:
关闭节点的负载均衡,避免负载均衡和master回复刚才下线的region服务器之间可能产生的竞争。
Region服务器会先将它所有的region关闭,然后再把自己的进程停止。Region服务器在ZooKeeper中对应的临时节点将会过期。Master会注意到region服务器停止服务并将其按崩溃的服务器处理:master会将这台服务器上的region重新分配到其他机器上。
坏处:region会下线一段时间,时间的长度由ZooKeeper的超时时间决定。
第一个被关闭的region要等所有region都关闭,且master注意到region服务器的znode被删除之后才能上线。
Hbase0.90.2之后,下线方式:
Graceful_stop.sh hostname
--hostname是用户要卸载的region服务器。
会把region从对应的服务器上一个个移出来以减少扰动。它会在移动到下一个region前先检查新位置上的region是否已经部署好。直到对应的要关闭的服务器上没有region了。
此时,脚本会让对应的服务器关闭。
Master会察觉到服务器停止了服务。
由于服务器关闭时没有region,所以不会有WAL切分的相关操作。
滚动重启
使用greceful_stop.sh脚本来重启region服务器,并将之前属于他的region移回原位。
Balance_switch false
$for I in ‘cat conf/regionservers|sort’;
Do ./bin/graceful_stop.sh -- restart --reload --debug $i;
Done &> /tmp/log.txt &
Balance_switch true
使用tail –f 命令查看/tmp/log.txt中脚本运行的进度。以上操作只对region服务器有效。
同时请确保在执行上述操作之前已禁用负载均衡。
实现滚动重启的步骤:
1. 解压用户的发行版,将配置调整好后分发到整个集群
2. 运行hbck以确认集群数据的一致性(主要验证meta表),如果有不一致的情况要修复一下。
Hbase hbck
3. 重启master
Hbase-daemon.sh stop master; hbase-daemon.sh start master
4. 关闭region均衡器
Echo “balance_switch false” | hbase shell
5. 在每个region服务器上运行graceful_stop.sh脚本
$for I in ‘cat conf/regionservers|sort’;
Do ./bin/graceful_stop.sh -- restart --reload --debug $i;
Done &> /tmp/log.txt &
6. 再次重启master。这样会清除其保存的崩溃的服务器列表,并同时启动负载均衡
Hbase-daemon.sh stop master; hbase-daemon.sh start master
Echo “balance_switch true” | hbase shell
7.运行hbck以确认集群一致性。
新增服务器
1. 伪分布式模式
在一台服务器上模拟整个集群的运行状态。所有进程都要分享本地资源。
适合少量数据的测试。
添加本地备份master:
Local-master-backup.sh start 1
命令最后的数字指定了master的RPC端口和WebUI端口与默认配置值的偏移量。两个端口的默认值分别是60000和60010,偏移量会被加到相应的默认值上。
上面的命令执行后,一个新的master进程将会启动,与原来的配置一样,不过监听的端口号分别是60001和60011.
启动多个备份master
Local-master-backup.sh start 1 3 5
3个用于备份的master的RPC端口分别是60001,60003和60005
WebUI监听端口为60011,60013和60015。
停止备份master
Local-master-backup.sh stop 1
用户可以一次停止多个备份master,用户指定的端口偏移量用于停止对应的master。
添加本地region服务器
使用local-regionservers.sh,和启动本地master服务器类似,指定偏移量即可
Region服务器默认使用60200作为RPC端口,使用60300作为Web UI端口。
Local-regionservers.sh start 1
Local-regionservers.sh start 1 2 3
Local-regionservers.sh stop 1
2.完全分布式集群
添加一个备份master
通过备份master节点避免master出现故障而造成Hbase单点失效。
Master进程使用Zookeeper来协商哪一个是当前活动的进程。Zookeeper中有一个所有master进程都会竞争的专用znode。第一个竞争到的master会创建这个znode。当集群启动时,竞争获胜的master会成为当前提供服务的master,其他master进程只是轮询检查这个znode,当它消失时再次竞争。
/hbase/master znode是临时znode。Region服务器对于的znode节点也是临时节点,用于报告他们的存在状态。
通常master服务器的配置与集群的其他机器相同,一旦用户确认配置没有问题,用一下命令启动一个备份master:
Hbase-daemon.sh start master
假设已经有master正在运行,这条命令就会启动一个新的master进程等待Zookeeper中的Znode被移除。
使用--backup参数指定备份的master
Hbase-daemon.sh start master --backup
会新启动一个master来等待一个专有的master,即使用start-hbase.sh脚本启动,或不加—backup参数启动的master在ZooKeeper中创建/hbase/master这个znode。
启动的备份master会进入轮询选举阶段。
在Hbase0.90.x开始,可以通过conf目录下添加backup-masters文件来指定备份服务器。
如:添加3个备份master运行在Zookeeper所在的服务器上
Conf/backup-masters中的内容:
Zk1.foo.com
Zk2.foo.com
Zk3.foo.com
注意:在backup-masters中的节点会使用—backup选项来启动备份master进程。并且是在start-hbase.sh脚本启动主master和region服务器之后,备份master才会启动。
添加region服务器
步骤:
1. 修改conf目录下的regionservers文件,这样可以使启动脚本能够添加新服务器。
简单地在文件中添加一行,内容为对应要添加的region服务器的主机名
2. 将修改的配置文件复制到集群中所有的机器上
3. 确认新添加的机器上已经安装Hbase,且配置正确
4. 在master机器上执行start-hbase.sh脚本,会跳过所有以已经启动region服务器的服务。
另一种,直接在新的机器上执行
Hbase-daemon.sh start regionserver
日志分析
不同服务种类创建的日志文件
服务器类型 log文件
HBase Master $HBASE_HOME/logs/HBase-<user>-master-<hostname>.log
HBase RegionServer $HBASE_HOME/logs/HBase-<user>-master-<hostname>.log
ZooKeeper 只在控制台打印日志
NameNode $HADOOP_HOME/logs/hadoop-<user>-namenode-<hostname>.log
DataNode $HADOOP_HOME/logs/hadoop-<user>-datanode-<hostname>.log
JobTracker $HADOOP_HOME/logs/hadoop-<user>-jobtracker-<hostname>.log
TaskTracker $HADOOP_HOME/logs/hadoop-<user>-jobtracker-<hostname>.log