目标:读一个大的Cassandra表,并行地逐行处理
约束条件:
不是内存中的所有行
没有Spark,我们只能用 Camel
一枪,不需要在table上投票
我用cassandraql做了第一个工作版本,但是这个组件似乎仅限于一个查询,所有查询都在内存中,我没有找到像fetsize/fetchmoresult这样的机制。我看了cassandraproducer的课,调查了消费者需求策略,结果转化策略。。。什么也看不见。
是否可以按1000个元素的块读取一个表?例如,每个块将生成一个在不同线程中拆分的交换?
我想也许生产商在这条路线上的第一次交换就是答案。但我不明白如何管理生产交换率,以避免内存中有太多行(为此,我们需要检查下一个阻塞队列的大小,如果超过x个未使用的元素,则在生成更多消息之前等待)。
也许有其他的选择来做这样的事情?也许我没有在cassandraql中看到魔法参数?也许我们可以覆盖Cassandra克的某些部分?
谢谢您
1条答案
按热度按时间2w2cym1i1#
这不是回答你的问题,但希望能引发一些讨论。但作为一个学习Cassandra和花点时间的人,这让我思考。主要针对
fetSize/fetchMoreResult
问题的一部分首先,你的两个约束是矛盾的
不是内存中的所有行
我不想一下子就把它们都取出来
一枪,无需轮询分区
我不想再回到db了。
除非你真正的意思是
不是内存中的所有行
我不想一下子就把它们都取出来
您可以多次回到分区,只要您直接回到上次留下分区的位置。
只要第一页的时间和第二页的时间一样。第19页的时间和第20页的时间是一样的。
i、 e不是从第一排开始的
所以我假设你的意思是第二种情况,然后继续。
对cassandra的查询将满足以下两个条件:
它们将对聚集列进行限制
它们已按群集列排序
现在考虑下表
department
(分区键),firstName
(U键),personId
(U键),lastname
等作为正常列第一个查询
第二个查询(假设页面中的最后一条记录
userId=25
以及firstName=kavi
)如您所见,我们可以很容易地构造一个cassandra查询,它在固定时间内为每个块带来一定的大小。
现在回到集成框架
我记得mule中有一个称为水印的概念,端点可以存储和记住水印,以便下次从那里开始。在这种情况下
userId
以及firstName
最后一页的最后一条记录的最后一条是水印。所以他们可以发布第二个。我相信我们对 Camel 也能这样做我希望我已经确信轮询不是一个在固定时间内检索每个块的问题