Hadoop 根据映射程序代码中的某些逻辑,将映射程序中的一些数据(行)写入单独的目录

Hadoop 根据映射程序代码中的某些逻辑,将映射程序中的一些数据(行)写入单独的目录,hadoop,elastic-map-reduce,mrjob,Hadoop,Elastic Map Reduce,Mrjob,我使用mrjob满足我的电子病历需求 根据映射器代码中的逻辑,如何将映射器中的一些数据(行)写入“单独的目录”,我可以: tar gzip和 作业突然完成/终止后,是否上载到单独的S3存储桶(取决于目录名) 我猜“--output dir”选项只允许您将最终作业输出上载到该目录,但我也希望不时从我的映射器写入其他目录。不,传统意义上您不能。 原因:MrJob在内部使用Hadoop流来运行map/reduce作业,当使用Hadoop集群运行时,我假设amazonelasticm/R与Hadoop集

我使用mrjob满足我的电子病历需求

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

  • tar gzip和

  • 作业突然完成/终止后,是否上载到单独的S3存储桶(取决于目录名)


  • 我猜“
    --output dir
    ”选项只允许您将最终作业输出上载到该目录,但我也希望不时从我的映射器写入其他目录。

    不,传统意义上您不能。

    原因:MrJob在内部使用Hadoop流来运行map/reduce作业,当使用Hadoop集群运行时,我假设amazonelasticm/R与Hadoop集群相同

    --output dir
    实际上是Hadoop streaming的一个输入,它指定在哪里收集减速机的输出。不能使用此机制将数据隔离到不同的文件夹中

    [编辑:回应评论]

    我的理解是boto只是一个连接到Amazon服务并访问ec2和s3等的库

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

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


    这是我在Hadoop集群中使用MrJob时学到的:

    不,传统意义上你不能这样做。

    原因:MrJob在内部使用Hadoop流来运行map/reduce作业,当使用Hadoop集群运行时,我假设amazonelasticm/R与Hadoop集群相同

    --output dir
    实际上是Hadoop streaming的一个输入,它指定在哪里收集减速机的输出。不能使用此机制将数据隔离到不同的文件夹中

    [编辑:回应评论]

    我的理解是boto只是一个连接到Amazon服务并访问ec2和s3等的库

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

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


    这是我在使用MrJob与Hadoop群集时学到的:

    我认为Hadoop的
    多输出
    功能可以帮助您,在自定义的
    输出格式中,您可以指定路径和文件名。

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

    您可以按照创建自定义Jar的方法自定义
    outputFormat
    ,以便在不同的文件夹/文件中多路输出。您应该创建
    MultipleTextOutputFormat
    的子类,并覆盖其中的一些方法(
    generateFileNameForKeyValue(文本键、文本值、字符串叶)
    generateActualKey(文本键、文本值)


    有关更多详细信息,请参阅:

    您可以按照创建自定义Jar的方法,自定义您的
    OutputFormat
    ,以便在不同的文件夹/文件中多路输出。您应该创建
    MultipleTextOutputFormat
    的子类,并覆盖其中的一些方法(
    generateFileNameForKeyValue(文本键、文本值、字符串叶)
    generateActualKey(文本键、文本值)


    有关更多详细信息,请参阅:

    深入思考:MrJob附带特定版本的boto。现在我可以用它来写本地文件夹,或者如果写不到,写“远程”S3存储桶吗?我仍然在寻找一种方法来减少对S3的PUT数(现在我每得到一行,就至少触发一个PUT)。此外,写入到STDERR的数据在哪里会用于MrJob?(我假设所有STDOUT输出都指向'--output dir')@newToFlume:两个日志文件所指向的位置。看到这个链接对Hadoop流媒体似乎没有什么用处,但感谢Ashish的后续工作。更深入地思考:MrJob附带了特定版本的boto。现在我可以用它来写本地文件夹,或者如果写不到,写“远程”S3存储桶吗?我仍然在寻找一种方法来减少对S3的PUT数(现在我每得到一行,就至少触发一个PUT)。此外,写入到STDERR的数据在哪里会用于MrJob?(我假设所有STDOUT输出都指向'--output dir')@newToFlume:两个日志文件所指向的位置。看到这个链接对Hadoop流媒体似乎没有什么用处,但是感谢Ashish的后续工作。我想你目前在Hadoop流媒体中可能不会这么做,它说你必须使用自定义jar。但我可能错了,您当然可以将自定义jar作为Hadoop流作业运行。示例命令如下:ruby elastic mapreduce–jobflow--jar--arg--arg--step name“My Streaming Job step”我想目前在Hadoop Streaming中您可能不会这样做,它说您必须使用自定义jar。但我可能错了,您当然可以将自定义jar作为Hadoop流作业运行。示例命令如下所示:ruby elastic mapreduce–jobflow--jar--arg--arg--step name“My Streaming Job step”