Arnaud Linz created HIVE-24507:
----------------------------------
Summary: "File file:XXX.jar does not exist" when changing content
of "hive.reloadable.aux.jars.path" directory content
Key: HIVE-24507
URL: https://issues.apache.org/jira/browse/HIVE-24507
Project: Hive
Issue Type: Bug
Components: HiveServer2
Affects Versions: 2.1.1
Reporter: Arnaud Linz
Purpose of hive.reloadable.aux.jars.path, introduced by
https://issues.apache.org/jira/browse/HIVE-7553 was do avoid scheduling
maintenance window for every jar change, but it is not enough.
On a large system, the lack of atomicity between the directory listing of jars
contained in hive.reloadable.aux.jars.path and the actual use of the file when
uploaded to the job's yarn resources lead to query failures, even if no jar/UDF
is used in the failing query (because it is a global parameter).
Stack trace sample:
{code:java}
File file:/XXX.jar does not exist at
org.apache.hadoop.fs.RawLocalFileSystem.deprecatedGetFileStatus(RawLocalFileSystem.java:641)
at
org.apache.hadoop.fs.RawLocalFileSystem.getFileLinkStatusInternal(RawLocalFileSystem.java:867)
at
org.apache.hadoop.fs.RawLocalFileSystem.getFileStatus(RawLocalFileSystem.java:631)
at
org.apache.hadoop.fs.FilterFileSystem.getFileStatus(FilterFileSystem.java:442)
at org.apache.hadoop.fs.FileUtil.copy(FileUtil.java:378) at
org.apache.hadoop.fs.FileUtil.copy(FileUtil.java:329) at
org.apache.hadoop.mapreduce.JobResourceUploader.copyRemoteFiles(JobResourceUploader.java:703)
at
org.apache.hadoop.mapreduce.JobResourceUploader.uploadLibJars(JobResourceUploader.java:315)
at
org.apache.hadoop.mapreduce.JobResourceUploader.uploadResourcesInternal(JobResourceUploader.java:207)
at
org.apache.hadoop.mapreduce.JobResourceUploader.uploadResources(JobResourceUploader.java:135)
at
org.apache.hadoop.mapreduce.JobSubmitter.copyAndConfigureFiles(JobSubmitter.java:99)
at
org.apache.hadoop.mapreduce.JobSubmitter.submitJobInternal(JobSubmitter.java:194)
at org.apache.hadoop.mapreduce.Job$11.run(Job.java:1570) at
org.apache.hadoop.mapreduce.Job$11.run(Job.java:1567) at
java.security.AccessController.doPrivileged(Native Method) at
javax.security.auth.Subject.doAs(Subject.java:422) at
org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1875)
at org.apache.hadoop.mapreduce.Job.submit(Job.java:1567) at
org.apache.hadoop.mapred.JobClient$1.run(JobClient.java:576) at
org.apache.hadoop.mapred.JobClient$1.run(JobClient.java:571) at
java.security.AccessController.doPrivileged(Native Method) at
javax.security.auth.Subject.doAs(Subject.java:422) at
org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1875)
at org.apache.hadoop.mapred.JobClient.submitJobInternal(JobClient.java:571)
at org.apache.hadoop.mapred.JobClient.submitJob(JobClient.java:562) at
org.apache.hadoop.hive.ql.exec.mr.ExecDriver.execute(ExecDriver.java:444) at
org.apache.hadoop.hive.ql.exec.mr.MapRedTask.execute(MapRedTask.java:151) at
org.apache.hadoop.hive.ql.exec.Task.executeTask(Task.java:199) at
org.apache.hadoop.hive.ql.exec.TaskRunner.runSequential(TaskRunner.java:97)
at org.apache.hadoop.hive.ql.Driver.launchTask(Driver.java:2200) at
org.apache.hadoop.hive.ql.Driver.execute(Driver.java:1843) at
org.apache.hadoop.hive.ql.Driver.runInternal(Driver.java:1563) at
org.apache.hadoop.hive.ql.Driver.run(Driver.java:1339) at
org.apache.hadoop.hive.ql.Driver.run(Driver.java:1334) at
org.apache.hive.service.cli.operation.SQLOperation.runQuery(SQLOperation.java:256)
at
org.apache.hive.service.cli.operation.SQLOperation.access$600(SQLOperation.java:92)
at
org.apache.hive.service.cli.operation.SQLOperation$BackgroundWork$1.run(SQLOperation.java:345)
at java.security.AccessController.doPrivileged(Native Method) at
javax.security.auth.Subject.doAs(Subject.java:422) at
org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1875)
at
org.apache.hive.service.cli.operation.SQLOperation$BackgroundWork.run(SQLOperation.java:357)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
at java.util.concurrent.FutureTask.run(FutureTask.java:266) at
java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
at
java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
at java.lang.Thread.run(Thread.java:748){code}
It's probably not possible to achieve atomicity, but this lack of atomicity
should be taken into account and this error should be a warning. Actually, if a
jar is removed, it's probably because no query are using it any longer. And if
it was really used, it will trigger another ClassNotFound error later that,
with the warning log, can suffice.
--
This message was sent by Atlassian Jira
(v8.3.4#803005)