我正在执行一个范围扫描,给我500k的记录。如果我设置 scan.setCaching(100000) 不到一秒钟,但如果 scan.setCaching(100000) 它花了将近38秒。如果我设置 scan.setBlockCache(false) 以及 scan.setCaching(100000) 会发生什么?是否缓存行?我在第一次扫描后删除操作系统缓存,但扫描记录的时间没有变化。为什么?那我怎么检查读取性能呢?
scan.setCaching(100000)
scan.setBlockCache(false)
y53ybaqx1#
Scan.setCaching 用词不当。它应该叫做 Scan.setPrefetch . setCaching 实际指定每个rpc将向regionserver传输多少行。如果你使用 setCaching(1) 每次你打电话 next() 您需要支付往返regionserver的费用。将其设置为更大的数字的缺点是,您需要为客户机中的额外内存付费,并且可能会获取不使用的行,例如,如果在达到特定行数或找到特定值后停止扫描。 Scan.setBlockCache 就像钱德拉说的完全不同。它基本上指示regionserver不要将此扫描中的任何数据拉入hbase blockcache,后者是memstore中的一个单独的内存池。请注意,memstores用于写入,blockcache用于读取,这两块内存是完全分开的。hbase当前不将块缓存用作回写缓存。可以使用 hfile.block.cache.size 中的配置设置 hbase-site.xml . 类似地,您可以通过 hbase.regionserver.global.memstore.size 设置。你可能想用 setBlockCache(false) 如果正在执行全表扫描,并且不希望刷新块缓存中的当前工作集。否则,如果您正在扫描频繁使用的数据,则最好将 setBlockCache 一个人。
Scan.setCaching
Scan.setPrefetch
setCaching
setCaching(1)
next()
Scan.setBlockCache
hfile.block.cache.size
hbase-site.xml
hbase.regionserver.global.memstore.size
setBlockCache(false)
setBlockCache
os8fio9y2#
hbase有两种类型的缓存结构- memory store 以及 block cache .
memory store
block cache
内存存储实现为memstore,用于读取的缓存是block cache。
当从hdfs读取数据块时,它被缓存在blockcache中。相邻数据的后续读取仅由块缓存提供服务。因此,当您手动设置scan.set block cache(false)时,它将停止缓存从hdfs读取的行。scan.set缓存(100000)是与扫描仪相关的客户端优化。所以它仍然可以正常工作
2条答案
按热度按时间y53ybaqx1#
Scan.setCaching
用词不当。它应该叫做Scan.setPrefetch
.setCaching
实际指定每个rpc将向regionserver传输多少行。如果你使用setCaching(1)
每次你打电话next()
您需要支付往返regionserver的费用。将其设置为更大的数字的缺点是,您需要为客户机中的额外内存付费,并且可能会获取不使用的行,例如,如果在达到特定行数或找到特定值后停止扫描。Scan.setBlockCache
就像钱德拉说的完全不同。它基本上指示regionserver不要将此扫描中的任何数据拉入hbase blockcache,后者是memstore中的一个单独的内存池。请注意,memstores用于写入,blockcache用于读取,这两块内存是完全分开的。hbase当前不将块缓存用作回写缓存。可以使用hfile.block.cache.size
中的配置设置hbase-site.xml
. 类似地,您可以通过hbase.regionserver.global.memstore.size
设置。你可能想用
setBlockCache(false)
如果正在执行全表扫描,并且不希望刷新块缓存中的当前工作集。否则,如果您正在扫描频繁使用的数据,则最好将setBlockCache
一个人。os8fio9y2#
hbase有两种类型的缓存结构-
memory store
以及block cache
.内存存储实现为memstore,用于读取的缓存是block cache。
当从hdfs读取数据块时,它被缓存在blockcache中。相邻数据的后续读取仅由块缓存提供服务。
因此,当您手动设置scan.set block cache(false)时,它将停止缓存从hdfs读取的行。scan.set缓存(100000)是与扫描仪相关的客户端优化。所以它仍然可以正常工作