hadoop—在hdfs中的特定文件/块上运行map reduce作业

svmlkihl  于 2021-06-04  发布在  Hadoop
关注(0)|答案(3)|浏览(266)

首先,我是hadoop新手:)
我有一个很大的gzip文件数据集(gzip文件中的文档的tbs,每个大小大约为100-500mb)。
基本上,我需要一些我的Map减少工作输入排序过滤。
我想用各种方法分析这些文件。其中许多作业只需要分析特定格式的文件(特定长度、包含特定单词等-各种任意(反转)索引),并且处理每个作业的整个数据集所需的时间不合理。所以我想创建指向hdfs中特定块/文件的索引。
我可以手动生成所需的索引,但如何确切地指定要处理哪些(数千个)特定文件/块作为Map器的输入?我可以在不将源数据读入hbase的情况下执行此操作吗?我想吗?还是我解决这个问题完全错了?

tkqqtvp1

tkqqtvp11#

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

9fkzdhlc

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)等。

ybzsozfc

ybzsozfc3#

在hdfs中对特定文件运行map reduce作业意味着根据某些条件过滤掉输入文件。这里是一个很好的博客,由安托万发表修正,将是有益的。

相关问题