46.1。调整 HBase 服务器 RPC 处理

  • hbase.regionserver.handler.count(在hbase-site.xml中)设置为核心 x 主轴以实现并发。

  • (可选)将呼叫队列拆分为单独的读写队列,以实现差异化服务。参数hbase.ipc.server.callqueue.handler.factor指定呼叫队列的数量:

    • 0表示单个共享队列

    • 1表示每个处理程序的一个队列。

    • 01之间的值分配队列数与处理程序数成比例。例如,.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更长时间阅读

46.2。禁用 Nagle for RPC

禁用 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

46.3。限制服务器故障影响

尽可能快地检测 regionserver 故障。设置以下参数:

  • hbase-site.xml中,将zookeeper.session.timeout设置为 30 秒或更短时间以限制故障检测(20-30 秒是一个良好的开始)。

  • 检测并避免不健康或失败的 HDFS DataNodes:在hdfs-site.xmlhbase-site.xml中,设置以下参数:

    • dfs.namenode.avoid.read.stale.datanode = true

    • dfs.namenode.avoid.write.stale.datanode = true

46.4。在服务器端优化以实现低延迟

当 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 &gt;= 8192

    • dfs.datanode.handler.count =锭数

重启后检查 RegionServer 日志。如果配置错误,您应该只会看到投诉。否则,短路读取在后台安静地运行。它没有提供指标,因此没有关于其有效性的光学器件,但读取延迟应显示出显着的改进,特别是如果良好的数据位置,大量随机读取和数据集大于可用缓存。

您可能会使用的其他高级配置,尤其是在日志中抱怨短路功能时,包括dfs.client.read.shortcircuit.streams.cache.sizedfs.client.socketcache.capacity。这些选项的文档很少。你必须阅读源代码。

有关短路读取的更多信息,请参阅 Colin 关于推出的旧博客,如何改进短路本地读取为 Hadoop 带来更好的性能和安全性HDFS-347 问题也引发了一个有趣的读物,显示 HDFS 社区处于最佳状态(请注意几点评论)。

46.5。 JVM 调优

46.5.1。调整 JVM GC 以获得低收集延迟

  • 使用 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小于幸存者空间

46.5.2。操作系统级调整

  • 关闭透明大页面(THP):

    echo never &gt; /sys/kernel/mm/transparent_hugepage/enabled
    echo never &gt; /sys/kernel/mm/transparent_hugepage/defrag 
    
  • 设置vm.swappiness = 0

  • vm.min_free_kbytes设置为至少 1GB(较大内存系统上为 8GB)

  • 使用vm.zone_reclaim_mode = 0禁用 NUMA 区域回收