将hbase.regionserver.handler.count
(在hbase-site.xml
中)设置为核心 x 主轴以实现并发。
(可选)将呼叫队列拆分为单独的读写队列,以实现差异化服务。参数hbase.ipc.server.callqueue.handler.factor
指定呼叫队列的数量:
0
表示单个共享队列
1
表示每个处理程序的一个队列。
0
和1
之间的值分配队列数与处理程序数成比例。例如,.5
的值在每两个处理程序之间共享一个队列。
使用hbase.ipc.server.callqueue.read.ratio
(0.98 中的hbase.ipc.server.callqueue.read.share
)将呼叫队列分成读写队列:
0.5
表示将有相同数量的读写队列
< 0.5
更多读取而不是写入
> 0.5
写入比读取更多
设置hbase.ipc.server.callqueue.scan.ratio
(HBase 1.0+)将读取呼叫队列拆分为小读取和长读取队列:
0.5 表示将有相同数量的短读取和长读取队列
< 0.5
更多简短阅读
> 0.5
更长时间阅读
禁用 Nagle 的算法。延迟的 ACK 可以累加到 RPC 往返时间〜200ms。设置以下参数:
在 Hadoop 的core-site.xml
中:
ipc.server.tcpnodelay = true
ipc.client.tcpnodelay = true
在 HBase 的hbase-site.xml
中:
hbase.ipc.client.tcpnodelay = true
hbase.ipc.server.tcpnodelay = true
尽可能快地检测 regionserver 故障。设置以下参数:
在hbase-site.xml
中,将zookeeper.session.timeout
设置为 30 秒或更短时间以限制故障检测(20-30 秒是一个良好的开始)。
检测并避免不健康或失败的 HDFS DataNodes:在hdfs-site.xml
和hbase-site.xml
中,设置以下参数:
dfs.namenode.avoid.read.stale.datanode = true
dfs.namenode.avoid.write.stale.datanode = true
当 RegionServer 通过利用 HDFS 的短路本地读取工具从 HDFS 读取时,跳过网络寻找本地块。注意如何在连接的 datanode 和 dfsclient 端完成设置 - 即在 RegionServer 以及两端如何加载 hadoop native .so
库。将 hadoop 设置 dfs.client.read.shortcircuit 配置为 true 并配置 datanode 的 dfs.domain.socket.path 路径并分享 dfsclient 后然后重新启动,接下来配置 regionserver / dfsclient 端。
在hbase-site.xml
中,设置以下参数:
dfs.client.read.shortcircuit = true
dfs.client.read.shortcircuit.skip.checksum = true
所以我们不进行双重校验和(HBase 自己进行校验和以节省 i / OS。有关详细信息,请参阅 hbase.regionserver.checksum.verify
。
dfs.domain.socket.path
匹配为 datanodes 设置的内容。
dfs.client.read.shortcircuit.buffer.size = 131072
重要的是要避免 OOME - 如果未设置,hbase 有一个默认值,参见hbase.dfs.client.read.shortcircuit.buffer.size
;它的默认值是 131072。
确保数据位置。在hbase-site.xml
中,设置hbase.hstore.min.locality.to.skip.major.compact = 0.7
(表示 0.7 <= n <= 1)
确保 DataNodes 具有足够的块传输处理程序。在hdfs-site.xml
中,设置以下参数:
dfs.datanode.max.xcievers >= 8192
dfs.datanode.handler.count =
锭数
重启后检查 RegionServer 日志。如果配置错误,您应该只会看到投诉。否则,短路读取在后台安静地运行。它没有提供指标,因此没有关于其有效性的光学器件,但读取延迟应显示出显着的改进,特别是如果良好的数据位置,大量随机读取和数据集大于可用缓存。
您可能会使用的其他高级配置,尤其是在日志中抱怨短路功能时,包括dfs.client.read.shortcircuit.streams.cache.size
和dfs.client.socketcache.capacity
。这些选项的文档很少。你必须阅读源代码。
有关短路读取的更多信息,请参阅 Colin 关于推出的旧博客,如何改进短路本地读取为 Hadoop 带来更好的性能和安全性。 HDFS-347 问题也引发了一个有趣的读物,显示 HDFS 社区处于最佳状态(请注意几点评论)。
使用 CMS 收集器:-XX:+UseConcMarkSweepGC
保持伊甸园空间尽可能小,以尽量减少平均收集时间。例:
-XX:CMSInitiatingOccupancyFraction=70
优化低收集延迟而不是吞吐量:-Xmn512m
并行收集伊甸园:-XX:+UseParNewGC
避免在压力下收集:-XX:+UseCMSInitiatingOccupancyOnly
限制每个请求扫描仪结果大小,所以一切都适合幸存者空间,但没有任期。在hbase-site.xml
中,将hbase.client.scanner.max.result.size
设置为伊甸园空间的 1/8(使用 - Xmn512m
,这是~51MB)
设置max.result.size
x handler.count
小于幸存者空间
关闭透明大页面(THP):
echo never > /sys/kernel/mm/transparent_hugepage/enabled
echo never > /sys/kernel/mm/transparent_hugepage/defrag
设置vm.swappiness = 0
将vm.min_free_kbytes
设置为至少 1GB(较大内存系统上为 8GB)
使用vm.zone_reclaim_mode = 0
禁用 NUMA 区域回收