您的位置:首页 > 大数据 > Hadoop

hadoop源码阅读之FileSystem简记

2016-05-16 17:19 357 查看
版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。 本文链接:https://blog.csdn.net/lsl15975561051/article/details/51426621

本文为本人学习hadoop源码过程中所做的笔记,如有问题请大家指出,或者觉得不好,请绕行,谢谢!


fs = FileSystem.newInstance(uri,  conf);

这段代码是如何得到FileSystem对象的呢?

由于FileSystem是抽象类,不能直接实例化对象,
因此只能通过其子类来完成实例化。
哪又是如何通过子类实例化的呢?

通过阅读源码,关键代码如下:
  public static Class<? extends FileSystem> getFileSystemClass(String scheme,
      Configuration conf) throws IOException {
    if (!FILE_SYSTEMS_LOADED) {
      loadFileSystems();
    }
    Class<? extends FileSystem> clazz = null;
    if (conf != null) {
      clazz = (Class<? extends FileSystem>) conf.getClass("fs." + scheme + ".impl", null);
    }
    if (clazz == null) {
      clazz = SERVICE_FILE_SYSTEMS.get(scheme);
    }
    if (clazz == null) {
      throw new IOException("No FileSystem for scheme: " + scheme);
    }
    return clazz;
  }
  
  private static void loadFileSystems() {
    synchronized (FileSystem.class) {
      if (!FILE_SYSTEMS_LOADED) {
        ServiceLoader<FileSystem> serviceLoader = ServiceLoader.load(FileSystem.class);
        for (FileSystem fs : serviceLoader) {
          SERVICE_FILE_SYSTEMS.put(fs.getScheme(), fs.getClass());
        }
        FILE_SYSTEMS_LOADED = true;
      }
    }
  }
  
首先,会判断FileSystem的子类对象集合是否加载,如果没有加载,
那么就通过ServiceLoader.load拿到FileSystem的子类对象集合,继而
把对象集合中的对象相关信息(这里是scheme和对应类的信息)
注意:ServiceLoader是怎么知道加载FileSystem的哪些子类呢,答案就在
hadoop-common-2.6.0.jar包下
META-INF/services/org.apache.hadoop.fs.FileSystem

hadoop-hdfs-2.6.0.jar包下
META-INF/services/org.apache.hadoop.fs.FileSystem
即可找到相关类


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: