通过目录没有文件到Hadoop的流?(Pass directories not files to h

2019-07-28 22:13发布

在我的工作,我需要解析许多历史logsets。 个人客户(有成千上万)可能有几百按日期爆发日志子目录。 例如:

  • 日志/ 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为:Cloudera的(AUTH:SIMPLE)原因:java.io.IOException的:不是一个文件:文件:/ MNT /日志/ CUSTOMER_NAME / 2011-05-20 -003 12/04/10 12时48分35秒ERROR streaming.StreamJob:错误启动工作:不是一个文件:文件:到/ mnt /日志/ CUSTOMER_NAME / 2011-05-20-003流命令失败! [Cloudera的@本地〜] $

有没有说服Hadoop的数据流允许我指定的目录作为工作项目一个简单的方法?

Answer 1:

我猜你需要调查编写定制InputFormat您可以通过根目录也一样,它会为每个客户创建一个分裂,然后为每个分割备案读者会做目录的步行路程,推动文件内容的映射器



Answer 2:

Hadoop的支持输入通路是一个正则表达式 。 我还没有很多复杂的正则表达式的尝试,但简单的占位符*做的工作。

所以你的情况,我认为,如果你的,因为它会用自己的输入路径如下:

file:///mnt/logs/Customer_Name/*/*

可能并不需要最后一个星号作为最后的目录中的所有文件都会自动输入路径添加。



文章来源: Pass directories not files to hadoop-streaming?