【问题标题】:Why HBase Java Client is slow compared to REST/Thrift为什么 HBase Java 客户端比 REST/Thrift 慢
【发布时间】:2017-04-14 13:44:57
【问题描述】:

我正在 HBase Java 客户端/Thrift/REST 接口上运行一些性能测试。 我有一个名为“Airline”的表,它有 500K 行。 我通过 4 个不同的 Java 程序从表中获取所有 500K 行。 (使用 JAVA 客户端、Thrift、Thrift2 和 REST)

以下是不同提取大小的性能数据。 对于所有这些,批量大小设置为 100000


[Table which shows the performance numbers. All times are in ms][1]

Perf Numbers


我可以看到,当我们在 REST、Thrift 和 Thrift2 的情况下增加提取大小时,性能会有所提高。

但是使用 Java API,我看到了一致的性能,无论获取大小如何。 为什么获取大小在 JAVA 客户端中没有影响?

这是我的 Java 程序的 sn-p


Table table = conn.getTable(TableName.valueOf("Airline"));
Scan scan =  new Scan();
ResultScanner scanner = table.getScanner(scan);

for (Result[] result = scanner.next(fetchSize); result.length != 0; result = scanner.next(fetchSize))

{ - 处理行 }


有人可以帮助我吗?我是否使用错误的方法/类来通过 JAVA 客户端获取数据。

【问题讨论】:

  • 您的问题中的信息太少,无法猜测可能导致差异的原因。您使用的 HBase 版本是什么?您使用默认配置还是自定义配置?您是否为扫描仪设置了任何“缓存”?

标签: rest hbase thrift


【解决方案1】:

您的扫描仪未正确设置为及时获取所需的行数。换句话说,您正在调整 ResultScanner,而不是实际执行扫描的对象,即 Scan 对象。

我相信你想要的功能部分如下:

scan.setCaching
scan.setCacheBlocks

https://hbase.apache.org/apidocs/org/apache/hadoop/hbase/client/Scan.html

您可以在循环之前调用这些函数...

来源 Pig 的 HBaseStorage#initScan 函数

【讨论】:

  • 感谢您的回复。 scan.setMaxResultSize() 默认为 2MB,我改为 10 MB,然后它提供了良好的性能。我可以看到有 100% 的改进。但是对于 scan.setBatch() 的不同值,我看不到性能有任何差异。
  • 好的。传统上你会做的是回答你自己的问题并接受你的答案,因为这对你有用。如果您不介意这样做,请从“未回答的问题”队列中清除此问题。或者我可以将setMaxResultSize 添加到我的答案中,您可以接受。什么最适合你。让我知道...
猜你喜欢
  • 2013-03-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多