Cassandra中的数据建模用于作业队列

时间:2018-01-05 06:48:49

标签: apache cassandra data-modeling cassandra-3.0

我正在尝试将所有调度程序作业存储在Cassandra中。

我设计了所有锁定表,看起来很好。我发现创建一个作业队列表很困难。

我的要求是

1)我需要查询所有未完成的作业。

CREATE TABLE jobs(
   jobId text,
   startTime timestamp,
   endTime timestamp,
   status text,
   state text,
   jobDetails text,
   primary key (X,X)) 
    with clustering order by (X desc);

其中,州 - 开/关
               状态 - 正在运行/失败/已完成

我不确定将哪一个保留为主键(因为它是唯一的),我还需要查询处于“开启”状态的所有作业。有人可以帮我在Cassandra设计这个。即使你提出了复合分区键的任何内容,我也没关系。

编辑:

我想出了像这样的数据模型,

CREATE TABLE job(
   jobId text,
   startTime timestamp,
   endTime timestamp,
   state text,
   status text,
   jobDetails text,
   primary key (state,jobId, startTime) 
    with clustering order by (startTime desc);

我可以这样插入,

INSERT INTO job (jobId, startTime, endTime, status,state, jobDetails) VALUES('nodestat',toTimestamp(now()), 0,'running','on','{
        "jobID": "job_0002",
        "jobName": "Job 2",
        "description": "This does job 2",
        "taskHandler": require("./jobs/job2").runTask,
        "intervalInMs": 1000
    }');

像这样查询,

SELECT * FROM job WHERE state = 'on';

会对性能造成影响吗?

谢谢,
哈利

3 个答案:

答案 0 :(得分:1)

你可能正在实施cassandra的反模式。

有关博客文章,请参阅https://de.slideshare.net/alimenkou/high-performance-queues-with-cassandra,了解使用cassandra作为邮件队列时可能出现的问题。

除此之外,还有一些信息如何在Slideshare的cassandra中采用“正确的方法”:http://www.quartz-scheduler.org/overview/features.html

有很多项目可以更好地适应日程安排和/或消息传递,例如{{3}}。

更新您的编辑内容:

primary key (state,jobId, startTime) 

这将为每个state创建一个分区 - 从而产生巨大的分区和热点。转换作业状态会将其移动到不同的分区 - 您将删除条目以及可能的编译和性能问题(取决于您的作业数量)。

state ='on'的所有作业都将在一个节点上(并且它是副本)在另一个节点上具有state ='off'的所有作业。您的设计中将有两个分区。

答案 1 :(得分:1)

由于您可以对模型进行更改,因此请查看以下模型是否适用于您

   CREATE TABLE job(
   partition_key,
   jobId text,
   startTime timestamp,
   endTime timestamp,
   state text,
   status text,
   jobDetails text,
   primary key (partition_key,state,jobId, startTime) 
   with clustering order by (startTime desc);

此处可以根据您的作业量计算partion_key列值。

例如:

如果您的工作数量少于一天的100K工作,那么您可以将分区保持在单日级别,即YYYYMMDD(20180105),或者如果它是每小时100K,您可以将其更改为YYYYMMDDHH(2018010518) 。根据您的过滤顺序更改群集列。

  • 这样,只有当您知道要查询的时间时,才能查询状态
  • 避免创建太多分区或使用太多列爆炸分区
  • 它会将负载均匀分配到分区中。

如果您可以指定可以对查询进行哪些调整/添加,那么更好地设计模型会很有帮助。

答案 2 :(得分:-1)

您需要在分区键中包含相等列,以便您的相等列是状态和状态。您需要检查这两个是否构成良好的分区密钥,如果不是,则需要使用自定义列或任何其他现有列作为分区密钥的一部分。由于jobid是使记录唯一,因此您可以将其保留在群集列中。我假设你没有在工作ID上查询表。