HBase使用与Hadoop相同的配置系统,所有配置文件都位于 conf/ 目录中,需要保持群集中每个节点的同步。
配置文件说明
- backup-masters - 这是一个纯文本文件,其中列出了主服务器应在其上启动备份主进程的主机列表,每行一台主机名(默认情况下不存在)
- hadoop-metric2-hbase.properties - 用于连接HBase和Hadoop的Metric2框架,默认情况下只包含注释出的示例
- /hbase-env.cmd 和 /hbase-env.sh - 用于Windows和Linux/Unix环境的脚本,用于设置HBase的工作环境,包括 JAVA和其他环境变量的配置(该文件包含许多注释示例来提供指导,该文件的改动需要重启HBase才能生效)
- hbase-policy.xml - RPC服务器使用默认策略配置文件对客户端请求进行授权决策(仅在启用HBase安全性的情况下使用)
- hbase-site.xml - 主要的HBase配置文件,该文件覆盖了HBase的默认配置的配置选项(可以在HBase Web UI的HBase配置选项中查看整个集群的有效配置,包括默认和覆盖的)
- log4j.properties - HBase日志记录的配置文件
- regionservers - 纯文本文件,包含在HBase集群中运行RegionSever的主机名或IP列表,每行一个(默认情况下,这个文件包含单条条目 localhost)
检查XML有效性
在对HBase进行配置,即编辑hbase-site.xml文件时,确保语法正确且XML格式良好。我们可以使用 xmllint 检查XML格式是否正确,默认情况下, xmllint 重新流动并将XML打印到标准输出。如果检查格式是否正确,并且只在存在错误时才打印输出,可以使用以下命令:
xmllint -noout filename.xml
集群间保持同步配置
当在完全分布式环境下运行HBase时,在对HBase配置文件进行修改后,确保将 /conf/ 目录下的配置文件同步到集群其他节点上,可以使用 rsync、scp 或其他安全机制将配置文件复制到其他节点上。(对于大多数配置,服务器需要重新启动配置才能生效)
HBase默认配置
1. 重要配置(用于启动HBase)
-
hbase.tmp.dir - 本地文件系统 的临时文件夹(重新启动计算机将清空 /tmp目录)
- 类型:string
- 默认值:${java.io.tmpdir}/hbase-${user.name}
-
hbase.rootdir - 这个目录是region服务器共享的目录,用来持久存储HBase的数据,URL必须完全正确,其中包含了文件系统的schema。例如,要表示HDFS中的/hbase目录,HDFS实例的namenode需要运行在服务器 namenode.example.org 的9000端口,且需要将这个属性设置为 hdfs://namenode.example.org:9000/hbase。默认情况下,HBase是写到/tmp下的,如果不修改这个配置,数据将会在集群重启时丢失。
- 类型:string
- 默认值:${hbase.tmp.dir}/hbase
-
hbase.cluster.distributed - HBase集群的运行模式,该值为 false 时,集群为单机模式;该值为 true 时,集群是分布式模式。如果将该值设置为false,则HBase与Zookeeper的守护进程将运行在一个JVM中。
- 类型:boolean
- 默认值:false
-
hbase.zookeeper.quorum - Zookeeper Quorum中的服务器列表,使用逗号分隔。默认设置为“host1.mydomain.com,host2.mydomain.com,host3.mydomain.com”,协助伪分布式模式使用。在完全分布式模式下,用户需要把所有Zookeeper Quorum节点添加进去,如果在 hbase-env.sh 文件中设置了 HBASE_MANAGES_ZK变量,则此列表中的节点就是我们启动或停止Zookeeper服务的节点。
- 类型:string
- 默认值:localhost
2. HMaster相关配置
-
hbase.master.port - HMaster绑定端口
- 类型:int
- 默认值:16000
-
hbase.master.info.port - HBase Master的Web UI端口,如果不想启动UI实例,则可以将当前参数设置为-1
- 类型:int
- 默认值:16010
-
hbase.master.info.bindAddress - HBase Master 的 Web UI绑定的地址
- 类型:string
- 默认值:0.0.0.0
-
hbase.master.logcleaner.plugins - WAL/HLog清理程序,类名之间以逗号分隔,类会被LogsCleaner服务顺序调用,以删除最早的HLog文件(用户可以实现自己的清理程序,只需要在HBase的classpath中设置完整的类名即可)
- 类型:string
- 默认值:org.apache.hadoop.hbase.master.cleaner.TimeToLiveLogCleaner,org.apache.hadoop.hbase.master.cleaner.TimeToLiveProcedureWALCleaner
-
hbase.master.logcleaner.ttl - HLog文件在 {hbase.rootdir}/oldWALs 目录中最长的生命周期,一旦超过这个值,HLog就会被master的线程清理掉
- 类型:long
- 默认值:600000 (单位:毫秒)
-
hbase.master.procedurewalcleaner.ttl - 一个WAL程序在归档目录中存在的最大生命周期,一旦超过这个值,将会被master的线程清理掉
- 类型:long
- 默认值:604800000 (单位:毫秒)
-
hbase.master.hfilecleaner.plugins - BaseHFileCleanerDelegate清理程序类,类名之间由逗号分隔,类会被HFileCleaner服务顺序调用(用户可以实现自己的清理程序,只需要在HBase的classpath中设置完整的类名即可)
- 类型:string
- 默认值:org.apache.hadoop.hbase.master.cleaner.TimeToLiveHFileCleaner
-
hbase.master.infoserver.redirect - HMaster是否监听 Master Web UI 端口(hbase.master.info.port)并将请求重定向到由 Master 和 HRegionServer 共享的 Web UI服务器,当Master对Regions(非默认)提供服务时配置才有意义
- 类型: boolean
- 默认值:true
-
hbase.master.fileSplitTimeout - Region Split时文件拆分的超时时间(此设置曾在hbase-1.x中命名为:hbase.regionserver.fileSplitTimeout,现在Region Split运行在master端,因此被重新命名)
- 类型:long
- 默认值:600000
3. RegionServer相关配置
-
hbase.regionserver.port - HBase RegionServer绑定的端口
- 类型:int
- 默认值:16020
-
hbase.regionserver.info.port - HBase RegionServer的Web UI端口,设置为-1可以禁用HBase RegionServer的Web UI
- 类型:int
- 默认值:16030
-
hbase.regionserver.info.bindAddress - HBase RegionServer的Web UI地址
- 类型:string
- 默认值:0.0.0.0
-
hbase.regionserver.info.port.auto - 该属性用于指定 Master 或 RegionServer 是否要动态搜索一个要绑定的端口,当 hbase.regionserver.info.port 已经被占用的时候,可以搜索一个空闲的端口来绑定(这个功能在测试的时候很有用,默认关闭)
- 类型:boolean
- 默认值:false
-
hbase.regionserver.handler.count - RegionServer中RPC监听器实例的数量(即RegionServer处理客户端请求的线程数),对于master来说,这个属性是master受理的处理线程(handler)数量(太多的处理程序可能适得其反,设置其为CPU数量的倍数;如果大多数需求是只读型的,那么将处理程序数量设置为接近CPU数量效果最佳)
- 类型:int
- 默认值:30
-
hbase.ipc.server.callqueue.handler.factor - 确定callqueue数量的因素(0-表示在所有处理程序之间共享单个队列;1-表示每个处理程序都有自己的队列)
- 类型:float
- 默认值:0.1
-
hbase.ipc.server.callqueue.read.ratio - 将callqueue拆分为读写队列,指定的间隔(介于0.0~1.0之间)将乘以调用队列的数量(0-表示不拆分调用队列,这意味着读取和写入请求都将被推送到同一组队列;低于0.5的值意味着读取队列将少于写入队列;值0.5表示相同数量的读写队列;大于0.5的值意味着将有比写入队列更多的读取队列;值1.0表示除了一个队列之外的所有队列都用于分派读取请求)
- 类型:float
- 默认值:0
示例: 如果调用队列的总数为10,则read.ratio的值为0意味着:10个队列将包含读/写两组请求; read.ratio的值为0.3意味着:3个队列仅包含读取请求,7个队列仅包含写入请求; read.ratio的值为0.5意味着:5个队列仅包含读取请求,5个队列仅包含写入请求; read.ratio的值为0.8意味着:8个队列仅包含读取请求,2个队列仅包含写入请求; read.ratio的值为1.0意味着:9个队列仅包含读取请求,1个队列仅包含写入请求
-
hbase.ipc.server.callqueue.scan.ratio - 将读取调用队列拆分成小读取队列(对应get操作)和长读取队列(对应scan操作),其中读取调用队列的数量,根据调用队列的总数乘以 callqueue.read.ratio 计算(低于0.5的值意味着长读取队列的数量将少于短读取队列;值为0.5意味着将有相同数量的短读取和长读取队列;值大于0.5意味着长读取队列的数量将多于短读取队列;值为0或1表示使用相同的队列集进行获取和扫描)
- 类型:float
- 默认值:0
示例: 如果读取调用队列的总数为8,则scan.ratio的值为0或1意味着:8个队列将长读取请求和短读取请求; scan.ratio的值为0.3意味着:2个队列仅包含长读取请求,6个队列仅包含短读取请求; scan.ratio的值为0.5意味着:4个队列仅包含长读取请求,4个队列仅包含短读取请求; scan.ratio的值为0.8意味着:6个队列仅包含长读取请求,2个队列仅包含短读取请求
-
hbase.regionserver.msginterval - 消息从RegionServer发送到HBase Master的时间间隔(单位:毫秒)
- 类型:int
- 默认值:3000(3秒)
-
hbase.regionserver.logroll.period - 无论当前日志(edits)中有多少记录,达到这个时间间隔,系统都会自动滚动已经提交的日志(单位:毫秒)
- 类型:long
- 默认值:3600000
-
hbase.regionserver.logroll.errors.tolerated - 可接受的WAL关闭错误个数,到达后将触发服务器终止(如果设置为0,那么在 WAL writer 做 log rolling失败时就终止RegionServer,即使设置为一个很小的值也会让RegionServer承担瞬间的HDFS错误)
- 类型:int
- 默认值:2
-
hbase.regionserver.hlog.reader.impl - 负责实现HLog文件读取的类
- 类型:string
- 默认值:org.apache.hadoop.hbase.regionserver.wal.ProtobufLogReader
-
hbase.regionserver.hlog.writer.impl - 负责实现HLog文件写入的类
- 类型:string
- 默认值:org.apache.hadoop.hbase.regionserver.wal.ProtobufLogWriter
-
hbase.regionserver.global.memstore.size - 在新的更新被阻止并强制flush之前,RegionServer的全部memstore最大值(默认为堆内存的40%,直到RegionServer中的所有 memstore 的大小达到 hbase.regionserver.global.memstore.size.lower.limit,更新将被阻止并强制flush,此配置中的默认值特意设置为空,以便遵守旧的 hbase.regionserver.global.memstore.upperLimit 属性)
- 类型:float
- 默认值:空
在旧的版本中,该属性为 hbase.regionserver.global.memstore.upperLimit 即单个region服务器的全部memstore的最大值,一旦超过这个值,一个新的更新操作将会被挂起,强制执行写操作(默认值为:堆内存的40%)
-
hbase.regionserver.global.memstore.size.lower.limit - 强制刷新之前,RegionServer中所有memstore的最大大小(默认值为:hbase.regionserver.global.memstore.size 的95%),当由于内存限制而导致更新被阻塞时,系统会以尽可能小的刷新量刷新数据,此值中的默认值特意设置为空,以遵守旧的 hbase.regionserver.global.memstore.lowerLimit 属性
- 类型:float
- 默认值:空
在旧的版本中,该属性为 hbase.regionserver.global.memstore.lowerLimit 即所有的region的memstore所占用的内存总和达到堆内存的35%时,HBase会强制刷写数据到磁盘中(当这个值与 hbase.reigonserver.global.memstore.upperLimit 相等时,更新操作由于memstore限制被阻塞时系统会以尽可能小的刷写量刷写数据)
-
hbase.systemtables.compacting.memstore.type - 用于系统表(hbase:meta,namespace等)的memstore压缩类型,默认值为NONE(即不使用任何压缩类型),如果我们需要为系统表使用压缩存储器,那么需要将这个属性设置为: BASIC 或 EAGER
- 类型:string
- 默认值:NONE
-
hbase.regionserver.optionalcacheflushinterval - 在自动刷写之前,一个 edit 版本在内存中缓存的最长时间(设置为0则禁止自动flush)
- 类型:long
- 默认值:3600000(单位:毫秒)
-
hbase.regionserver.dns.interface - 当使用DNS时,RegionServer用来上报的IP地址的网络接口名
- 类型:string
- 默认值:default
-
hbase.regionserver.dns.nameserver - 当使用DNS时,RegionServer使用的DNS的域名或者IP地址(RegionServer使用它来确定和master进行通信的域名)
- 类型:string
- 默认值:default
-
hbase.regionserver.region.split.policy - region 分裂策略(分裂策略决定了一个region该如何分裂),当前可用的split策略有 BusyRegionSplitPolicy,ConstantSizeRegionSplitPolicy,DisabledRegionSplitPolicy,DelimitedKeyPrefixRegionSplitPolicy,KeyPrefixRegionSplitPolicy,SteppingSplitPolicy等,其中 DisabledRegionSplitPolicy 会阻止手动 region split
- 类型:string
- 默认值:org.apache.hadoop.hbase.regionserver.SteppingSplitPolicy
-
hbase.regionserver.regionSplitLimit - Region数量到达这个值后就不会再分裂(这不是一个Region数量的硬性限制,但是起到了一定指导性的作用,到达这个值就该停止分裂),默认值为 MAX_INT ,即不阻止分裂
- 类型:int
- 默认值:2147483647
4. Zookeeper相关配置
-
zookeeper.session.timeout - Zookeeper会话超时时间,这个值用于HBase连接ZK客户端,HBase会把这个值传递给Zookeeper Quorum作为建议的会话最大超时时间(如果客户端超时,服务器端会做相应处理反馈给订阅事件的客户端)
- 类型:long
- 默认值:90000(单位:毫秒)
-
zookeeper.znode.parent - HBase在Zookeeper中的根znode,所有的HBase对应要操作Zookeeper的znode都会用这个目录作为相对路径(默认情况下,所有HBase的Zookeeper文件路径都是相对路径,所以都会去这个目录下进行操作)
- 类型:string
- 默认值: /hbase
-
zookeeper.znode.acl.parent - 用于访问的控制列表的根znode
- 类型:string
- 默认值:acl
-
hbase.zookeeper.dns.interface - 使用DNS的时候,Zookeeper用来上报的IP地址的网络接口名
- 类型:string
- 默认值:default
-
hbase.zookeeper.dns.nameserver - 当使用DNS的时候,Zookeeper使用的DNS的域名或IP地址(Zookeeper通过它来确定和master进行通信的域名)
- 类型:string
- 默认值:default
-
hbase.zookeeper.peerport - Zookeeper节点内部之间通信的端口
- 类型:int
- 默认值:2888
-
hbase.zookeeper.leaderport - Zookeeper用来选举主节点的端口
- 类型:int
- 默认值:3888
-
hbase.zookeeper.property.initLimit - 初始化同步阶段可使用的tick的数量限制(Zookeeper 的 zoo.cfg 配置文件中的属性)
- 类型:int
- 默认值:10
-
hbase.zookeeper.property.syncLimit - 发送一个请求到获得承认之间的tick的数量限制(Zookeeper 的 zoo.cfg 配置文件中的属性)
- 类型:int
- 默认值:5
-
hbase.zookeeper.property.dataDir - Zookeeper元数据快照的存储目录(Zookeeper 的 zoo.cfg 配置文件中的属性)
- 类型:string
- 默认值:${hbase.tmp.dir}/zookeeper
-
hbase.zookeeper.property.clientPort - Zookeeper客户端连接端口(Zookeeper 的 zoo.cfg 配置文件中的属性)
- 类型:int
- 默认值:2181
-
hbase.zookeeper.property.maxClientCnxns - Zookeeper集群中的单个节点接受的当个客户端(以IP进行区分)的请求的并发数,这个值可以适当调高一点,以避免在单机模式和伪分布式模式中出现连接问题(Zookeeper 的 zoo.cfg 配置文件中的属性)
- 类型:int
- 默认值:300
5. Client相关配置
-
hbase.client.write.buffer - HTable客户端写缓冲区的默认字节大小(该值越大消耗的内存越多,由于服务器端也需要消耗内存来处理传入的数据,客户端与服务器端都会消耗更多的内存,较大的缓冲区大小有助于减少RPC调用的次数;例如,服务器端内存的消耗大概等于 hbase.client.write.buffer * hbase.regionserver.handler.count 的值)
- 类型:long
- 默认值:2097152
-
hbase.client.pause - 常规的客户端暂停时间(用于当客户端请求失败时,重新尝试连接前,等待的时间间隔)
- 类型:long
- 默认值:100(单位:毫秒)
- hbase.client.pause.cqtbe - 是否为 CallQueueTooBigException 使用特殊客户端暂停(如果观察到来自同一个RegionServer的频繁CQTBE,并且其中的调用队列保持充满,则将此值设置为比 hbase.client.pause 更高的值)
-
hbase.client.retries.number - 最大重试次数,用于所有可重试操作(region查询、get和update等)的最大值
- 类型:int
- 默认值:15
-
hbase.client.max.total.tasks - 单个HTable实例可以提交给集群的最大并发任务数
- 类型:int
- 默认值:100
-
hbase.client.max.perserver.tasks - 单个HTable实例给单个regionserver提交的最大并发任务数
- 类型:int
- 默认值:5
-
hbase.client.max.perregion.tasks - 客户端维护到单个Region的最大连接数(换句话说,如果已经有多个写操作正在同一个region上进行写入,则在这些写入完成之前,不会有新的put请求发送到该region上)
- 类型:int
- 默认值:1
-
hbase.client.perserver.requests.threshold - 所有客户端线程中一台服务器的最大并发挂起数(进程级别),超过该请求将立即抛出 ServerTooBusyException,以防止用户的线程仅被一个慢速RegionServer占用和阻止(如果使用固定数量的线程且以同步的方式访问HBase,请将此值设置为与线程相关的适当值)
- 类型:int
- 默认值:2147483647
-
hbase.client.scanner.caching - Scanner在调用next()方法时,尝试一次获取的行数(前提是没有从本地或客户端的缓存中查询到结果),此配置常与 hbase.client.scanner.max.result.size 一起使用,以有效地使用网络,缺省值为Interger.MAX_VALUE,这样网络填充将由 hbase.client.scanner.max.result.size 定义的块大小决定,而不再受特定行的限制(因为行的大小随表格的不同而不同,如果事先知道Scanner不要超过一定数量的行,可以通过 #setCaching 将此配置设置为行限制),
提升该值会使得Scanner的速度更快,但会消耗更多的内存,而当缓存为空时,下一次调用可能会花费更长时间(需要特别注意的,不要使该参数设置的值调用的时间超过Scanner的超时时间,即hbase.client.scanner.timeout.period 参数值)- 类型:int
- 默认值:2147483647
-
hbase.client.keyvalue.maxsize - 一个KeyValue实例的最大容量,用来设置存储文件中单个entry的大小上界(因为一个KeyValue是不能分割的,所以可以避免因为数据过大导致region不能被拆分的现象),最好将其设置为可以被最大region size整除的数,如果设置为0或更小的值,就会禁用这个检查
- 类型:int
- 默认值:10485760(10M)
-
hbase.server.keyvalue.maxsize - 单个单元格允许的最大容量(包括值和所有关键组件),这是避免服务器OOM情况的安全设置,如果设置为0或更小的值,就会禁用这个检查
- 类型:int
- 默认值:10485760(10M)
-
hbase.client.scanner.timeout.period - Scanner超时时间
- 类型:long
- 默认值:60000(单位:毫秒)
-
hbase.client.localityCheck.threadPoolSize - localityCheck的线程池大小
- 类型:int
- 默认值:2