我正在开发一个NLP项目,该项目可以创建实体集并从大型语料库中计算成对相似性。目前我正在使用 hadoop流式传输,并已在 Python 中实现了所有映射器和缩减器。由于该算法需要多轮map-reduce,因此我使用Shell脚本来链接作业。
现在,我的问题和我接下来要做的事情是:
[关注1]。工作链和工作控制。链接hadoop流媒体工作是有问题的。如果作业序列中的job2(job1-job2-job3)失败,我必须手动删除输出文件夹,调整启动作业的脚本文件并从中间重新运行作业序列。我真的希望找到一种更聪明的方法来做到这一点。由于我需要经常调整算法的参数和逻辑,我不想一次又一次地重复这些步骤。
[关注2]。速度和效率。我认为很大一部分时间成本是将文本解析为数字,而这种格式转换过程完全没有必要。在开发过程中输入和测试那些近似重复的Python代码需要花费很多时间。
[关注3]。易于维护和分发。随着项目变得越来越大(我有超过20个地图减少工作),它确实需要模块化整个项目。我想使它面向对象,并使用IDE来开发和维护项目,这样处理各种内部数据结构和格式会更加舒适。而且我也希望将我的项目作为一个包分发,以便其他人可以从中受益。我需要一种简单的方法来在IDE中导入整个项目并使其易于分发。
我已经对解决方案的可能性进行了一些研究:
替代方案1. Hadoop自定义jar :似乎最好的方法是将整个项目转换为java - 一个hadoop自定义jar。这可以解决所有问题,包括作业链,效率和维护问题。但这可能需要很长时间,而且我找到了一种有效调试的方法。
替代方案2.猪:我发现this question的答案非常有助于确定何时(不)使用猪。在答案中,Arun_suresh说如果你需要在Map / reduce函数中进行一些非常具体的计算......那么你应该考虑部署自己的jar"。我的工作包括shingling,hashing,min-hashing,permutation等。它可以使用Pig Latin实现吗?有没有一个地方可以让我了解Pig拉丁语程序有多复杂的计算?
备用3. Mahout :我发现新发布的Apache Mahout版本有几个功能与我正在做的事情重叠,但它不能取代我的工作。我应该把我的项目建立在Mahout上吗?
因为我基本上独自完成这项工作,而且只有大约2周的时间。做整个看家工作的时间预算,大约1个月来改进它,我真的需要找到一种有效可靠的方法来做到这一点。请帮助我选择其中一种替代方案,或者告诉我你是否有更好的解决方案。
答案 0 :(得分:1)
关注1:考虑使用OOZIE,您可以在“工作流程”中定义整个作业链,并执行许多操作(它们可以是Map reduce steps,decision switch / joins)。
每个操作都可以定义一个准备阶段,您可以在其中删除即将出现的输出文件夹。
您还可以查看工作流程中发生故障的位置,并从该特定步骤重新运行工作流程。
OOZIE文档包含运行streaming个工作的示例,以及一些cookbook examples too (Case 7)
关注2:这是所有流媒体作业共享的问题,如果您想要获得最佳性能,您需要咬Java子弹,或者寻找可以处理二进制格式的替代流输入/输出格式(比如AVRO),你需要一些知道如何处理它们的自定义mapper / redurs流包装器。
关注3:通过流式传输,您可以将所有python脚本捆绑到一个tarball中,并让hadoop将tarball解压缩到每个任务节点。这是DistributedCache存档功能的一个功能(在OOZIE中,这是在map-reduce操作的archives元素中定义的 - 参见上一个OOZIE cookbook链接中的案例6)