代码之家  ›  专栏  ›  技术社区  ›  Joe

在Hadoop MapReduce中缓存映射应用程序?

  •  2
  • Joe  · 技术社区  · 15 年前

    从数据流的角度来看mapreduce和hbase的组合,我的问题似乎是合适的。我有一大套文档要映射、合并和减少。我以前的SQL实现是将任务拆分为批处理操作,将映射的结果累积存储到表中,然后执行相当于reduce的操作。这样做的好处是,在执行期间的任何时候(或执行之间),我都能及时得到映射的结果。

    据我所知,将此作业作为mapreduce运行需要每次运行所有映射函数。

    我的映射函数(实际上是任何函数)总是为给定的输入提供相同的输出。如果不需要的话,重新计算输出是没有意义的。我的输入(一组文档)将不断增长,我将定期在数据上运行MapReduce操作。在执行期间,我应该只计算新添加文档的映射函数。

    我的数据可能是HBase->MapReduce->HBase。考虑到Hadoop是一个完整的生态系统,它可能能够知道给定的函数已经应用于具有给定标识的行。我假设HBase表中的条目是不可变的。Hadoop能考虑到这一点吗?

    我从文档(尤其是Cloudera视频)中了解到,重新计算(潜在的冗余数据)比持久化和检索Hadoop正在使用的问题类更快。

    有什么意见/答案吗?

    2 回复  |  直到 15 年前
        1
  •  1
  •   bradheintz    15 年前

    如果您希望避免每次运行映射步骤,请将其作为自己的步骤(使用IdentityReducer或将作业的Reducer数设置为0),然后使用映射步骤的输出运行后续步骤。

    这是否比每次从原始数据重新计算要快,取决于输入数据的体积和形状与输出数据的对比,以及映射步骤的复杂程度等。

    请注意,在新的数据集上运行映射器不会附加到以前的运行中,但您可以通过使用一个有日期的输出文件夹来绕过这一点。也就是说,您可以将映射第一批文件的输出存储在 my_mapper_output/20091101 下周的批量生产 my_mapper_output/20091108 等等,如果你想整盘减少,你应该能通过 my_mapper_output 作为输入文件夹,并捕获所有输出集。

        2
  •  1
  •   SquareCog    15 年前

    为什么不在不同的环境中应用您的SQL工作流?也就是说,在输入表中添加一个“已处理”列。当运行摘要时,运行类似以下内容的管道:

    map(map_函数)on(输入表过滤!已处理);存储到映射输出中,可以是hbase,也可以是hdfs。

    映射(减少功能)到(映射输出);存储到HBase中。

    如果您将数据存储在按插入日期排序的HBase中,并且在某个地方记录成功的摘要运行的时间戳,并对日期晚于上一次成功摘要的输入打开筛选器,则可以使生活变得更轻松一点,这样可以节省一些重要的扫描时间。

    下面是一个有趣的演示,展示了一家公司如何构建其工作流(尽管他们不使用HBase): http://www.scribd.com/doc/20971412/Hadoop-World-Production-Deep-Dive-with-High-Availability