2013-01-04 32 views
3

例如,如果我处理了很多事务[时间戳(键),值,交易者,..]我想为了负载平衡而进行随机分区。我可以按行键排序并随机分区吗?

但是为了查询起见,我希望这些事务按每个节点上的时间戳排序,以便在最近5分钟(或某个其他时间段)内完成所有事务并使用总计MapReduce的。

为什么在文件中卡桑德拉排序键随机如果我使用随机分区?

Q1:对此有一个解决方法吗?我可以使用索引,但它并不理想。

Q2。出于好奇,我想知道为什么在与分区策略相关的节点中进行关键排序?

回答

1

节点是卡桑德拉是环的形式,在每个环节点负责键范围(数据集)。这个想法是,在环中所有节点上平均分配数据,另外独立执行每个写操作 - 这样我们就不需要跟踪上次更新,以平衡环中的数据。

随机分区器使用Consistent Hashing以存储在随机节点排按键,为了找到他们以后。它基本上生成真正的行密钥(这是BigInteger)的散列,并且它找到负责此散列的节点(它在此节点的范围内)。

例如,我们已经在环(I将使用以少数保持简单)4个节点:

  • 节点1 = initial_token:0
  • 节点2 = initial_token:100
  • 节点3 = initial_token:200
  • 节点4 = initial_token:300

行密钥 “VALUE1” 的散列给出23,所以将存储在节点1个

哈希行键“值2”中给出了123,所以它会被存储在节点2

为了解决你的问题,你需要写手动索引和二级索引可能是不完美的想法 - 它有一定的局限性(低肉欲)

+0

我使用散列分区进行负载平衡,但在你的例子,如果我想插入行键“值3”与哈希119将在节点2“值2”之前插入,我想它在“value2”之后的节点2上。为什么密钥无法在单个节点上排序?没有相互独立的排序策略和分区策略的原因是什么?你能详细说明一下吗?谢谢。 – user1944408

+0

我有一个狡猾的解决方法,但它非常糟糕,并且添加其他节点并不容易。我做的是这样的:对于5个节点,我的密钥将是MD5(时间戳)模块5:时间戳。第一个字节用于分区,因此我在每个节点上都有负载平衡和数据排序。不幸的是很难添加额外的节点。 – user1944408

+0

好吧...卡桑德拉选择了简单高效的解决方案 - 这就是我不认为有更多的东西在这个想法背后。您可以通过创建宽行来在单个节点中排序键 - 在这种情况下,列名是排序的。如您已经看到的,您的带时间戳的解决方案不会扩展。我会重新设计你的模型 - 创建反向索引并使用非规范化 - 这真的不是很难;) –