camel+cassandraql:处理一个表而不将所有内容放入内存

nle07wnf  于 2021-06-13  发布在  Cassandra
关注(0)|答案(1)|浏览(304)

目标:读一个大的Cassandra表,并行地逐行处理
约束条件:
不是内存中的所有行
没有Spark,我们只能用 Camel
一枪,不需要在table上投票
我用cassandraql做了第一个工作版本,但是这个组件似乎仅限于一个查询,所有查询都在内存中,我没有找到像fetsize/fetchmoresult这样的机制。我看了cassandraproducer的课,调查了消费者需求策略,结果转化策略。。。什么也看不见。
是否可以按1000个元素的块读取一个表?例如,每个块将生成一个在不同线程中拆分的交换?
我想也许生产商在这条路线上的第一次交换就是答案。但我不明白如何管理生产交换率,以避免内存中有太多行(为此,我们需要检查下一个阻塞队列的大小,如果超过x个未使用的元素,则在生成更多消息之前等待)。
也许有其他的选择来做这样的事情?也许我没有在cassandraql中看到魔法参数?也许我们可以覆盖Cassandra克的某些部分?
谢谢您

2w2cym1i

2w2cym1i1#

这不是回答你的问题,但希望能引发一些讨论。但作为一个学习Cassandra和花点时间的人,这让我思考。主要针对 fetSize/fetchMoreResult 问题的一部分
首先,你的两个约束是矛盾的
不是内存中的所有行
我不想一下子就把它们都取出来
一枪,无需轮询分区
我不想再回到db了。
除非你真正的意思是
不是内存中的所有行
我不想一下子就把它们都取出来
您可以多次回到分区,只要您直接回到上次留下分区的位置。
只要第一页的时间和第二页的时间一样。第19页的时间和第20页的时间是一样的。
i、 e不是从第一排开始的
所以我假设你的意思是第二种情况,然后继续。
对cassandra的查询将满足以下两个条件:
它们将对聚集列进行限制
它们已按群集列排序
现在考虑下表 department (分区键), firstName (U键), personId (U键), lastname 等作为正常列
第一个查询

select department, firstName, lastname, etc
  from person
  where department = 'depart1`
  order by firstName ASC
  limit 25;

第二个查询(假设页面中的最后一条记录 userId=25 以及 firstName=kavi )

select department, firstName, lastname, etc
  from person
  where department = 'depart1` and firstName='kavi' and userId > 25
  order by firstName ASC
  limit 25;

如您所见,我们可以很容易地构造一个cassandra查询,它在固定时间内为每个块带来一定的大小。
现在回到集成框架
我记得mule中有一个称为水印的概念,端点可以存储和记住水印,以便下次从那里开始。在这种情况下 userId 以及 firstName 最后一页的最后一条记录的最后一条是水印。所以他们可以发布第二个。我相信我们对 Camel 也能这样做
我希望我已经确信轮询不是一个在固定时间内检索每个块的问题

相关问题