【发布时间】:2013-05-02 23:06:35
【问题描述】:
我有一个 S3 存储桶,其中包含要连接的日志文件,然后用作 EMR 作业的输入。日志文件的路径如下:bucket-name/[date]/product/out/[hour]/[minute-based-file]。我想在所有日期目录中的所有小时目录中获取所有分钟日志,并将它们连接到一个文件中。我想将该文件用作 EMR 作业的输入。需要保留原始日志文件,新合并的日志文件可能会写入不同的 S3 存储桶。
我尝试通过 SSH 在 EMR 主节点上使用 hadoop fs -getmerge,但收到此错误:
This file system object (file:///) does not support access to the request path 's3://target-bucket-name/merged.log'
源 S3 存储桶中有一些其他文件,因此我不想包含其所有文件。通配符匹配如下所示:s3n://bucket-name/*/product/out/*/log.*。
其目的是解决将数以万计/数十万个小 (10k-3mb) 输入文件输入 EMR 的问题,而是给它一个可以更有效地拆分的大文件。
【问题讨论】:
-
我可以通过以下命令使用 Hadoop shell 成功获取这些文件的列表:
hadoop fs -ls s3n://bucket-name/*/product/out/*/log* -
一种选择是创建一个新的 EMR 作业来为您进行连接。例如,将所有事件分组到日或小时存储桶中,然后将其写回 S3。不确定这会有多有效 - 但它肯定会留下一大群人来输入你的映射器。
-
你可以像上面提到的@seedhead那样做,而不是将它写回s3,你可以将它写入hdfs并使用同一个集群来运行你的实际工作。
标签: hadoop amazon-web-services amazon-s3 elastic-map-reduce emr