Hive DFSclient

来源:互联网 发布:python createelement 编辑:程序博客网 时间:2024/06/01 20:14

最近写hive的UDF,由于在UDF中操作了HDFS,测试jar包一直是正常的,但一到集群的hive环境中去测试就包错

java.io.IOException: Filesystem closedat org.apache.hadoop.hdfs.DFSClient.checkOpen(DFSClient.java:272)at org.apache.hadoop.hdfs.DFSClient.access$900(DFSClient.java:71)at org.apache.hadoop.hdfs.DFSClient$DFSInputStream.close(DFSClient.java:2085)at java.io.FilterInputStream.close(FilterInputStream.java:155)at org.apache.hadoop.io.compress.DecompressorStream.close(DecompressorStream.java:144)at com.hadoop.compression.lzo.LzopCodec$LzopInputStream.close(LzopCodec.java:413)at org.apache.hadoop.util.LineReader.close(LineReader.java:145)at com.hadoop.mapred.DeprecatedLzoLineRecordReader.close(DeprecatedLzoLineRecordReader.java:109)at org.apache.hadoop.hive.ql.io.CombineHiveRecordReader.doClose(CombineHiveRecordReader.java:74)at org.apache.hadoop.hive.ql.io.HiveContextAwareRecordReader.close(HiveContextAwareRecordReader.java:55)at org.apache.hadoop.hive.shims.Hadoop20SShims$CombineFileRecordReader.close(Hadoop20SShims.java:234)at org.apache.hadoop.mapred.MapTask$TrackedRecordReader.close(MapT
在网上找了不少资料,最终在一个国外的论证的一个贴着中找到答案
本人的代码中用到:
FileSystem.get(conf);
https://issues.apache.org/jira/browse/HDFS-925
大概意思是调用FileSystem.get(conf);时,程序会共享DFSClient,这样多线程间共享Filesystem,当Filesystem打开时被一个线程获取,而这个线程中Filesystem还在用的时候,另一个线程就把Filesystem给关闭了。调用.FileSystem.newInstance(conf);则不会出现这样的问题,每次都重新实例化一个Filesystem。
解决方案:将FileSystem.get(conf);换成FileSystem.newInstance(conf)即可。