问题:在读取多个文件的时候,发现有一些图片不能显示的,并且每次不能显示的图片都不一样,但是又没有报错,最后debug的时候发现,是Filesystem被关闭了。在多个线程获取文件的时候,有些线程获取完后就关闭了Filesystem,但是其他线程还没有获取完文件,所以就出现了有些图片不能显示的问题。
解决:在网上查询到也有人遇到这个问题,虽然原因不大一样,但是解决方法是一样的,就是在获取Filesystem对象的时候加上下面的配置就可以了
完整获取对象方法conf.setBoolean("fs.hdfs.impl.disable.cache", true)
原理:FileSytem类内部有一个static CACHE,用来保存每种文件系统的实例集合,FileSystem类中可以通过”fs.%s.impl.disable.cache”来指定是否缓存FileSystem实例(其中%s替换为相应的scheme,比如hdfs、local、s3、s3n等),即一旦创建了相应的FileSystem实例,这个实例将会保存在缓存中,此后每次get都会获取同一个实例。所以设为true以后,就能解决上面的异常。
参考连接:https://blog.csdn.net/bitcarmanlee/article/details/68488616
网友评论