Yuexin Zhang created FLUME-3190:
-----------------------------------
Summary: flume shutdown hook issue when both hbase and hdfs sink
are in use
Key: FLUME-3190
URL: https://issues.apache.org/jira/browse/FLUME-3190
Project: Flume
Issue Type: Bug
Affects Versions: 1.6.0
Reporter: Yuexin Zhang
Priority: Major
When both hdfs and hbase sink are in use, during shutdown (KILL SIGTERM), the
hdfs sink won't be able to rename/close the .tmp hdfs file because the
underlying filesystem could be closed earlier when shutting down the other
component:
{code:java}
2017/10/23 15:34:50,858 ERROR (AbstractHDFSWriter.hflushOrSync:268) - Error
while trying to hflushOrSync!
2017/10/23 15:34:50,859 WARN (BucketWriter.close:400) - failed to close()
HDFSWriter for file (/tmp/bothSource/FlumeData.1508744083526.tmp). Exception
follows.
java.io.IOException: Filesystem closed
at org.apache.hadoop.hdfs.DFSClient.checkOpen(DFSClient.java:860)
at
org.apache.hadoop.hdfs.DFSOutputStream.flushOrSync(DFSOutputStream.java:2388)
at
org.apache.hadoop.hdfs.DFSOutputStream.hflush(DFSOutputStream.java:2334)
at
org.apache.hadoop.fs.FSDataOutputStream.hflush(FSDataOutputStream.java:130)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at
org.apache.flume.sink.hdfs.AbstractHDFSWriter.hflushOrSync(AbstractHDFSWriter.java:265)
at
org.apache.flume.sink.hdfs.HDFSDataStream.close(HDFSDataStream.java:134)
at org.apache.flume.sink.hdfs.BucketWriter$3.call(BucketWriter.java:327)
at org.apache.flume.sink.hdfs.BucketWriter$3.call(BucketWriter.java:323)
at
org.apache.flume.sink.hdfs.BucketWriter$9$1.run(BucketWriter.java:701)
at
org.apache.flume.auth.SimpleAuthenticator.execute(SimpleAuthenticator.java:50)
at org.apache.flume.sink.hdfs.BucketWriter$9.call(BucketWriter.java:698)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
at
java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at
java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at java.lang.Thread.run(Thread.java:745)
{code}
the root cause is HBase client's DynamicClassLoader injection (See
DynamicClassLoader.java in HBase). HBase added a feature at some point to load
JARs from HDFS dynamically into its class loader, and to do this it loads a
DistributedFileSystem object via the standard FileSystem.get(…) / equivalent
call.
Flume, OTOH, in its HDFS BucketWriter, uses FileSystem.get(…) too (all a single
instance, coming from the cache), but supplies an instruction that disables
automatic-close at shutdown (Look for fs.automatic.close in BucketWriter.java).
When HBase sink is active, HBase shares the FileSystem object indirectly for
its internal/implicit DynamicClassLoader object, but this is grabbed from the
cache without specifying 'do not auto-close at shutdown' cause HBase is not
really troubled by that. However, since the same FileSystem object instance is
now shared by something that wants it to auto-close and something that does
not, the shutdown causes a problem in Flume.
--
This message was sent by Atlassian JIRA
(v6.4.14#64029)