【问题标题】:cassandra huge data reading using java drivercassandra使用java驱动读取大量数据
【发布时间】:2019-03-16 10:23:39
【问题描述】:

我必须从 Cassandra 数据库中读取 3 TB 的生产数据。

我已经使用 java 驱动程序实现了分页,但是这种技术使用偏移值,这意味着我要重新跟踪我的数据以到达特定的行,并且这个过程正在使用堆内存,这不是一个好习惯。我想在不使用大量堆内存的情况下读取数据

通常我想批量获取 10000 行,然后再次读取下一个 10000 行而不再次读取前一万行

我不需要高读取延迟,我唯一的问题是在不消耗大量堆内存的情况下读取数据...

这是我的部分代码 Statement select = QueryBuilder.select().all().from("demo", "emp");

这就是我的分页方式

List<Row> secondPageRows = cassandraPaging.fetchRowsWithPage(select, 100001, 25000);
printUser(secondPageRows);

其中 100001 是我要输出行的起始值,而 25000 是页面大小。 所以在这里我必须先达到 100000,然后我将打印第 100001 个值。 这导致了我的堆问题,而且在我的情况下,我不想到达一个页面的末尾以获得另一页的第一条记录。

【问题讨论】:

  • 您的问题需要更多细节和更好的代码风格。在某些地方,您应该将代码放在这里以显示您解决问题的尝试。
  • @AngelHotxxx 我已经详细编辑了我的问题。希望您现在可以提供帮助。
  • 为什么不在 select 语句上执行 session.execute 并遍历它们?如果构建您的应用程序以使用迭代器而不是列表,则不会出现内存问题。您仍然可以根据自己的需要将其分解(即一次填写一个包含 10,000 个结果的列表以进行处理),默认情况下它将自动分 5000 个批次抓取它。然后,您可以通过增加到 10,000 来测试吞吐量变化,但这实际上可能最终对您造成的伤害多于帮助。类似session.execute(select).forEach(r -&gt; this::printUser)
  • @ChrisLohfink 我该如何实现它?

标签: java apache-spark cassandra driver cassandra-driver


【解决方案1】:

我可以想到两种可能的解决方案:

1) 你需要一个更好的数据模型来处理这个查询。重塑您的表以处理此类查询。

2) 使用 spark 作业来处理此类请求,为此您需要有一个单独的数据中心来处理此查询,这样就不必为堆内存烦恼。

【讨论】:

  • 可以对读取查询的数据进行批处理,因为我没有顺序数据,因此我可以在 where 子句中使用分区键。分页数据没有解决我的问题,这是一个巨大的数据,我无法改造生产表
  • 我认为分区也可以在驱动程序级别使用,但不太确定,但它可能有助于堆内存。
  • 我在互联网上找不到它,你能给我一个链接吗?
【解决方案2】:

仅供参考,以下文档可能会有所帮助,尽管我从未尝试过。

https://docs.datastax.com/en/developer/java-driver/3.6/manual/paging/

这里司机会负责分页。

【讨论】:

  • 阅读同一页面中的https://docs.datastax.com/en/developer/java-driver/3.6/manual/paging/#offset-queries .. 它说它无助于随机跳转它有利于按顺序分页数据。这种随机跳转只会导致我出现堆问题。
猜你喜欢
  • 2018-04-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-05
  • 2023-03-13
  • 1970-01-01
  • 2012-05-16
  • 2014-10-26
相关资源
最近更新 更多