选择哪一个:Hadoop自定义jar,Hadoop Streaming,Pig或Mahout



我正在研究一个NLP项目,该项目可以从大规模语料库创建实体集并计算成对相似性。目前我正在使用Hadoop流,并在Python中实现了所有映射器和化简器。由于该算法需要几轮map-reduce,因此我使用Shell脚本来链接作业。

现在,以下是我的担忧以及我下一步要做的事情:

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

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

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

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

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

  • 备选案文2.猪:我发现这个问题的答案对于弄清楚何时(不)使用猪非常有帮助。在回答中,Arun_suresh说,如果"你需要在 Map/reduce 函数中进行一些非常具体的计算......那么你应该考虑部署你自己的罐子"。我的工作包括瓦化、散列、最小散列、排列等。可以使用猪拉丁语实现吗?有没有一个地方可以让我了解Pig Latin程序的计算有多复杂?

  • 备选案文3.Mahout:我发现新发布的Apache Mahout版本有几个功能与我正在做的事情重叠,但它不能取代我的工作。我的项目应该基于Mahout吗?

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

  • 关注点1:研究使用OOZIE,您可以在"工作流"中定义整个作业链,并具有许多操作(它们可以是映射归约步骤,决策切换/连接)。

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

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

    OOZIE 文档包含运行流作业的示例,以及一些说明书示例(案例 7)

  • 关注点 2:这是所有流作业共有的问题,如果你想要最好的性能,你要么需要咬紧 Java 子弹,要么寻找可以处理二进制格式的替代流输入/输出格式(如 AVRO),你需要一些知道如何处理这些的自定义映射器/化简器流包装器。

  • 关注点3:通过流式处理,您可以将所有python脚本捆绑到一个压缩包中,并让hadoop将压缩包解压缩到每个任务节点。这是分布式缓存存档功能的一个功能(在 OOZIE 中,这是在 map-reduce 操作的存档元素中定义的 - 请参阅前面 OOZIE 说明书链接中的案例 6)

最新更新