PathFilter无法生效

最近再写一个MapReduce的时候出现了一个诡异的问题, PathFilter无法生效, 具体描述如下:

  1. 代码参考的是另外一个项目(用的是SequenceFileInputFormat),其PathFilter能正常工作
  2. 我写的这个MR用的公司的一个CombineFileInputFormat, 虽然设置了Filter但是程序运行的时候PathFilter甚至都没实例化。

感觉从PathFilter初始化这个点找应该是个正确的方向,As we all know, FileInputFormat 是所有XXFileInputFormat的父类,果然在其中找到了如下代码

public abstract class FileInputFormat<K, V> extends InputFormat<K, V>  {

    public List<InputSplit> getSplits(JobContext job) throws IOException {
            //other code
            List<FileStatus> files = listStatus(job);
            //other code
    }

    protected List<FileStatus> listStatus(JobContext job) throws IOException {
            //other code
            Path[] dirs = getInputPaths(job);
            //other code
    }

    public static PathFilter getInputPathFilter(JobContext context) {
       Configuration conf = context.getConfiguration();
       Class<?> filterClass = conf.getClass(PATHFILTER_CLASS, null,
           PathFilter.class);
       return (filterClass != null) ?
           (PathFilter) ReflectionUtils.newInstance(filterClass, conf) : null;
     }
 }

这样的话, 只要确保 getSplits 方法调用了 getInputPathFilter, 那么PathFilter便能初始化成功. 所以实现自定义FileInputFormat
的时候要注意override 方法的实现,先看看CombineFileInputFormat和SequenceFileInputFormat是怎么实现的吧

  1. CombineFileInputFormat: 重写了getSplits方法, 但是在重写的方法里调用了 super.listStatus(job), 所以PathFilter正常
  2. SequenceFileInputFormat: 重写了listStatus方法, 但是在重写方法里调用了 super.listStatus(job), 所以PathFilter也依然正常
  3. 那么再看看自己写的那个InputFormat, 也重写了getSplits方法, 但是获取block status是用 getInputPaths获取路径然后手动获取status的, 根本就没管 父类的listSt方法,因此导致PathFilter失效

这个是一个PathFiter的Demo

THE END

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,010评论 19 139
  • 转至元数据结尾创建: 董潇伟,最新修改于: 十二月 23, 2016 转至元数据起始第一章:isa和Class一....
    40c0490e5268阅读 1,814评论 0 9
  • Spring Boot 参考指南 介绍 转载自:https://www.gitbook.com/book/qbgb...
    毛宇鹏阅读 46,974评论 6 342
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,780评论 18 399
  • 截至至2017年5月,中国美业发展迅速,全国各地每天都有新店开业! 但是在当今这个竞争越来越大的市场,美业到底该何...
    美焕颜化妆学院阅读 1,866评论 0 0