hdfs写文件报错java.io.IOException: Filesystem closed

创建文件系统实例的时候使用下面:

 FileSystem  fs=FileSystem.newInstance(conf);

而不是用:fs = FileSystem.get(conf);

参考:https://blog.csdn.net/qiumengkai/article/details/48682143

参考:http://itxw.net/article/140.html

FileSystem get和newInstance区别

查看得到得源码:

<span style="color:#333333">public static FileSystem get(URI uri,Configuration conf)抛出IOException {
    String scheme = uri.getScheme();
    String authority = uri.getAuthority();
    if(scheme == null && authority == null){//使用默认FS
      //根据fs.defaultFS的值获取文件系统,若未设置该参数则根据文件:///返回文件系统
      return get(conf);
    }
    if(scheme!= null && authority == null){//无权限
      //根据fs.defaultFS的值创建URI,若未设置则使用文件:///创建URI
      URI defaultUri = getDefaultUri(con​​f);
      if(scheme.equals(defaultUri.getScheme())//如果scheme匹配default
          && defaultUri.getAuthority()!= null){//&default具有权限
        return get(defaultUri,conf); //返回默认值
      }
    }
    String disableCacheName = String.format(“fs。%s.impl.disable.cache”,scheme);
    if(conf.getBoolean(disableCacheName,false)){
      //根据URI和的conf创建文件系统
      return createFileSystem(uri,conf);
}
//若未设置缓存参数为真,则默认从CACHE中获取文件系统对象
    返回CACHE.get(uri,conf);
}</span>

总结:

从上面的代码可以得知,获得方法不是每次都创建文件系统对象,会从缓存中获取文件系统对象,而的newInstance方法则会每次都创建新对象。所以在使用该对象的API编程时,推荐使用获得方法。

 

注意:用得不能关闭,否则多线程报错(所以我用静态的),而用的newInstance必须每次接近。

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值