1

我正在使用 mrjob 来满足我的 EMR 需求。

如何根据我的映射器代码中的一些逻辑将一些数据(行)从我的映射器写入“单独的目录”:

  1. tar gzip 和

  2. 作业完成/突然终止后上传到单独的 S3 存储桶(取决于目录名称)?

我猜 ' --output-dir' 选项只允许您将最终作业输出上传到该目录,但我想不时从我的映射器写入其他目录。

4

3 回答 3

1

我认为 Hadoop 的MultipleOutput功能可以帮助您,在您的自定义中outputFormat您可以指定路径和文件名。

于 2012-06-19T19:07:04.577 回答
0

不,你不能在传统意义上。

原因:当与 Hadoop 集群一起运行时,MrJob 内部使用 Hadoop 流来运行 map/reduce 作业我假设 Amazon Elastic M/R 与 Hadoop 集群相同。

--output-dir实际上是 Hadoop 流的输入,它指定了 reducer 的输出将被收集到的位置。您不能使用此机制将数据分隔到不同的文件夹中。

[编辑:回应评论]

我的理解是boto只是一个连接亚马逊服务和访问ec2和s3等的库。

我猜,在非传统意义上,您仍然可以写入不同的目录。

我没有测试过这个想法,也不推荐这种方法。这就像打开一个文件并直接在减速器中写入它。理论上你可以这样做。而不是仅仅将 reducer 输出写入 std.out。您可以直接打开并写入 S3 对象。您必须确保在生成多个减速器时打开不同的文件。

这是我在将 MrJob 与 Hadoop 集群一起使用时学到的:http: //pyfunc.blogspot.com/2012/05/hadoop-map-reduce-with-mrjob.html

于 2012-06-18T22:14:59.200 回答
0

您可以按照创建自定义 Jar 的方法并自定义您OutputFormat的,以便在不同的文件夹/文件中多路输出。您将创建一个子类并MultipleTextOutputFormat覆盖其中的一些方法(主要是)。generateFileNameForKeyValue(Text key, Text value, String leaf)generateActualKey(Text key, Text value)

有关更多详细信息,您可以参考: http: //www.infoq.com/articles/HadoopOutputFormat

于 2012-06-19T20:34:59.520 回答