在 Accumulo 中扫描大量数据

Scanning high volumes of data in Accumulo

所以从 Accumulo table 读取大量数据时会遇到问题。我可以肯定地说我了解 Accumulo 的基础知识,但我仍在学习一些更精细的细节。

我在 Accumulo 数据库中有两个 table,一个保存对象的属性,另一个保存指向对象 O(1) 查找时间的索引。我将使用 person 对象作为示例。

Person Table

row_id    colf    colq    val
uuid      person  name    joe
uuid      person  age     25
uuid      person  country usa

Person Index Table

row_id    colf    colq    val
joe       person  uuid

所以我目前获取所有人的方式是扫描索引 table 并且对于索引 table 中的每个条目,然后我用密钥扫描人 table从索引 table 中收集,然后根据从人 table.

中提取的内容构建 person 对象

对于低容量,这不会造成问题,但当我扩大规模时,10k 人的记录,查询需要大约 3 秒。当我扩展到 100k 个人记录时,查询可以超过 30 秒。

我最初的想法是,因为我正在查询索引 table 然后随后查询人 table,这会占用更多时间,大约是正常情况下的两倍(尽管我无法确认).

如果我知道我要查询人 table 中的所有对象,是否有更快的方法只查询 table?就像只是扫描,当键改变时,你知道你在下一个对象上吗?还是我目前正在做的首选方法是,这类查询需要一段时间,因为它们太大了? (我是大规模操作的新手)。

是否建议只限制查询说 5k 条记录,然后在我需要获取下一个 5k 时重新查询?

欢迎任何建议!

If I know I am going to want all objects in the person table, is there a faster way to just only query that table?

如果你要阅读所有的人,使用索引有点毫无意义。只需扫描您的人员 table。如果你只想要每个人的某些属性,你可以在 Scanner/BatchScanner.

上使用 fetchColumn(Text, Text) 方法

when keys change, you know you are on the next object

如果您只是处理每一行,您可以尝试使用 WholeRowIterator。