【问题标题】:HBase Scan PerformanceHBase 扫描性能
【发布时间】:2014-04-27 01:19:49
【问题描述】:

我正在执行一个范围扫描,它给了我 50 万条记录。 如果我设置scan.setCaching(100000) 不到一秒,但如果scan.setCaching(100000) 未设置,则需要将近 38 秒。

如果我设置scan.setBlockCache(false)scan.setCaching(100000) 会发生什么?行会被缓存吗?

我在第一次扫描后删除了操作系统缓存,但扫描记录的时间没有变化。为什么?

那么如何检查读取性能呢?

【问题讨论】:

    标签: caching hadoop hbase database-scan


    【解决方案1】:

    Scan.setCaching 用词不当。它真的应该被称为Scan.setPrefetchsetCaching 实际上指定了每个 RPC 将多少行传输到区域服务器。如果您使用setCaching(1),那么每次调用next() 时,您都需要支付往返区域服务器的费用。将其设置为更大的数字的缺点是您需要为客户端中的额外内存付费,并且可能会获取您不会使用的行,例如,如果您在达到一定数量的行后停止扫描或在找到特定值之后。

    Scan.setBlockCache 意味着完全不同的东西,就像 Chandra 指出的那样。它基本上指示区域服务器不要从该扫描中提取任何数据到 HBase BlockCache,它是与 MemStore 分开的内存池。注意MemStores是用来写的,BlockCache是​​用来读的,这两块内存是完全分开的。 HBase 目前不使用 BlockCache 作为回写缓存。您可以使用hbase-site.xml 中的hfile.block.cache.size 配置设置来控制块缓存的大小。同样,您可以通过 hbase.regionserver.global.memstore.size 设置控制 MemStore 的总池大小。

    如果您正在执行全表扫描,并且不想刷新块缓存中的当前工作集,您可能想要使用setBlockCache(false)。否则,如果您正在扫描经常使用的数据,最好不要使用setBlockCache

    【讨论】:

    • Scan.setCaching(HBASECACHING),其中HBASECACHING指定要缓存的行数
    【解决方案2】:

    Hbase 有 2 种类型的缓存结构 - memory storeblock cache
    内存存储实现为 MemStore,用于读取的缓存是块缓存
    从 HDFS 读取一个数据块,它被缓存在 BlockCache 中。对相邻数据的后续读取仅由 BlockCache 提供。
    因此,当您手动设置 scan.set Block Cache(false) 时, 它将停止缓存从 hdfs 读取的行。
    scan.set-caching(100000) 是与客户端优化相关的到扫描仪。所以它仍然会不受影响地工作

    【讨论】:

    • setCaching 影响客户端行为,而 setBlockCache 影响区域服务器端行为,因此您对 setCaching 没有任何影响的推理是不正确的。
    • @b4hand ,感谢您指出我。我忽略了这个事实。看看我更改后的答案。
    猜你喜欢
    • 1970-01-01
    • 2015-07-16
    • 2012-10-18
    • 1970-01-01
    • 1970-01-01
    • 2017-07-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多