首先,我是hadoop新手:)
我有一个很大的gzip文件数据集(gzip文件中的文档的tbs,每个大小大约为100-500mb)。
基本上,我需要一些我的Map减少工作输入排序过滤。
我想用各种方法分析这些文件。其中许多作业只需要分析特定格式的文件(特定长度、包含特定单词等-各种任意(反转)索引),并且处理每个作业的整个数据集所需的时间不合理。所以我想创建指向hdfs中特定块/文件的索引。
我可以手动生成所需的索引,但如何确切地指定要处理哪些(数千个)特定文件/块作为Map器的输入?我可以在不将源数据读入hbase的情况下执行此操作吗?我想吗?还是我解决这个问题完全错了?
3条答案
按热度按时间tkqqtvp11#
因为您希望根据文件内容(包含单词foobar的文件)而不是文件元数据(文件名/大小等)过滤输入,所以您实际上需要我基于hadoop inputsplit创建的索引类型。查看我的博客
9fkzdhlc2#
假设您有某种方法可以知道在一个大的文件库中处理哪些x文件,您可以使用
org.apache.hadoop.mapreduce.lib.input.FileInputFormat.setInputPathFilter(Job, Class<? extends PathFilter>)
方法配置作业时。您需要传递一个实现
PathFilter
. hadoop将创建这个类的一个新示例,并通过boolean accept(Path path)
方法。然后,您可以使用它将文件过滤到实际的流程Map任务(无论是基于文件名、大小、上次修改的时间戳等)。要针对特定的块,您需要实现自己的fileinputformat扩展,特别是重写
getSplits
方法。此方法使用listStatus
方法来确定要处理的输入文件(以及调用前面提到的pathfilter的位置),然后确定如何将这些文件拆分为多个部分(如果这些文件是可拆分的)。所以在这个getSplits
方法,您将再次需要使用引用数据来针对您感兴趣的特定拆分。至于存储/检索这个目标文件和分割信息,您有几种持久性存储的选择,例如键/值存储(hbase,正如您在问题中提到的)、单独的数据库(mysql等)、反向索引(lucene)等。
ybzsozfc3#
在hdfs中对特定文件运行map reduce作业意味着根据某些条件过滤掉输入文件。这里是一个很好的博客,由安托万发表修正,将是有益的。