1. hbase基本配置及其各种性能调整参数配置
1.1 hbase-site.xml配置
- hbase.tmp.dir 本地文件系统tmp目录, 一般配置成local模式的设置一下, 但是最好还是需要设置一下, 因为很多文件都会默认设置成它下面的
默认值:
${java.io.tmpdir}/hbase-${user.name}
写到系统的/tmp目录
hbase.rootdir
<property>
<name>hbase.tmp.dir</name>
<value>/data/hbase/hbase-tmp</value>
</property>
- hbase.rootdir HBase集群中所有RegionServer共享目录, 用来持久化HBase的数据, 一般设置的是hdfs的文件目录, 如hdfs://namenode.example.org:9000/hbase
默认值:
${hbase.tmp.dir}/hbase
<property>
<name>hbase.rootdir</name>
<value>hdfs://mycluster/hbase</value>
</property>
-
hbase.cluster.distributed
集群的模式, 分布式还是单机模式, 如果设置成false的话, HBase进程和Zookeeper进程在同一个JVM进程。
线上配置为true
默认值: false -
hbase.zookeeper.quorum zookeeper集群的URL配置, 多个host中间用逗号(,)分割
默认值: localhost
<property>
<name>hbase.zookeeper.quorum</name>
<value>inspurXXX.xxx.xxx.org,inspurXXX.xxx.xxx.org,inspurXXX.xxx.xxx.org,inspurXXX.xxx.xxx.org,inspurXXX.xxx.xxx.org</value>
</property>
-
hbase.zookeeper.property.dataDir ZooKeeper的zoo.conf中的配置。 快照的存储位置
线上配置: /home/hadoop/zookeeperData
默认值: ${hbase.tmp.dir}/zookeeper -
zookeeper.session.timeout 客户端与zk连接超时时间
这是个值得说道一下的配置, 首先ZK客户端要用, Hbase使用zk的客户端联系总体, 同时也被用来启动一个zk server, 作为zk的maxSessionTimeout, 总的来说就是regionserver与zk的关键参数, 如果连接超时, master会重新的balance, regionserver也会被从集群名单中清除, 默认是90000; 一个问题是如果zk 由hbase自己维护, 那么该参数作为regionserver连接是一个值, 如果zk在另外的集群, 那么zk自己的maxSessionTimeout参数将优先于Hbase的该参数, 届时可能会发生超时时间不同的问题;
线上配置: 1200000(20min)
默认值: 180000(3min) -
hbase.zookeeper.property.tickTime Client端与zk发送心跳的时间间隔
线上配置: 6000(6s)
默认值: 6000 -
hbase.security.authentication HBase集群安全认证机制, 目前的版本只支持kerberos安全认证。
线上配置: kerberos
默认值: 空 -
hbase.security.authorization HBase是否开启安全授权机制
线上配置: true
默认值: false -
hbase.regionserver.kerberos.principal
regionserver的kerberos认证的主体名称(由三部分组成: 服务或用户名称、实例名称以及域名)
运行HRegionServer进程时需要kerberos的principal name, 这个配置就是这个name的值, 形如: hbase/_HOST@EXAMPLE.COM;线上配置: hbase/_HOST@HADOOP.xxx.xxx.COM
默认: 无 -
hbase.regionserver.keytab.file kerberos keytab 文件的全路径名, 用来为HRegionServer做log
线上配置: /home/hadoop/etc/conf/hbase.keytab
默认值: 无 -
hbase.master.kerberos.principal
运行HMaster进程时需要kerberos的principal name, 这个配置就是这个name的值, 形如: hbase/_HOST@EXAMPLE.COM;
线上配置: hbase/_HOST@HADOOP.xxx.xxx.COM
默认: 无 -
hbase.master.keytab.file
kerberos keytab 文件的全路径名, 用来为HMaster做log
线上配置: /home/hadoop/etc/conf/hbase.keytab
默认值: 无 -
hbase.regionserver.handler.count regionserver处理IO请求的线程数
regionserver上rpc listener的个数, http://kenwublog.com/hbase-performance-tuning把这个配置称为io线程数, 其实雷同, 就是说在regionserver上一个处理rpc的handler
线上配置: 50
默认配置: 10 -
hbase.regionserver.global.memstore.upperLimit
memstore在regionserver内存中的上限, 届时新的update被阻塞并且flush被强制写, 默认是0.4就是堆内存的40%; 阻塞状态持续到regionserver的所有memstore的容量到达hbase.regionserver.global.memstore.lowerLimit
线上配置: 0.45
默认配置: 0.4 -
hbase.regionserver.global.memstore.lowerLimit
RegionServer进程触发flush的一个条件: 该节点上所有region的memstore之和达到lowerLimit*heapsize
线上配置: 0.4
默认配置: 0.35 -
hbase.client.write.buffer
htable客户端写缓冲区大小, 默认是 2097152 BYTE, 这个缓冲区就是为了写数据的临时存放, 设置大了, 浪费客户端和服务端的存储, 设置小了, 如果写的数据多, 太多的RPC又带来网络开销, 官方给的一个服务端存储耗费评估计算是: hbase.client.write.buffer*hbase.regionserver.handler.count, 服务端的rs的处理handler个数也很关键; 当客户端写满buffer才flush
线上配置: 8388608(8M)
默认配置: 2097152(2M) -
hbase.hregion.max.filesize
HStoreFile的最大尺寸, 换句话说, 当一个region里的列族的任意一个HStoreFile超过这个大小, 那么region进行split, 默认是10737418240;
线上配置: 107374182400(100G)
默认配置: 21474836480(20G) -
hbase.hregion.memstore.block.multiplier
如果memstore的大小满足hbase.hregion.block.memstore * hbase.hregion.flush.size个byte, 那么阻塞update, 这个配置可以避免不必要的长时间split或者compact, 甚至是OOME, 默认是2;
线上配置: 8(内存够大可以适当调大一些, 出现这种情况需要客户端做调整)
默认配置: 2 -
hbase.hregion.memstore.flush.size
Memstore写磁盘的flush阈值, 超过这个大小就flush, 默认是134217728;
线上配置: 104857600(100M)
默认值: 134217728(128M) -
hbase.hregion.memstore.mslab.enabled
开启MemStore-Local Allocation Buffer, 这个配置可以避免在高写入的情况下的堆内存碎片, 可以降低在大堆情况下的stop-the-world GC频率, 默认是true;
线上配置: true
默认配置: true -
hbase.regionserver.maxlogs
regionserver的hlog数量
线上配置: 128
默认配置: 32 -
hbase.regionserver.hlog.blocksize
hlog大小上限, 达到该值则block, 进行roll掉
线上配置: 536870912(512M)
默认配置: hdfs配置的block大小 -
hbase.hstore.compaction.min
进入minor compact队列的storefiles最小个数
线上配置: 10
默认配置: 3 -
hbase.hstore.compaction.max
每个minor compaction的HStoreFile个数上限, 默认是10;
线上配置: 30
默认配置: 10 -
hbase.hstore.blockingStoreFiles
一个HStore存储HStoreFile阻塞update的阈值, 超过这个阈值, HStore就进行compaction, 直到做完才允许update, 默认是10;
线上配置: 100(生产环境可以设置得很大)
默认配置: 7 -
hbase.hstore.blockingWaitTime
一个更强力的配置, 配合上一个参数, 当HStore阻塞update时, 超过这个时间限制, 阻塞取消, 就算compaction没有完成, update也不会再被阻塞, 默认是90000毫秒;
线上配置: 90000(90s)
默认配置: 90000(90s) -
hbase.hregion.majorcompaction
一个region的所有HStoreFile进行major compact的时间周期, 默认是604800000 毫秒(7天)
线上配置: 0(关掉major compact)
默认配置: 86400000(1d) -
hbase.regionserver.thread.compaction.large
large compact线程池的线程个数
线上配置: 5
默认配置: 1 -
hbase.regionserver.thread.compaction.small
small compact线程池的线程个数
线上配置: 5
默认配置: 1 -
hbase.regionserver.thread.compaction.throttle
compact(major和minor)请求进入large和small compact线程池的临界点
线上配置: 10737418240(10G)
默认配置: 2 * this.minFilesToCompact * this.region.memstoreFlushSize -
hbase.hstore.compaction.max.size
minor compact队列中storefile文件最大size
线上配置: 21474836480(20G)
默认配置: Long.MAX_VALUE -
hbase.rpc.timeout
Hbase client发起远程调用时的超时时限, 使用ping来确认连接, 但是最终会抛出一个TimeoutException, 默认值是60000;
线上配置: 300000(5min)
默认配置: 60000(10s) -
hbase.regionserver.region.split.policy
split操作默认的策略
线上配置: org.apache.hadoop.hbase.regionserver.ConstantSizeRegionSplitPolicy(采取老的策略, 自己控制split)
默认配置: org.apache.hadoop.hbase.regionserver.IncreasingToUpperBoundRegionSplitPolicy(在region没有达到maxFileSize的前提下, 如果fileSize达到regionCount * regionCount * flushSize则进行split操作) -
hbase.regionserver.regionSplitLimit
regionsplit的最大限额, 默认是MAX_INT=2147483647, 设置这个限制后, 在到达限制时region split就不会再进行;
线上配置: 150
默认配置: 2147483647
1.2 hbase-env.sh配置
1.2.1 指定系统运行环境
export JAVA_HOME=/usr/local/jdk1.8.0_241 #JDK HOME
export HBASE_HOME=/usr/local/hbase-2.1.5 # HBase 安装目录
export HBASE_LOG_DIR=/data/logs/hbase-logs #日志输出路径
1.2.2 JVM参数调优
export HBASE_OPTS="-verbose:gc -XX:+PrintGCDetails -Xloggc:${HBASE_LOG_DIR}/hbase-gc.log -XX:+PrintGCTimeStamps \
-XX:+PrintGCApplicationConcurrentTime -XX:+PrintGCApplicationStoppedTime \
-server -Xmx20480m -Xms20480m -Xmn10240m -Xss256k -XX:SurvivorRatio=4 -XX:MaxPermSize=256m -XX:MaxTenuringThreshold=15 \
-XX:ParallelGCThreads=16 -XX:+UseConcMarkSweepGC -XX:+UseParNewGC -XX:CMSFullGCsBeforeCompaction=5 -XX:+UseCMSCompactAtFullCollection \
-XX:+CMSClassUnloadingEnabled -XX:CMSInitiatingOccupancyFraction=70 -XX:+UseCMSInitiatingOccupancyOnly -XX:CMSMaxAbortablePrecleanTime=5000 \
"
1.2.3 其他参数
-
hbase.local.dir: 本地文件系统被用在本地存储的目录, 默认${hbase.tmp.dir}/local/;
-
hbase.master.port: hbase master绑定的端口, 默认是60000;
-
hbase.master.info.port: hbase master web 界面的端口, 默认是60010, 设置为-1可以禁用ui;
-
hbase.master.info.bindAddress: master web界面的绑定地址, 默认是0.0.0.0;
-
hbase.master.logcleaner.plugins: 清理日志的插件列表, 逗号分隔, 被LogService调用的LogCleanerDelegate, 可以自定义, 顺序执行, 清理WAL和HLog; 默认org.apache.hadoop.hbase.master.cleaner.TimeToLiveLogCleaner
-
hbase.master.logcleaner.ttl: HLog在.oldlogdir目录中生存的最长时间, 过期则被Master起线程回收, 默认是600000;
-
hbase.master.hfilecleaner.plugins: HFile的清理插件列表, 逗号分隔, 被HFileService调用, 可以自定义, 默认org.apache.hadoop.hbase.master.cleaner.TimeToLiveHFileCleaner
-
hbase.master.catalog.timeout: Catalog Janitor从master到META的超时时间, 我们知道这个Janitor是定时的去META扫描表目录, 来决定回收无用的regions, 默认是600000;
-
fail.fast.expired.active.master: 如果master过期, 那么不需要从zk恢复, 直接终止, 默认是false;
-
hbase.master.dns.interface: master的dns接口, 向该接口提供ip, 默认是default;
-
hbase.master.dns.nameserver: master使用的dns主机名或者ip, 默认是default;
-
hbase.regionserver.port: regionserver绑定的端口, 默认是60020;
-
hbase.regionserver.info.port: regionserver的web界面端口, -1取消界面, 默认是60030;
-
hbase.regionserver.info.bindAddress: regionserver的web绑定, 默认是0.0.0.0;
-
hbase.regionserver.info.port.auto: master或者regionserver是否自动搜索绑定的端口, 默认是false;
-
hbase.regionserver.msginterval: regionserver向master发消息的间隔, 默认3000毫秒;
-
hbase.regionserver.optionallogflushinterval: 如果没有足够的entry触发同步, 那么过了这个间隔后HLog将被同步到HDFS, 默认是1000毫秒;
-
hbase.regionserver.logroll.period: 不管有多少版本, 直接roll掉commit log的周期, 也就是说一个固定的时间周期, 到期就roll, 默认是3600000毫秒;
-
hbase.regionserver.logroll.errors.tolerated: 可接受的WAL关闭错误个数, 到达后将触发服务器终止; 设置为0那么在WAL writer做log rolling失败时就停止region server, 默认是2;
-
hbase.regionserver.hlog.reader.impl: HLog 文件reader的实现类, 默认是org.apache.hadoop.hbase.regionserver.wal.ProtobufLogReader;
-
hbase.regionserver.hlog.writer.impl: HLog 文件writer的实现类, 默认是org.apache.hadoop.hbase.regionserver.wal.ProtobufLogWriter;
-
hbase.regionserver.global.memstore.lowerLimit: memstore在regionserver内存中的最大上限, 到达时flush就被强制写, 默认是0.38等价于38%的内存容量;
-
hbase.regionserver.optionalcacheflushinterval: 一个edit版本在内存中的cache时长, 默认3600000毫秒, 设置为0的话则禁止自动flush;
-
hbase.regionserver.catalog.timeout: regionserver的Catalog Janitor访问META的超时时间, 默认是600000;
-
hbase.regionserver.dns.interface: 同master类似~~不讲
-
hbase.regionserver.dns.nameserver: 同master类似
-
zookeeper.znode.parent: znode存放root region的地址, 默认是root-region-server;
-
zookeeper.znode.acl.parent: root znode的acl, 默认acl;
-
hbase.zookeeper.dns.interface: zk的dns接口, 默认default;
-
hbase.zookeeper.dns.nameserver: zk的dns服务地址, 默认default;
-
hbase.zookeeper.peerport: zk的peer之间的通讯端口, 默认是2888;
-
hbase.zookeeper.leaderport: zk选leader的通讯端口, 默认是3888;
-
hbase.zookeeper.useMulti: zk支持多重update, 要求zk在3.4版本以上, 默认是false;
-
hbase.config.read.zookeeper.config: 让hbaseconfig去读zk的config, 默认false, 也不支持开启, 这个功能很搞笑~~个人观点;
-
hbase.zookeeper.property.initLimit: zk的配置, 同步的属性个数限制, 默认10个~~没用;
-
hbase.zookeeper.property.syncLimit: zk的配置, 同步时的每次请求的条数, 默认5个;
-
hbase.zookeeper.property.clientPort: zk的配置, client连zk的端口, 默认2181;
-
hbase.zookeeper.property.maxClientCnxns: zk的配置, 允许接入zk的最大并发连接数的限制, 按ip分配, 默认300;
-
hbase.client.pause: pause时长, 在hbase发生get或其他操作fail掉的时候进行pause的时间长度, 默认是100;
-
hbase.client.retries.number: 发生操作fail时的重试次数, 结合上一个指标一起来控制总的重试时间, 默认是35;
-
hbase.client.max.total.tasks: 一个HTable实例可以提交给集群的最大并发任务数, 默认是100;
-
hbase.client.max.perserver.tasks: 一个HTable实例给一台regionserver提交的最大并发任务数, 默认是5;
-
hbase.client.max.perregion.tasks: 客户端连接一台region的最大连接数, 换句话说, 当你有这么多个连接在region时, 新的操作不被发送直到有操作完成, 默认是1;
-
hbase.client.scanner.caching: 做scanner的next操作时(如果再本地client没找到)缓存的数据行数, 这个值的设置也需要权衡, 缓存的多则快, 但吃内存, 缓存的少则需要多的拉数据, 需要注意的事项是如果两次调用的时间差大于scanner的timeout, 则不要设置该值, 默认是100;
-
hbase.client.keyvalue.maxsize: 一个KeyValue实例的最大大小, 这是存储文件中一个entry的容量上限, 合理的设置这个值可以控制regionserver的split, split不会拆keyvalue, 所以把keyvalue的大小设置为regionserver大小的一个比例分数(可除)是个不错的选择, 默认是10485760;
-
hbase.client.scanner.timeout.period: 结合刚才的caching做的一个, scanner的超时时间, 默认是60000毫秒;
-
hbase.client.localityCheck.threadPoolSize: 做localityCheck的线程池大小, 默认是2;
-
hbase.bulkload.retries.number: 做bulk load的最大重试次数, 默认是0, 即代表不断重试;
-
hbase.balancer.period: Master运行balancer的周期, 默认是300000毫秒;
-
hbase.regions.slop: 如果有regionserver的region数目超过average+(average*slop), 则rebalance, 默认是0.2;
-
hbase.server.thread.wakefrequency: 服务线程的sleep时间, 默认10000毫秒, 比如log roller;
-
hbase.server.versionfile.writeattempts: 退出前写 version file的重试次数, 默认3, 每次尝试的间隔由上一个参数控制;
-
hbase.hregion.preclose.flush.size: 如果一个region的memstore的大小等于或超过这个参数的量, 在关闭region时(放置关闭flag), 要提前flush, 然后region关闭下线, 默认大小是5242880;
-
hbase.hregion.majorcompaction: ;
-
hbase.hregion.majorcompaction.jitter: major compaction的发生抖动范围, 这么理解比较容易, 就是说上一个参数不是一个严格周期, 会有个抖动, 这个参数就是这个抖动的比例, 默认是0.5;
-
hbase.hstore.compactionThreshold: 一个HStore存储HStoreFile的个数阈值, 超过这个阈值则所有的HStoreFile会被写到一个新的HStore, 需要平衡取舍, 默认是3;
-
hbase.hstore.compaction.kv.max: 在flushing或者compacting时允许的最大keyvalue个数, 如果有大的KeyValue或者OOME的话则配置一个小的值, 如果行数多且小则配置大值, 默认是10;
-
hbase.storescanner.parallel.seek.threads: 如果并行查找开启的线程池大小, 默认是10;
-
hfile.block.cache.size: 一个配置比例, 允许最大堆的对应比例的内存作为HFile和HStoreFile的block cache, 默认是0.4, 即40%, 设置为0则disable这个比例, 不推荐这么做;
-
hfile.block.index.cacheonwrite: 在index写入的时候允许put无根(non-root)的多级索引块到block cache里, 默认是false;
-
hfile.index.block.max.size: 在多级索引的树形结构里, 如果任何一层的block index达到这个配置大小, 则block写出, 同时替换上新的block, 默认是131072;
-
hfile.format.version: 新文件的HFile 格式版本, 设置为1来测试向后兼容, 默认是2;
-
hfile.block.bloom.cacheonwrite: 对于组合布隆过滤器的内联block开启cache-on-write, 默认是false;
-
io.storefile.bloom.block.size: 一个联合布隆过滤器的单一块(chunk)的大小, 这个值是一个逼近值, 默认是131072;
-
hbase.rs.cacheblocksonwrite: 当一个HFile block完成时是否写入block cache, 默认是false;
-
hbase.rpc.server.engine: hbase 做rpc server的调度管理类, 实现自org.apache.hadoop.ipc.RpcServerEngine, 默认是org.apache.hadoop.hbase.ipc.ProtobufRpcServerEngine;
-
hbase.rpc.shortoperation.timeout: 另一个版本的hbase.rpc.timeout, 控制短操作的超时时限, 比如region server 汇报master的操作的超时时限可以设置小, 这样有利于master的failover, 默认是10000;
-
hbase.ipc.client.tcpnodelay: 默认是true, 具体就是在tcp socket连接时设置 no delay;
-
hadoop.policy.file: RPC服务器做权限认证时需要的安全策略配置文件, 在Hbase security开启后使用, 默认是habse-policy.xml;
-
hbase.superuser: Hbase security 开启后的超级用户配置, 一系列由逗号隔开的user或者group;
-
hbase.auth.key.update.interval: Hbase security开启后服务端更新认证key的间隔时间: 默认是86400000毫秒;
-
hbase.auth.token.max.lifetime: Hbase security开启后, 认证token下发后的生存周期, 默认是604800000毫秒;
-
hbase.ipc.client.fallback-to-simple-auth-allowed: client使用安全连接去链接一台非安全服务器时, 服务器提示client切换到SASL SIMPLE认证模式(非安全), 如果设置为true, 则client同意切换到非安全连接, 如果false, 则退出连接;
-
hbase.coprocessor.region.classes: 逗号分隔的Coprocessores列表, 会被加载到默认所有表上。在自己实现了一个Coprocessor后, 将其添加到Hbase的classpath并加入全限定名。也可以延迟加载, 由HTableDescriptor指定;
-
hbase.rest.port: Hbase REST服务器的端口, 默认是8080;
-
hbase.rest.readonly: 定义REST服务器启动的模式, 有两种方式, false: 所有http方法都将被通过-GET/PUT/POST/DELETE, true: 只有get方法ok。默认值是false;
-
hbase.rest.threads.max: REST服务器线程池的最大线程数, 池满的话新请求会自动排队, 限制这个配置可以控制服务器的内存量, 预防OOM, 默认是100;
-
hbase.rest.threads.min: 同上类似, 最小线程数, 为了确保服务器的服务状态, 默认是2;
-
hbase.rest.support.proxyuser: 使REST服务器支持proxy-user 模式, 默认是false;
-
hbase.defaults.for.version.skip: 是否跳过hbase.defaults.for.version的检查, 默认是false;
-
hbase.coprocessor.master.classes: 由HMaster进程加载的coprocessors, 逗号分隔, 全部实现org.apache.hadoop.hbase.coprocessor.MasterObserver, 同coprocessor类似, 加入classpath及全限定名;
-
hbase.coprocessor.abortonerror: 如果coprocessor加载失败或者初始化失败或者抛出Throwable对象, 则主机退出。设置为false会让系统继续运行, 但是coprocessor的状态会不一致, 所以一般debug时才会设置为false, 默认是true;
-
hbase.online.schema.update.enable: 设置true来允许在线schema变更, 默认是true;
-
hbase.table.lock.enable: 设置为true来允许在schema变更时zk锁表, 锁表可以组织并发的schema变更导致的表状态不一致, 默认是true;
-
hbase.thrift.minWorkerThreads: 线程池的core size, 在达到这里配置的量级后, 新线程才会再新的连接创立时创建, 默认是16;
-
hbase.thrift.maxWorkerThreads: 顾名思义, 最大线程数, 达到这个数字后, 服务器开始drop连接, 默认是1000;
-
hbase.thrift.maxQueuedRequests: Thrift连接队列的最大数, 如果线程池满, 会先在这个队列中缓存请求, 缓存上限就是该配置, 默认是1000;
-
hbase.thrift.htablepool.size.max: Thrift服务器上table pool的最大上限, 默认是1000;
-
hbase.offheapcache.percentage: JVM参数-XX:MaxDirectMemorySize的百分比值, 默认是0, 即不开启堆外分配;
-
hbase.data.umask.enable: 开启后, 文件在regionserver写入时会 有权限相关设定, 默认是false不开启;
-
hbase.data.umask: 开启上面一项配置后, 文件的权限umask, 默认是000;
-
hbase.metrics.showTableName: 是否为每个指标显示表名前缀, 默认是true;
-
hbase.metrics.exposeOperationTimes: 是否进行关于操作在使用时间维度的指标报告, 比如GET PUT DELETE INCREMENT等, 默认是true;
-
hbase.snapshot.enabled: 是否允许snapshot被使用、存储和克隆, 默认是true;
-
hbase.snapshot.restore.take.failsafe.snapshot: 在restore过程中, 如果失败则启用snapshot替换, 成功则删除掉snapshot, 默认开启true;
-
hbase.snapshot.restore.failsafe.name: 刚才所说过程中snapshot的名字, 默认是hbase-failsafe-{snapshot.name}-{restore.timestamp};
-
hbase.server.compactchecker.interval.multiplier: 检查是否需要compact的时间间隔, 一般情况是在比如memstore flush后或者其他事件触发compact的, 但是有时也需要不同的compact策略, 所以需要周期性的检查具体间隔=hbase.server.compactchecker.interval.multiplier * hbase.server.thread.wakefrequency, 默认1000;
-
hbase.lease.recovery.timeout: 在dfs 租约超时时限, 超时则放弃, 默认是900000;
-
hbase.lease.recovery.dfs.timeout: dfs恢复租约调用的超时时限, 默认是64000;