我正在尝试运行MapReduce流作业,该作业从s3存储桶中与给定模式匹配的目录中获取输入文件。模式类似bucket-name/[date]/product/logs/[hour]/[logfilename]
。一个示例日志会像bucket-name/2013-05-02/product/logs/05/log123456789
一样。
我可以通过仅传递文件名的小时部分作为通配符来完成工作。例如:bucket-name/2013-05-02/product/logs/*/
。这成功地从每个小时中选取每个日志文件,并将它们单独传递给映射器。
问题在于我尝试将日期设为通配符,例如:bucket-name/*/product/logs/*/
。当我这样做时,作业被创建,但没有创建任务,最终失败。此错误将打印在syslog中。
2013-05-02 08:03:41,549 ERROR org.apache.hadoop.streaming.StreamJob (main): Job not successful. Error: Job initialization failed:
java.lang.OutOfMemoryError: Java heap space
at java.util.regex.Matcher.<init>(Matcher.java:207)
at java.util.regex.Pattern.matcher(Pattern.java:888)
at org.apache.hadoop.conf.Configuration.substituteVars(Configuration.java:378)
at org.apache.hadoop.conf.Configuration.get(Configuration.java:418)
at org.apache.hadoop.conf.Configuration.getLong(Configuration.java:523)
at org.apache.hadoop.mapred.SkipBadRecords.getMapperMaxSkipRecords(SkipBadRecords.java:247)
at org.apache.hadoop.mapred.TaskInProgress.<init>(TaskInProgress.java:146)
at org.apache.hadoop.mapred.JobInProgress.initTasks(JobInProgress.java:722)
at org.apache.hadoop.mapred.JobTracker.initJob(JobTracker.java:4238)
at org.apache.hadoop.mapred.EagerTaskInitializationListener$InitJob.run(EagerTaskInitializationListener.java:79)
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
at java.lang.Thread.run(Thread.java:662)
2013-05-02 08:03:41,549 INFO org.apache.hadoop.streaming.StreamJob (main): killJob...
答案 0 :(得分:1)
在进一步测试时,看起来多个通配符语法在command line client中按预期工作。在我意识到需要Ruby 1.8.7意味着它需要完全 Ruby 1.8.7之前,我一开始难以让它工作。