8

首先,我是 hadoop 的新手 :)

我有大量的 gzip 文件数据集(gzip 文件中的 TB 文件,每个文件大小约为 100-500mb)。

基本上,我需要对我的 map-reduce 作业的输入进行某种过滤。

我想以各种方式分析这些文件。其中许多作业只需要分析特定格式的文件(特定长度,包含特定单词等 - 各种任意(反转)索引),并且为每个作业处理整个数据集需要不合理的时间。所以我想创建指向 HDFS 中特定块/文件的索引。

我可以手动生成所需的索引,但是如何准确指定要处理的(数千个)特定文件/块作为映射器的输入?我可以在不将源数据读入例如 HBase 的情况下执行此操作吗?我想要吗?还是我完全错误地解决了这个问题?

4

3 回答 3

2

假设您有某种方法可以知道要在大型文件语料库中处理哪些 x 文件,则可以org.apache.hadoop.mapreduce.lib.input.FileInputFormat.setInputPathFilter(Job, Class<? extends PathFilter>)在配置作业时使用该方法。

您需要传递一个实现PathFilter. Hadoop 将创建此类的一个新实例,并将通过该boolean accept(Path path)方法显示语料库中的每个文件。然后,您可以使用它来过滤文件以针对实际的流程映射任务(无论是基于文件名、大小、最后修改的时间戳等)。

要针对特定​​块,您需要实现自己的 FileInputFormat 扩展,特别是覆盖该getSplits方法。此方法使用该listStatus方法来确定要处理的输入文件(并且是调用前面提到的 PathFilter 的位置),然后确定如何将这些文件拆分为拆分(如果文件是可拆分的)。因此,在此getSplits方法中,您将再次需要使用参考数据来定位您感兴趣的特定拆分。

至于存储/检索此目标文件和拆分信息,您有多种持久性存储选择,例如键/值存储(HBase,如您在问题中所述)、单独的数据库(MySQL 等)、倒排索引( Lucene)等。

于 2013-06-22T13:01:16.957 回答
2

因为您想根据文件内容(包含单词foobar的文件)而不是文件元数据(文件名/大小等)过滤输入,所以您实际上需要我基于 Hadoop InputSplit 创建的那种索引。看我的博客

于 2014-09-10T22:32:24.730 回答
1

在 HDFS 中的特定文件上运行 Map-Reduce 作业意味着根据某些条件过滤掉输入文件。是 Antoine Amend 发布的一个很好的博客,会有所帮助。

于 2014-05-28T11:19:37.063 回答