首先,我是hadoop的新手:)
我有一个大型的gzip压缩文件数据集(gzip文件中的TB文件大小各为100-500mb)。
基本上,我需要对我的map-reduce作业进行某种过滤。
我想以各种方式分析这些文件。这些作业中的许多只需要分析某种格式的文件(具有一定长度,包含某些单词等 - 各种任意(反向)索引),并且处理每个作业的整个数据集需要花费不合理的时间。所以我想创建指向HDFS中特定块/文件的索引。
我可以手动生成所需的索引,但是如何准确指定我想要处理哪些(数千个)特定文件/块作为映射器的输入?我是否可以在不将源数据读入例如HBase的?我想要吗?或者我完全错误地解决了这个问题?
答案 0 :(得分: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)等。
答案 1 :(得分:2)
因为你想根据文件内容(包含单词 foobar 的文件)而不是文件元数据(文件名/大小等)过滤输入,你实际上需要那种我基于Hadoop InputSplit创建的索引。见my blog
答案 2 :(得分:1)
在HDFS中对特定文件运行Map-Reduce作业意味着根据某些条件过滤掉输入文件。 Here是由Antoine Amend发布的好博客,将会有所帮助。