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
[b][size=medium]数据迁移[/size][/b]
从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是列名
[b][size=medium]使用管理工具[/size][/b]
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的
[b][size=medium]维护和安全[/size][/b]
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实现的
[b][size=medium]故障排除[/size][/b]
Cluster SSH工具可以方便管理小型集群,可以在多台机器执行同一命令
ps命令有一个k选项,可以用来指定结果的排序顺序,用-rss格式说明符(根据内存大小排序)
同时打开文件超过上限,配置hdfs-site.xml
<name>dfs.datanode.max.xcievers</name>
<value>4096</value>
处理打开文件过多的错误
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配置
<name>mapred.tasktracker.map.tasks.maximum</name>
<value>2</value>
<name>mapred.tasktracker.reduce.tasks.maximum</name>
<value>1</value>
加大zookeeper超时时间,配置hbase-site.xml
<name>zookeeper.session.timeout</name>
<value>120000</value> (秒为单位)
加大每个zookeeper仲裁节点的zookeeper会话最大超时时间,配置zoo.cfg文件
maxSessionTimeout=120000
[b][size=medium]基本性能调整[/size][/b]
配置jbod(just a bunch of disks 磁盘簇)
将datanode写入到每个磁盘中,如:
<name>dfs.data.dir</name>
<value>/mnt/d0/dfs/data,/mnt/d1/dfs/data,/mnt/d3/dfs/data</value>
加入机架感知
<name>topology.script.file.name</name>
<value>xx.sh脚本文件路径</value>
以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
格式:
<timestamp>:[GC[collector>:<starting occupancy1> -> <ending occupancy1>,
<pause time1> secs] <starting occupancy3> -> <ending occupancy3>, <pause time3>
secs] {Times: <user time> <system time>, <real time>]
<timestamp> 是GC发生的时间,这是一个相对于应用程序启动后的时间
<collector> 是次回收所使用回收算法的内部名称
<starting occupancy1> 是回收前年轻代占用空间的大小
<ending occupancy1> 是回收后年轻代占用空间的大小
<pause time1> 是次回收的展厅时间(秒为单位)
<starting occupancy3> 是回收前整个堆占用空间的大小
<ending occupancy3> 是回收后整个堆占用空间的大小
<pause time3> 是整个垃圾回收过程中的暂停时间,这将包括一个主回收的时间
[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,默认每天一次
主合并对影响很大,关闭:
<name>hbase.hregion.majorcompaction</name>
<value>0</value>
使用脚本的方式管理主合并
echo "major_compaction 'region_name'" | ./hbase shell
也可以通过HBaseAdmin管理
自动分隔
<name>hbase.hregion.max.filesize</name>
<value>number</value>
只有当region的大小超过定义的值时才分隔
类似主合并的方式,也可以通过脚本管理
echo "split 'region_name'" | ./hbase shell
或者通过HBaseAdmin的方式管理
遭遇0.92的版本,可以启动mem store本地分配缓冲区来防止写负载重时的老年代碎片问题
<name>hbase.hregion.memstore.mslab.enabled</name>
<value>true</value>
[b][size=medium]高级配置和调整[/size][/b]
hbase自带的性能测试
./hbase org.apache.hadoop.hbase.PerformanceEvaluation
使用YCSB(yahoo cloud serving benchmark雅虎云服务基准)
测试集群的总体吞吐量(美妙的操作数)
集群的平均延迟时间
最大,最小延迟
操作延迟的分部情况
增加区域服务器的处理线程数
<name>hbase.regionserver.handler.count</name>
<value>num</value>
这是服务端控制RPC监听程序的线程数
[b]使用自定义算法预创建region[/b]
避免写秘籍集群中的更新阻塞,调整配置
<name>hbase.hregion.memstore.block.multiplier</name>
<value>num</value>
调整block store file属性:
<name>hbase.hstoreblockingStoreFiles</name>
<value>num</value>
为了防止合并/分隔的时间过长导致内存耗尽的错误
当某一个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的占堆的比列
<name>hbase.regionserver.global.memstore.upperLimit</name>
<value>0.45</value>
下面值定义了何时对memstore强制写入磁盘,当memstore占总内存比列低于这个值时停止
<name>hbase.regionserver.global.memstore.lowerLimit</name>
<value>0.4</value>
低延迟系统的客户端调节
让客户端在两次重试之间休眠的时间
<name>hbase.client.pause</name>
<value>20</value> (默认为1秒)
最大重试的次数
<name>hbase.client.retries.number</name>
<value>11</value>
两次重试之间的休眠时间可按下面这个公式计算得出
pause_time = hbase.client.pause * RETRY_BACKOFF[retries]
RETRY_BACKOFF是一个重试系数表(使用指数退避算法)
{1,1,1,2,2,4,4,8,16,32}
禁用tcp nodelay算法
<name>hbase.ipc.client.tcpnodelay</name>
<value>true</value>
ping超时时间
<name>ipc.ping.interval</name>
<value>4000</value> (毫秒为单位)
以上这些配置可以通过Configuration定义
配置列簇的块缓存
create 'table1',{NAME=>'f1',IN_MEMORY=>'true'},{NAME=>'f2',BLOCKCACHE=>'false'}
HBase块缓存优先级为:
1.单次存取
2.多次存取
3.内存中存取
单次存取占内存25%
夺取存取占内存50%
内存中内存占内存25%
也可以通过alter命令修改
调高读密集集群的块缓存大小
region server上块缓存的总空间配置为:
<name>hfile.block.cache.size</name>
<value>0.3</value>
memstore 和 块缓存加一起通常会消耗region server堆空间的60%-70%
webUI上可以观察到块相关信息:
blockCacheCount 块数量
blockCacheHitCount 块命中数量
blockCacheMissCount 块未命中数量
blockCacheEvictedCount 块被驱逐数量
blockCacheHitRatio 缓存命中比列,包括setCacheBlocks(false)的
blockCacheHitCachingRatio 普通命中比列,不包括设置了setCacheBlocks(false)的
客户端扫描类设置
一次scan的next()可以读取的行数
<name>hbase.client.scanner.caching</name>
<value>500</value>
防止将扫描类扫描过的块放入缓存中
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过滤器
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
[b][size=medium]数据迁移[/size][/b]
从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是列名
[b][size=medium]使用管理工具[/size][/b]
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的
[b][size=medium]维护和安全[/size][/b]
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实现的
[b][size=medium]故障排除[/size][/b]
Cluster SSH工具可以方便管理小型集群,可以在多台机器执行同一命令
ps命令有一个k选项,可以用来指定结果的排序顺序,用-rss格式说明符(根据内存大小排序)
同时打开文件超过上限,配置hdfs-site.xml
<name>dfs.datanode.max.xcievers</name>
<value>4096</value>
处理打开文件过多的错误
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配置
<name>mapred.tasktracker.map.tasks.maximum</name>
<value>2</value>
<name>mapred.tasktracker.reduce.tasks.maximum</name>
<value>1</value>
加大zookeeper超时时间,配置hbase-site.xml
<name>zookeeper.session.timeout</name>
<value>120000</value> (秒为单位)
加大每个zookeeper仲裁节点的zookeeper会话最大超时时间,配置zoo.cfg文件
maxSessionTimeout=120000
[b][size=medium]基本性能调整[/size][/b]
配置jbod(just a bunch of disks 磁盘簇)
将datanode写入到每个磁盘中,如:
<name>dfs.data.dir</name>
<value>/mnt/d0/dfs/data,/mnt/d1/dfs/data,/mnt/d3/dfs/data</value>
加入机架感知
<name>topology.script.file.name</name>
<value>xx.sh脚本文件路径</value>
以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
格式:
<timestamp>:[GC[collector>:<starting occupancy1> -> <ending occupancy1>,
<pause time1> secs] <starting occupancy3> -> <ending occupancy3>, <pause time3>
secs] {Times: <user time> <system time>, <real time>]
<timestamp> 是GC发生的时间,这是一个相对于应用程序启动后的时间
<collector> 是次回收所使用回收算法的内部名称
<starting occupancy1> 是回收前年轻代占用空间的大小
<ending occupancy1> 是回收后年轻代占用空间的大小
<pause time1> 是次回收的展厅时间(秒为单位)
<starting occupancy3> 是回收前整个堆占用空间的大小
<ending occupancy3> 是回收后整个堆占用空间的大小
<pause time3> 是整个垃圾回收过程中的暂停时间,这将包括一个主回收的时间
[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,默认每天一次
主合并对影响很大,关闭:
<name>hbase.hregion.majorcompaction</name>
<value>0</value>
使用脚本的方式管理主合并
echo "major_compaction 'region_name'" | ./hbase shell
也可以通过HBaseAdmin管理
自动分隔
<name>hbase.hregion.max.filesize</name>
<value>number</value>
只有当region的大小超过定义的值时才分隔
类似主合并的方式,也可以通过脚本管理
echo "split 'region_name'" | ./hbase shell
或者通过HBaseAdmin的方式管理
遭遇0.92的版本,可以启动mem store本地分配缓冲区来防止写负载重时的老年代碎片问题
<name>hbase.hregion.memstore.mslab.enabled</name>
<value>true</value>
[b][size=medium]高级配置和调整[/size][/b]
hbase自带的性能测试
./hbase org.apache.hadoop.hbase.PerformanceEvaluation
使用YCSB(yahoo cloud serving benchmark雅虎云服务基准)
测试集群的总体吞吐量(美妙的操作数)
集群的平均延迟时间
最大,最小延迟
操作延迟的分部情况
增加区域服务器的处理线程数
<name>hbase.regionserver.handler.count</name>
<value>num</value>
这是服务端控制RPC监听程序的线程数
[b]使用自定义算法预创建region[/b]
避免写秘籍集群中的更新阻塞,调整配置
<name>hbase.hregion.memstore.block.multiplier</name>
<value>num</value>
调整block store file属性:
<name>hbase.hstoreblockingStoreFiles</name>
<value>num</value>
为了防止合并/分隔的时间过长导致内存耗尽的错误
当某一个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的占堆的比列
<name>hbase.regionserver.global.memstore.upperLimit</name>
<value>0.45</value>
下面值定义了何时对memstore强制写入磁盘,当memstore占总内存比列低于这个值时停止
<name>hbase.regionserver.global.memstore.lowerLimit</name>
<value>0.4</value>
低延迟系统的客户端调节
让客户端在两次重试之间休眠的时间
<name>hbase.client.pause</name>
<value>20</value> (默认为1秒)
最大重试的次数
<name>hbase.client.retries.number</name>
<value>11</value>
两次重试之间的休眠时间可按下面这个公式计算得出
pause_time = hbase.client.pause * RETRY_BACKOFF[retries]
RETRY_BACKOFF是一个重试系数表(使用指数退避算法)
{1,1,1,2,2,4,4,8,16,32}
禁用tcp nodelay算法
<name>hbase.ipc.client.tcpnodelay</name>
<value>true</value>
ping超时时间
<name>ipc.ping.interval</name>
<value>4000</value> (毫秒为单位)
以上这些配置可以通过Configuration定义
配置列簇的块缓存
create 'table1',{NAME=>'f1',IN_MEMORY=>'true'},{NAME=>'f2',BLOCKCACHE=>'false'}
HBase块缓存优先级为:
1.单次存取
2.多次存取
3.内存中存取
单次存取占内存25%
夺取存取占内存50%
内存中内存占内存25%
也可以通过alter命令修改
调高读密集集群的块缓存大小
region server上块缓存的总空间配置为:
<name>hfile.block.cache.size</name>
<value>0.3</value>
memstore 和 块缓存加一起通常会消耗region server堆空间的60%-70%
webUI上可以观察到块相关信息:
blockCacheCount 块数量
blockCacheHitCount 块命中数量
blockCacheMissCount 块未命中数量
blockCacheEvictedCount 块被驱逐数量
blockCacheHitRatio 缓存命中比列,包括setCacheBlocks(false)的
blockCacheHitCachingRatio 普通命中比列,不包括设置了setCacheBlocks(false)的
客户端扫描类设置
一次scan的next()可以读取的行数
<name>hbase.client.scanner.caching</name>
<value>500</value>
防止将扫描类扫描过的块放入缓存中
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过滤器