我在我有两个 mapreduce 工作的情况下。我对 python 更满意,并计划用它来编写 mapreduce 脚本并使用 hadoop 流。使用 hadoop 流时,是否可以方便地链接两个作业?
Map1 -> Reduce1 -> Map2 -> Reduce2
我听说过很多在 java 中实现这一点的方法,但我需要一些用于 Hadoop 流的东西。
我在我有两个 mapreduce 工作的情况下。我对 python 更满意,并计划用它来编写 mapreduce 脚本并使用 hadoop 流。使用 hadoop 流时,是否可以方便地链接两个作业?
Map1 -> Reduce1 -> Map2 -> Reduce2
我听说过很多在 java 中实现这一点的方法,但我需要一些用于 Hadoop 流的东西。
这是一篇关于如何使用级联和流式传输的精彩博客文章。 http://www.xcombinator.com/2009/11/18/how-to-use-cascading-with-hadoop-streaming/
这里的价值是您可以在同一个应用程序中将 java(级联查询流)与您的自定义流操作混合。我发现这比其他方法脆弱得多。
请注意,Cascading 中的 Cascade 对象允许您链接多个 Flows(通过上面的博客文章,您的 Streaming 作业将成为 MapReduceFlow)。
免责声明:我是 Cascading 的作者
您可以尝试Yelp 的 MRJob来完成您的工作。它是一个开源 MapReduce 库,允许您编写可以在 Hadoop 集群或 EC2 上的 Hadoop Streaming 上运行的链式作业。它非常优雅且易于使用,并且具有一种称为 steps 的方法,您可以覆盖该方法以指定您希望数据通过的确切的映射器和缩减器链。
查看https://github.com/Yelp/mrjob的源代码和http://packages.python.org/mrjob/
的
文档
通常,我使用 Hadoop 流和 Python 执行此操作的方式是从我创建的 bash 脚本中首先运行作业。我总是从 bash 脚本运行,这样我可以收到有关错误的电子邮件和有关成功的电子邮件,并使它们更灵活地从另一个 Ruby 或 Python 脚本传递参数,这些脚本可以在更大的事件处理系统中工作。
因此,第一个命令(作业)的输出是下一个命令(作业)的输入,它可以是 bash 脚本中的变量,作为命令行参数传入(简单而快速)
您可能想查看 Oozie http://yahoo.github.com/oozie/design.html一个 Hadoop 工作流引擎,它也将有助于执行此操作(支持流式传输,不是问题)。我刚开始的时候没有这个,所以我最终不得不构建自己的东西,但这是一个 kewl 系统并且很有用!!!!
如果您已经在 Python 中编写映射器和缩减器,我会考虑使用 Dumbo,这样操作很简单。您的 map reduce 作业、mapper、reducer 等的顺序都在一个可以从命令行运行的 python 脚本中。