在我的应用程序中,我正在扫描HBase中的表以获取要在UI上显示的数据。数据量巨大,代码产生以下错误。提供的服务器配置为:server -Xms2048m -Xmx4096m
"Failure in caller transaction.: java.lang.OutOfMemoryError: Java heap space"
代码:
HTable table = null;
try {
Configuration config = HBaseConfiguration.create();
config.set("hbase.zookeeper.quorum", hbaseServer);
config.set("hbase.zookeeper.property.clientPort", hbasePort);
FilterList list = new FilterList(FilterList.Operator.MUST_PASS_ALL);
table = new HTable(config, "tableName");
SingleColumnValueFilter filter = new SingleColumnValueFilter(Bytes.toBytes(filterName),
Bytes.toBytes(filterName), CompareFilter.CompareOp.EQUAL, new BinaryComparator(Bytes.toBytes (String.valueOf(filterValue))));
list.addFilter(filter);
Scan scan = new Scan();
scan.setFilter(list);
scanner = table.getScanner(scan);
如果我添加以下过滤器以减少记录数量,则会正确呈现数据:
scan.setFilter(new PageFilter(100));
但是如果我在Eclipse中使用Memory Analyzer Tool提取堆转储,则无论从HBase获取的记录数是多少,都会创建相同大小的堆转储大小。我还添加了以下代码以避免缓存,但结果并没有变化。
scan.setCaching(0);
scan.setCacheBlocks(false);
这是否意味着生成的堆转储不依赖于要提取的数据量?我做错了吗?