在我的工作中,我需要解析许多历史日志集。个别客户(有数千个)可能有数百个按日期划分的日志子目录。例如:
- 日志/Customer_One/2011-01-02-001
- 日志/Customer_One/2012-02-03-001
- 日志/Customer_One/2012-02-03-002
- 日志/Customer_Two/2009-03-03-001
- 日志/Customer_Two/2009-03-03-002
每个单独的日志集本身可能有五到六级深度并包含数千个文件。
因此,我实际上希望单个地图作业能够处理遍历子目录:简单地枚举单个文件是我的分布式计算问题的一部分!
不幸的是,当我尝试将仅包含日志子目录的目录传递给 Hadoop 时,它抱怨我无法将这些子目录传递给我的映射器。(同样,我已经写信接受子目录作为输入):
$ hadoop jar "${HADOOP_HOME}/contrib/streaming/hadoop-streaming-${HADOOP_VERSION}.jar" -input file:///mnt/logs/Customer_Name/ -file mapper.sh -mapper "mapper.sh" -file reducer.sh -reducer "reducer.sh" -output .
[ . . . ]
12/04/10 12:48:35 ERROR security.UserGroupInformation: PriviledgedActionException as:cloudera (auth:SIMPLE) cause:java.io.IOException: Not a file: file:/mnt/logs/Customer_Name/2011-05-20-003
12/04/10 12:48:35 ERROR streaming.StreamJob: Error Launching job : Not a file: file:/mnt/logs/Customer_Name/2011-05-20-003
Streaming Command Failed!
[cloudera@localhost ~]$
有没有一种直接的方法来说服 Hadoop-streaming 允许我将目录分配为工作项?