HDFS读写文件BUG

在使用HDFS进行文件读写时,通过FileSystem.get(getConf())获取的实例可能来自缓存,而非每次都创建新实例。这可能导致多线程环境下文件系统的关闭问题。解决方法包括检查配置以禁用缓存或正确管理文件系统实例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  - java.io.IOException: Filesystem closed
java.io.IOException: Filesystem closed
    at org.apache.hadoop.hdfs.DFSClient.checkOpen(DFSClient.java:707)
    at org.apache.hadoop.hdfs.DFSClient.create(DFSClient.java:1448)
    at org.apache.hadoop.hdfs.DFSClient.create(DFSClient.java:1390)
    at org.apache.hadoop.hdfs.DistributedFileSystem$6.doCall(DistributedFileSystem.java:394)
    at org.apache.hadoop.hdfs.DistributedFileSystem$6.doCall(DistributedFileSystem.java:390)
    at org.apache.hadoop.fs.FileSystemLinkResolver.resolve(FileSystemLinkResolver.java:81)
    at org.apache.hadoop.hdfs.DistributedFileSystem.create(DistributedFileSystem.java:390)
    at org.apache.hadoop.hdfs.DistributedFileSystem.create(DistributedFileSystem.java:334)
    at org.apache.hadoop.fs.FileSystem.create(FileSystem.java:906)
    at org.apache.hadoop.fs.FileSystem.create(FileSystem.java:829)

    at com.run.storage.hdfs.RunHdfsImpl.uploadToHdfs(Unknown Source)



FileSystem.get(getConf())返回的可能是一个cache中的结果,它并不是每次都创建一个新的实例。这就意味着,如果每个线程都自己去get一个文件系统,然后使用,然后关闭,就会有问题。

 

/** Returns the FileSystem forthis URI's scheme and authority.  Thescheme

  * of the URI determines a configuration property name,

  * <tt>fs.<i>scheme</i>.class</tt> whose value names the FileSystem class.

  * The entire URI is passed to the FileSystem instance's initializemethod.

  */

 publicstaticFileSystem get(URI uri,Configuration conf)throwsIOException {

   String scheme= uri.getScheme();

   String authority= uri.getAuthority();

 

   if(scheme== null&& authority== null){     // use default FS

     returnget(conf);

   }

 

   if(scheme!= null&& authority== null){     // no authority

     URI defaultUri= getDefaultUri(conf);

     if(scheme.equals(defaultUri.getScheme())    // if schemematches default

          && defaultUri.getAuthority() != null) {  // &default has authority

        return get(defaultUri, conf);              // return default

     }

   }

   

   String disableCacheName= String.format("fs.%s.impl.disable.cache", scheme);

   if(conf.getBoolean(disableCacheName, false)) {

     returncreateFileSystem(uri, conf);

   }

 

   returnCACHE.get(uri, conf);

  }


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值