Cassandra Hadoop - 是否可以读取和写入相同的列族

时间:2013-04-26 20:27:08

标签: hadoop cassandra

使用Cassandra 1.1,是否可以使用从Column Family X读取的Hadoop作业,并同时“更新”它。也就是说,将X指定为输入列族,然后指定

  1. 在地图步骤中,更新为相同的CF(例如通过Hector)。
  2. 或如果#1不可能,请在reduce步骤中更新到相同的CF(直接通过Hector,或者通过将CF指定为输出列族)。
  3. 我们要做的是:我们将要读取(可能非常宽)的行。在map()方法中,我们遍历该行的列,并在处理每个列时,我们不再需要该列,因此我们计划通过在Cassandra中以TTL = 1秒更新它来“过期”它。

    如果在地图步骤中不可能或不建议这样做,那么我们准备在reduce步骤中执行此操作。但是,我们更喜欢在map步骤中执行此操作,因为在reduce步骤中执行此操作意味着我们需要为reduce()方法提供足够的信息以标识我们尝试过期的row + col。这意味着我们的地图步骤需要将此信息包含在其输出中,如果可能的话我们会尽量避免这种情况。

    再次,是否可以使用#1或#2?

    执行此操作

1 个答案:

答案 0 :(得分:1)

首先,您可以在地图中执行任何操作或减少步骤。所以,是的,这是可能的。

可以在Reduce步骤中写入相同的列族,因为Map和Reduce步骤是按顺序执行的。您可以在Reduce步骤中更新任何列族。

关于Map:可以使用Hector / Thrift API在Map步骤中写入相同的列族,但这是一个不好的实践。首先,因为Map步骤仅用于读取数据。在Map步骤中,您将继续迭代行 - 它正在使用Hadoop中的快速低级Cassandra读取器实现快速工作。使用Hector你的Map步骤会慢得多。

如果您想要在Map步骤中删除的数据永远不会在后续步骤中使用,您可以,但我重复一遍 - 写入您在Map步骤中迭代的数据集是一个不好的实践。如果map-reduce作业失败(由于任何原因),您在地图步骤中收集的垃圾数据可能会损坏(它们已在地图步骤中删除,但由于作业失败,reducer将永远不会看到它们。)

Map-Reduce规则:您应该以连续的方式修改您迭代的所有数据。首先迭代数据集,然后修改。不要同时这样做

回答你的问题,无论如何都有可能,但#2是有效的。您应该使用Reduce步骤来编写/删除操作。

P.S。您似乎正在尝试将Hadoop用作垃圾收集器 - 这不是它的设计方法。