HBase管理指南

hadoop master      web端口  50070   
hadoop slave       web端口  50075   

hbase master       web端口  60010   通讯端口 60000 
hbase regionserver web端口  60030   通讯端口 60020 
hbase rest         web端口  8085    通讯端口 8080        
hbase thrift       web端口  9095    通讯端口 9090 
zookeeper          通讯端口 2181 



数据迁移  
从mysql中导入数据到hbase中,mysql中的每一个变量对应hbase中的一个列 

使用importtsv导入(直接导入或者分两步导入) 
分两步导入需要completebulkload 命令配合,具体参加《HBase权威指南》12章的介绍 

编写自定义的MapReduce来导入数据,实际上importtsv也是用mapreduce来完成导入的 
HBase提供了一个TableOutputFormat类,可以在MapReducce任务中奖数据写入到HBase表中 
还可以用HFileOutputFormat生成一些HBase内部的HFile格式,然后用completebulkload导入 

在导入数据前,可以预创建一些region 
./hbase org.apache.hadoop.hbase.util.RegionSplitter 
如 
.....RegionSplitter -c 10 -f n my_table 
-c表示预先创建多少region,-f是列名 


使用管理工具  
close_region 'regionname'  关闭一个region 
move 'encode_regionname' 'hostname'     encodename是一个md5码,可以在webUI上查到 
如:move '19247542e256f063a714cda044685102','vm11080115,60020,1378462477076' 
flush 'table_name' 将存在于memstore中的数据刷新到磁盘中 
split 'region_name'   对一个region 进行分割 
compact 'test_table'    合并一个表 
major_compact 'table_name'   进行主合并 
count 'table_name' 统计表行数 

在hbase shell中导入需要的java类 
import java.util.Date 
创建这个类 
Date.new(100).toString() 

scan中使用过滤器 
scan 'table_name',{FILTER=>AAFilter.new(10)} 

使用map reduce统计行数 
hadoop jar $HBASE_HOME\hbase.jar rowcounter table_name    需要先运行map reduce 

hbase hbck检查region的完整性 
hbase -fix修改错误的reion 

hbase hfile 查看hfile信息 

hbase hlog 查看wal日志信息,注意传入的文件size必须是大于0的 





维护和安全  
webUI界面支持动态调整日志级别 
如进入日志界面,设置: 
org.apache.hadoop.ipc  为DEBUG级别 
也可以通过命令设置 
./hadoop daemonlog -getlevel localhost:60010 org.apache.hadoop.hbase 
./hadoop daemonlog -setlevel localhost:60010 org.apache.hadoop.hbase INFO 

平稳节点停机 
./graceful_stop.sh hostname 
这个脚本会先关闭负载均衡功能,之后将hostname上的所有region迁移到其他机器上,再关闭这个服务器,最后将zookeeper上对应该服务器的znode删除,这样master就知道该服务器下线了。 

为集群添加节点 
在备用节点上启动master进程: 
./hbase-daemon.sh start master --backup 
在master节点的conf/regionservers 文件中增加一个新host的地址 
在master节点上启动./start-hbase.sh,它会过滤掉已经启动的server,单独启动新server 
或者在新的server上单独启动,./hbase-daemon.sh start regionserver 
最后开启负载均衡 
./hbase shell  
balance_switch true 
balancer 

滚动重启 
hbck检查,重启master节点,禁用负载均衡,优雅的重启region server 

使用脚本管理HBase集群的进程(这是通过SSH的方式实现的) 

简单化的部署 
这是通过rsync实现的 
for rs in 'cat $HBASE_HOME/conf/regionservers' 
  do 
    echo "deploying to $rs:" 
    rsync -avz --delete --exclude=log $HBASE_HOME 
    $rs:$HBASE_HOME 
    echo 
    sleep 1 
  done 
echo "done" 
还可以通过pupper,Chef管理,apache提供了一个工具 
bigtop,用来构建和部署hadoop和hbase 

安全机制,主要是通过kerberos实现的 





故障排除  
Cluster SSH工具可以方便管理小型集群,可以在多台机器执行同一命令 
ps命令有一个k选项,可以用来指定结果的排序顺序,用-rss格式说明符(根据内存大小排序) 

同时打开文件超过上限,配置hdfs-site.xml 
dfs.datanode.max.xcievers 
4096 

处理打开文件过多的错误 
vim /etc/security/limits.conf 增加设置 
username soft nofile 65535         软限制是操作系统内核强制的可打开的进程数值 
username hard nofile 65535         硬限制则是软限制的上限 
vim /etc/pam.d/login 增加设置 
session required pam_limits.so 
使用命令查看ulimit -n 
查看当前用户打开了多少文件 
lsof -u username | wc -l 

无法创建新本地线程错误 
vim /etc/security/limits.conf 增加配置 
username soft nproc 32000 
username hard nproc 32000 
vim /etc/pam.d/login  增加配置 
session required pam_limits.so 
使用命令查看 ulimit -u 
查看当前用户进程打开的线程数量 
ps -o pid,comm,user,thcount -u root 

处理HBase忽略了HDFS的客户端配置问题 
HDFS的配置信息在hdfs-site.xml中,若要使HDFS客户端配置对HBase生效,需要增加一个软链接 
ln -s $HADOOP_HOME/conf/hdfs-site.xml $HBASE_HOME/conf/hdfs-site.xml 

Zookeeper客户端链接错误 
java.io.IOException: Connection reset by peer 
因为zookeeper限制客户端链接的并发数,每个HBase的region server也相当于一个客户端 
修改配置$ZOOKEEPER_HOME/conf/zoo.cfg,从3.4.0开始,这个值已经改成了60 
maxClientCnxns=60 
查看某一个IP连接到zookeeper的数量 
echo "cons" | nc localhost 2181 | grep "IP地址" | wc -l 

Zookeeper会话过期错误 
KeeperErrorCode = Session expired for /hbase/rs/region_server_name 
如果失去了与zookeeper的连接,主服务器或region server会自行关闭 
出现这个错误的原因是与zookeeper连接的客户端没有在指定的时间内与zookeeper通讯, 
包括master进程和region server进程,可能的原因是: 
1.长时间的JVM GC暂停    如果堆配置太大,一次GC可能很长时间完成,也有可能导致超时 
2.所配置的时间太短 
jstat查看gc信息 
vmstat 查看si(换入)和so(换出)的信息 
region server需要有足够的cpu资源,map-reduce可能会消耗很多cpu资源,top来查看 
调整map-reduce配置 
mapred.tasktracker.map.tasks.maximum 
2 
mapred.tasktracker.reduce.tasks.maximum 
1 
加大zookeeper超时时间,配置hbase-site.xml 
zookeeper.session.timeout 
120000   (秒为单位) 
加大每个zookeeper仲裁节点的zookeeper会话最大超时时间,配置zoo.cfg文件 
maxSessionTimeout=120000 





基本性能调整  
配置jbod(just a bunch of disks 磁盘簇) 
将datanode写入到每个磁盘中,如: 
dfs.data.dir 
/mnt/d0/dfs/data,/mnt/d1/dfs/data,/mnt/d3/dfs/data 

加入机架感知 
topology.script.file.name 
xx.sh脚本文件路径 

以noatime和nodiratime属性方式装载磁盘 
sudo vim /etc/fstab 
/dev/xvdc /mnt/is1 ext3 defaults,noatime,nodiratime 0 0 
卸载磁盘 
sudo umount /dev/xvdc 
sudo mount /dev/xvdc 
最后用mount命令来检查 
还可以去掉磁盘百分比检查 
sudo tune2fs -m 1 /dev/xvdc 

设置vm.swappiness避免换出 
下面命令到下一次重启后才生效 
sysctl -w vm.swappiness=0 
vm.swappiness = 0 
下面命令系统每次重启都会设置 
echo "vm.swappiness = 0" >> /etc/sysctl.conf 

增加GC日志输出 
-verbose:gc -XX:+PrintGCDetails -XX:+PringGCTimeStamps -Xloggc:/home/test/gc.log 
格式: 
:[GC[collector>: ->
secs] -> ,  
secs] {Times: ,
            是GC发生的时间,这是一个相对于应用程序启动后的时间 
            是次回收所使用回收算法的内部名称 
  是回收前年轻代占用空间的大小 
    是回收后年轻代占用空间的大小 
          是次回收的展厅时间(秒为单位) 
  是回收前整个堆占用空间的大小 
    是回收后整个堆占用空间的大小 
          是整个垃圾回收过程中的暂停时间,这将包括一个主回收的时间 
[Time}                 解释GC的时间都花在了那些方面,用户时间,系统时间和实际 
                       花费的时间 

使用压缩 
HBase支持LZO和gzip,LZO速度更快,LZO是gpl协议,需要单独下载 
LZO是用本地代码实现的,所以需要下载本地库 

次合并(minor compaction) 
hdfs上有很多store file,hbase自动合并一些小的store file,重写为一个大的store file 
主合并(major compaction) 
删除那些过期的cell,并将所有store file重写到一个store file,默认每天一次 
主合并对影响很大,关闭: 
hbase.hregion.majorcompaction 
0 
使用脚本的方式管理主合并 
echo "major_compaction 'region_name'" | ./hbase shell 
也可以通过HBaseAdmin管理 

自动分隔 
hbase.hregion.max.filesize 
number 
只有当region的大小超过定义的值时才分隔 
类似主合并的方式,也可以通过脚本管理 
echo "split 'region_name'" | ./hbase shell 
或者通过HBaseAdmin的方式管理 

遭遇0.92的版本,可以启动mem store本地分配缓冲区来防止写负载重时的老年代碎片问题 
hbase.hregion.memstore.mslab.enabled 
true 





高级配置和调整  
hbase自带的性能测试 
./hbase org.apache.hadoop.hbase.PerformanceEvaluation 
使用YCSB(yahoo cloud serving benchmark雅虎云服务基准) 
测试集群的总体吞吐量(美妙的操作数) 
集群的平均延迟时间 
最大,最小延迟 
操作延迟的分部情况 

增加区域服务器的处理线程数 
hbase.regionserver.handler.count 
num 
这是服务端控制RPC监听程序的线程数 

使用自定义算法预创建region  

避免写秘籍集群中的更新阻塞,调整配置 
hbase.hregion.memstore.block.multiplier 
num 
调整block store file属性: 
hbase.hstoreblockingStoreFiles 
num 
为了防止合并/分隔的时间过长导致内存耗尽的错误 
当某一个region的mem store大小达到一定的阀值时,hbase就会阻塞更新,定义为: 
hbase.hregion.memstore.flush.size 乘以 hbase.hregion.memstore.block.multiplier 
hbase.hregion.memstore.flush.size指定了memstore达到何值时被写入到磁盘中 
如果任何一个store的store file超过了hbase.hstore.blockingStroeFiles的值,那么该 
region的更新就会被阻塞,直到合并完成,或者超过了 
hbase.hstore.blockingWaitTime所指定的时间为止(秒为单位) 

调整mem store内存比列大小,下面配置定义了一个region中所有memstroe的占堆的比列 
hbase.regionserver.global.memstore.upperLimit 
0.45 
下面值定义了何时对memstore强制写入磁盘,当memstore占总内存比列低于这个值时停止 
hbase.regionserver.global.memstore.lowerLimit 
0.4 

低延迟系统的客户端调节 
让客户端在两次重试之间休眠的时间 
hbase.client.pause 
20    (默认为1秒) 
最大重试的次数 
hbase.client.retries.number 
11 
两次重试之间的休眠时间可按下面这个公式计算得出 
pause_time = hbase.client.pause * RETRY_BACKOFF[retries] 
RETRY_BACKOFF是一个重试系数表(使用指数退避算法) 
{1,1,1,2,2,4,4,8,16,32} 
禁用tcp nodelay算法 
hbase.ipc.client.tcpnodelay 
true 
ping超时时间 
ipc.ping.interval 
4000   (毫秒为单位) 
以上这些配置可以通过Configuration定义 

配置列簇的块缓存 
create 'table1',{NAME=>'f1',IN_MEMORY=>'true'},{NAME=>'f2',BLOCKCACHE=>'false'} 
HBase块缓存优先级为: 
1.单次存取 
2.多次存取 
3.内存中存取 
单次存取占内存25% 
夺取存取占内存50% 
内存中内存占内存25% 
也可以通过alter命令修改 

调高读密集集群的块缓存大小 
region server上块缓存的总空间配置为: 
hfile.block.cache.size 
0.3 
memstore 和 块缓存加一起通常会消耗region server堆空间的60%-70% 
webUI上可以观察到块相关信息: 
blockCacheCount           块数量 
blockCacheHitCount        块命中数量 
blockCacheMissCount       块未命中数量 
blockCacheEvictedCount    块被驱逐数量 
blockCacheHitRatio        缓存命中比列,包括setCacheBlocks(false)的 
blockCacheHitCachingRatio 普通命中比列,不包括设置了setCacheBlocks(false)的 

客户端扫描类设置 
一次scan的next()可以读取的行数 
hbase.client.scanner.caching 
500 
防止将扫描类扫描过的块放入缓存中 
Scan#setCacheBlocks(false) 
也可以通过代码设置,下面表示每次调用next()方法时都会一次读取1000行 
Scan#setCaching(1000) 

调整块大小来提高寻到性能 
通过./hbase hfile来分析hfile的平均key长度和平均value长度 
创建表,并设置块缓存(16K),也可以通过alter命令设置 
create 'table1',{NAME=>'f1',BLOCKSIZE=>'16384'} 
较小的块对于随即存取更快,但是块索引变大,也会消耗更多内存 
较大的快对于顺序读取更好 

启用Bloom过滤器提高整体吞吐量 
HBase的Bloom过滤器是一种用于测试没偶个StoreFile是否包含指定的行或行-列单元格的空间-效率机制 
确定某StoreFile是否包含某一行键的唯一办法就是检查该StoreFile的块索引,因为那里存储了该StoreFile的每个块的开始行键,但这样有可能会扫描多个StoreFile的块索引,Bloom过滤器可以做到不用扫描多余的StoreFile 
create 'table1',{NAME=>'f1',BLOOMFILTER=>'ROW'},{NAME=>'f2',BLOOMFILTER=>'ROWCOL'} 
使用Bloom的目的是: 
使HBase能搞笑滴找出一个StroeFile是否包含指定的行或单元格,而无需真正的加载该文件扫描数据块 
Bloom可能出现假阳性,也就是某行包含在文件中,但实际上并没有包含 
但Bloom不允许出现假阴性,也就是某个不在文件中,那该行就绝不会在该文件中 
通常情况下错误率是0.01(由io.storefile.bloo,.error.reate来配置) 
使用Bloom过滤器的另一个优点是: 
  它可以改善块缓存比,在启用Bloom过滤器后,因为无需加载不必要的块,所以那些含有 
  客户端真正要查询的数据的块留在块缓存中的机会就更大,这就提升了整个集群的性能 
如果一行的大多数单元格会在一起更新,那么用行过滤器就更合适 
如果要分散更新多列值的话,行列过滤器就更合适 
Bloom过滤器中的每个条目都要占用1字节的存储空间,如键值占20字节,那么Bloom过滤器将在文件中占1/20,如果单元格大小为1KB,Bloom过滤器只占文件的1/1000,。 
  因此在小型单元格中禁用bloom,在大型单元格中一直启用bloom过滤器 

你可能感兴趣的:(HBase,计算机书籍)