这个问答是根据云栖社区上对HBase的FAQ中整理出来的。
问:Hbase大量写入很慢,一个列族,每个200多列,一秒写30000条数据,使用mutate添加数据,clientbuffer缓存大小为10M,四台测试机,128G内存,分配60G给Hbase,该怎么优化?
答:可以使用bulkload方式写入,通过mr程序生产hfile文件,直接用bulkload导入生成的hfile文件,速度非常快。
问:hbase大规模的丢数据,整个数据库系统都挂掉了,然后发错误日志,说Hdfs内部的配置文件,hbase.version,丢失了。大家有遇到过类似的问题吗?自建的集群。
答:检查一下一些服务的端口有没有暴露到公网,是不是集群被攻击了。自建还是有一些风险的。然后检查下自己的hbase配置。看看数据的备份情况。
问:start-hbase.sh中有这么一段:
代码语言:javascript复制if [ "$distMode" == 'false' ]
then
"$bin"/hbase-daemon.sh --config "${HBASE_CONF_DIR}" $commandToRun master $@
else
"$bin"/hbase-daemons.sh --config "${HBASE_CONF_DIR}" $commandToRun zookeeper
"$bin"/hbase-daemon.sh --config "${HBASE_CONF_DIR}" $commandToRun master
"$bin"/hbase-daemons.sh --config "${HBASE_CONF_DIR}"
--hosts "${HBASE_REGIONSERVERS}" $commandToRun regionserver
"$bin"/hbase-daemons.sh --config "${HBASE_CONF_DIR}"
--hosts "${HBASE_BACKUP_MASTERS}" $commandToRun master-backup
fi
distMode为false时表示单机,true时表示集群,看脚本好像是单机只启动master,是否是说单机环境下不需要zookeeper,regionserver这些的意思,可是网上搜了下又有人说单机环境下master和 zookeeper会运行在同一个jvm。有谁对hbase比较熟悉的可以解答下吗?
答:单机模式所有的服务都是一个jvm 进程启动,底层的文件系统是本地文件系统,该jvm进程包括有zookeeper,hmaster和regionserver。其他模式需要手动分别启动zk,hmaster,regionserver到不同的进程中。
问:Hbase 在大规模用户画像标签,标签有近百个左右,适合吗?
答:hbase就是适用这种几百几千级别的场景,甚至可以支持百万列级别的,但是建议常用的小于10w列。
问:hbase 2 内置现在的事务做的怎么样?支持到什么隔离级别?如果有的话,hbase分布式事务依靠什么做的?
答:hbase事务目前还是region级别,hbase是可以做到跨行事务,但是只限于region级别。
问:批量删除hbase的数据用什么方式比较快
答:最快的方式就是直接设置TTL,如果业务无法满足,建议直接调度delete接口,性能也较快。
问:HBase 2.0 的查询性能怎样优化的?
答:在HBase的读和写链路中,均会产生大量的内存垃圾和碎片。比如说写请求时需要从Connection的ByteBuffer中拷贝数据到KeyValue结构中,在把这些KeyValue结构写入memstore时,又需要将其拷贝到MSLAB中,WAL Edit的构建,Memstore的flush等等,都会产生大量的临时对象,和生命周期结束的对象。随着写压力的上升,GC的压力也会越大。读链路也同样存在这样的问题,cache的置换,block数据的decoding,写网络中的拷贝等等过程,都会无形中加重GC的负担。而HBase2.0中引入的全链路offheap功能,正是为了解决这些GC问题。大家知道Java的内存分为onheap和offheap,而GC只会整理onheap的堆。全链路Offheap,就意味着HBase在读写过程中,KeyValue的整个生命周期都会在offheap中进行,HBase自行管理offheap的内存,减少GC压力和GC停顿。
写链路的offheap包括以下几个优化:
- 在RPC层直接把网络流上的KeyValue读入offheap的bytebuffer中
- 使用offheap的MSLAB pool
- 使用支持offheap的Protobuf版本(3.0 )
读链路的offheap主要包括以下几个优化:
- 对BucketCache引用计数,避免读取时的拷贝
- 使用ByteBuffer做为服务端KeyValue的实现,从而使KeyValue可以存储在offheap的内存中
- 对BucketCache进行了一系列性能优化
问:Hbase的bulkload有全量与增量的概念么?
答:snapshot 做全量 ,然后bulkload 做增量。
问:Hive on hbase 分析10亿以上数据性能问题?
答:性能会损失,hive支持通过类似sql语句的语法来操作hbase中的数据, 但是速度较慢。
问:直接读HFile与通过Hbase客户端读,性能提升多少?
答:全表扫使用spark读HFile,比直接读hbase性能提升两倍以上,并且不会影响hbase其他读写使用。
问:HBase region个数如何划分?
答:最好是你的regionserver的倍数 ,会自动的分配到每个服务器 ,注意rowkey要分散。参考文档:https://help.aliyun.com/document_detail/71787.html
希望对读者有帮助。
——END——