我正在开发一个 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 个月的时间来改进它,我真的需要找到一个高效可靠的方法来完成它。请帮我选择一种替代方案,或者告诉我您是否有更好的解决方案。