hdfs的FileSystem实例化
发布日期:2021-09-08 22:55:01 浏览次数:15 分类:技术文章

本文共 1254 字,大约阅读时间需要 4 分钟。

前言

在spark中通过hdfs的java接口并发写文件出现了数据丢失的问题,一顿操作后发现原来是FileSystem的缓存机制。补一课先

 

FileSystem实例化

FileSystem.get(config)是如何创建一个hadoop的FileSystem。
分为3个步骤。
1.  初始化所有支持的FileSystem(没有实例话,只是缓存类)
2.  通过uri的scheme拿到相应FileSystem
3.  缓存机制(如果不关闭的话,默认是开启)
 
下面详细分析一下各步骤流程
1.   初始化
通过java提供的ServiceLoader来录入所有可能的FileSystem,就像这样
ServiceLoader
serviceLoader = ServiceLoader.load(FileSystem.class);for (FileSystem fs : serviceLoader) { SERVICE_FILE_SYSTEMS.put(fs.getScheme(), fs.getClass());}

 

待初始化的类通过配置文件声明,配置可以在hadoop-hdfs.jar里找到

捎带一嘴,java提供的ServiceLoader有点像乞丐版spring的依赖反转。

2.scheme
通过对Uri的解析来判断创建一个什么FileSystem,
例如
hdfs://master:9200/test的scheme就是hdfs。

然后通过scheme和已经缓存好的FileSystem映射,找到需要实例化的类。

例如scheme是hdfs,那么就会创建一个DistributedFileSystem。 3. 缓存

FileSystem类中有一个Cache内部类,用于缓存已经被实例化的FileSystem。注意这个跟连接池还是有区别的,Cache中的缓存只是一个map,可以被多个线程拿到。这就会有一个问题,当你多线程同时get FileSystem的时候,可能返回的是同一个对象。所以切记,在多线程场景中,不要随意调用FileSystem.close,你关的连接可能会影响到其他正在使用的线程。

注意: 当你在其他框架上拿fileSystem对象需要额外注意,例如在spark上进行 FileSystem.get(),如果你想自定义某些配置,设置hdfs的副本数(dfs.replication) 之类,你必须在configuration中关闭FileSystem的缓存机制,也就是设置

configuration.set("fs.hdfs.impl.disable.cache","true")

这很重要,因为你不确定spark是否在你之前创建了一个FileSystem,而你得到的可能不是你想要的。

 

参考资料

// 遇到的相同问题

 

转载于:https://www.cnblogs.com/ulysses-you/p/7930903.html

转载地址:https://blog.csdn.net/weixin_34341229/article/details/93371944 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:TaoBaoApI简介1
下一篇:【总结整理】职业选择

发表评论

最新留言

第一次来,支持一个
[***.219.124.196]2024年04月02日 21时06分36秒

关于作者

    喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!

推荐文章

ES6新特性_ES6函数参数的默认值设置---JavaScript_ECMAScript_ES6-ES11新特性工作笔记011 2019-04-26
ES6新特性_ES6的Rest参数---JavaScript_ECMAScript_ES6-ES11新特性工作笔记012 2019-04-26
ES6新特性_ES6扩展运算符的介绍---JavaScript_ECMAScript_ES6-ES11新特性工作笔记013 2019-04-26
ES6新特性_ES6扩展运算符的应用---JavaScript_ECMAScript_ES6-ES11新特性工作笔记014 2019-04-26
ES6新特性_ES6_Symbol的介绍与创建---JavaScript_ECMAScript_ES6-ES11新特性工作笔记015 2019-04-26
ES6新特性_ES6对象添加Symbol类型属性---JavaScript_ECMAScript_ES6-ES11新特性工作笔记016 2019-04-26
ES6新特性_Symbol的内置属性---JavaScript_ECMAScript_ES6-ES11新特性工作笔记017 2019-04-26
ES6新特性_Promise对象的catch方法---JavaScript_ECMAScript_ES6-ES11新特性工作笔记029 2019-04-26
ES6新特性_ES6集合介绍与API---JavaScript_ECMAScript_ES6-ES11新特性工作笔记030 2019-04-26
ES6新特性_ES6集合实践---JavaScript_ECMAScript_ES6-ES11新特性工作笔记031 2019-04-26
ES6新特性_ES6中Map的介绍与API---JavaScript_ECMAScript_ES6-ES11新特性工作笔记032 2019-04-26
ES6新特性_ES6语法糖_ES5中构造函数的继承---JavaScript_ECMAScript_ES6-ES11新特性工作笔记035 2019-04-26
ES6新特性_ES6语法糖-class的类继承---JavaScript_ECMAScript_ES6-ES11新特性工作笔记036 2019-04-26
ES6新特性_ES6语法糖-子类对父类方法的重写---JavaScript_ECMAScript_ES6-ES11新特性工作笔记037 2019-04-26
ES6新特性_ES6语法糖-class中的getter和setter设置---JavaScript_ECMAScript_ES6-ES11新特性工作笔记038 2019-04-26
ES6新特性_ES6的数值扩展---JavaScript_ECMAScript_ES6-ES11新特性工作笔记039 2019-04-26
编程语言_JavaScript_面试题003 2019-04-26
编程语言_JavaScript_面试题004 2019-04-26
ES6新特性_ES6的对象扩展方法---JavaScript_ECMAScript_ES6-ES11新特性工作笔记040 2019-04-26
ES6新特性_ES6模块化介绍_优势_以及产品---JavaScript_ECMAScript_ES6-ES11新特性工作笔记041 2019-04-26