2

我正在开发一个 NLP 项目,该项目可以创建实体集并从大规模语料库中计算成对相似度。目前我正在使用hadoop 流,并且已经在Python中实现了所有的映射器和减速器。由于该算法需要几轮 map-reduce,我使用 Shell 脚本来链接作业。

现在这是我的担忧以及接下来我想做的事情:

  • [关注1]。作业链和作业控制。链接 hadoop 流作业是有问题的。如果作业序列 (job1-job2-job3) 中的 job2 失败,我必须手动删除输出文件夹,调整启动作业的脚本文件并从中间重新运行作业序列。我真的希望找到一种更聪明的方法来做到这一点。由于我需要经常调整算法的参数和逻辑,我不想一次又一次地重复这些步骤。

  • [关注 2]。速度和效率。我认为很大一部分时间成本是用于将文本解析为数字以及这种完全没有必要的格式转换过程。在开发过程中输入和测试那些几乎重复的 Python 代码也需要花费很多时间。

  • [关注3]。易于维护和分发。随着项目越来越大(我有超过 20 个 map-reduce 工作),它确实需要将整个项目模块化。我想让它面向对象,并使用IDE来开发和维护项目,这样可以更自如地处理各种内部数据结构和格式。而且我想将我的项目作为一个包分发,以便其他人可以从中受益。我需要一种简单的方法将整个项目导入 IDE 并使其易于分发。

我对解决方案的可能性进行了一些研究:

  • 备选方案 1. Hadoop 自定义 jar:似乎最好的方法是将整个项目转换为 java - 一个 hadoop 自定义 jar。这可能会解决所有问题,包括作业链接、效率和维护问题。但这可能需要相当长的时间,而且我已经找到了一种进行高效调试的方法。

  • 备选方案 2. Pig:我发现这个问题的答案对于确定何时(不)使用 pig 非常有帮助。在回答中,Arun_suresh 说如果“您需要在 Map/reduce 函数中进行一些非常具体的计算……那么您应该考虑部署自己的 jars”。我的工作包括 shingling、hashing、min-hashing、permutation 等。可以使用 Pig Latin 实现吗?有没有什么地方可以让我了解 Pig Latin 程序的计算复杂程度?

  • 备选方案 3. Mahout:我发现新发布的Apache Mahout版本有几个功能与我正在做的重叠,但它不能替代我的工作。我应该将我的项目建立在 Mahout 上吗?

由于我基本上是一个人完成这项工作,并且只有大约 2 周的时间预算来完成整个家政工作,大约 1 个月的时间来改进它,我真的需要找到一个高效可靠的方法来完成它。请帮我选择一种替代方案,或者告诉我您是否有更好的解决方案。

4

1 回答 1

1
  • 关注点 1:考虑使用 OOZIE,您可以在“工作流”中定义整个作业链,其中包含许多操作(它们可以是 Map reduce 步骤、决策切换/连接)。

    每个操作都可以定义一个准备阶段,您可以在其中删除即将到来的输出文件夹。

    您还可以查看工作流发生故障的位置,并从该特定步骤重新运行工作流。

    OOZIE 文档有运行流式作业的示例,还有一些食谱示例(案例 7)

  • 关注点 2:这是所有流式作业共享的问题,如果您想要获得最佳性能,您要么需要咬住 Java 子弹,要么寻找可以处理二进制格式的替代流输入/输出格式(例如 AVRO),并且您将需要一些知道如何处理这些的自定义映射器/减速器流包装器。

  • 关注点 3:使用流式传输,您可以将所有 python 脚本捆绑到一个 tarball 中,并让 hadoop 将 tarball 解压到每个任务节点。这是 DistributedCache 归档功能的一个功能(在 OOZIE 中,这是在 map-reduce 操作的归档元素中定义的 - 请参阅上一个 OOZIE 食谱链接中的案例 6)

于 2012-06-21T22:48:52.070 回答