0

使用 Cassandra 1.1,是否可以有一个从列族 X 读取的 Hadoop 作业,并同时对其进行“更新”。也就是说,将 X 指定为输入列族,然后

  1. 在映射步骤中,更新到相同的 CF(例如通过 Hector)。
  2. 或者如果 #1 不可能,在 reduce 步骤中更新到相同的 CF(直接通过 Hector,或者通过将 CF 指定为输出列族)。

我们正在尝试做的是:我们有(可能非常宽)要读取的行。在 map() 方法中,我们遍历该行的列,并且随着每一列的处理,我们不再需要该列,因此我们计划通过在 Cassandra 中使用 TTL = 1 秒更新它来“过期”它。

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

再说一遍,是否可以使用 #1 或 #2 来做到这一点?

4

1 回答 1

1

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

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

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

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

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

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

PS 看来您正在尝试将 Hadoop 用作垃圾收集器 - 这不是它的设计方法。

于 2013-04-28T06:29:51.170 回答