LeaseExpiredException: Ошибка аренды в HDFS
Я пытаюсь загрузить большие данные в HDFS, и иногда получаю ошибку ниже. любая идея, почему?
Ошибка:
org.apache.hadoop.ipc.RemoteException: org.apache.hadoop.hdfs.server.namenode.LeaseExpiredException: No lease on /data/work/20110926-134514/_temporary/_attempt_201109110407_0167_r_000026_0/hbase/site=3815120/day=20110925/107-107-3815120-20110926-134514-r-00026 File does not exist. Holder DFSClient_attempt_201109110407_0167_r_000026_0 does not have any open files.
at org.apache.hadoop.hdfs.server.namenode.FSNamesystem.checkLease(FSNamesystem.java:1557)
at org.apache.hadoop.hdfs.server.namenode.FSNamesystem.checkLease(FSNamesystem.java:1548)
at org.apache.hadoop.hdfs.server.namenode.FSNamesystem.completeFileInternal(FSNamesystem.java:1603)
at org.apache.hadoop.hdfs.server.namenode.FSNamesystem.completeFile(FSNamesystem.java:1591)
at org.apache.hadoop.hdfs.server.namenode.NameNode.complete(NameNode.java:675)
at sun.reflect.GeneratedMethodAccessor16.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at org.apache.hadoop.ipc.RPC$Server.call(RPC.java:557)
at org.apache.hadoop.ipc.Server$Handler$1.run(Server.java:1434)
at org.apache.hadoop.ipc.Server$Handler$1.run(Server.java:1430)
at java.security.AccessController.doPrivileged(Native Method)
at javax.security.auth.Subject.doAs(Subject.java:396)
at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1127)
at org.apache.hadoop.ipc.Server$Handler.run(Server.java:1428)
at org.apache.hadoop.ipc.Client.call(Client.java:1107)
at org.apache.hadoop.ipc.RPC$Invoker.invoke(RPC.java:226)
at $Proxy1.complete(Unknown Source)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at org.apache.hadoop.io.retry.RetryInvocationHandler.invokeMethod(RetryInvocationHandler.java:82)
at org.apache.hadoop.io.retry.RetryInvocationHandler.invoke(RetryInvocationHandler.java:59)
at $Proxy1.complete(Unknown Source)
at org.apache.hadoop.hdfs.DFSClient$DFSOutputStream.closeInternal(DFSClient.java:3566)
at org.apache.hadoop.hdfs.DFSClient$DFSOutputStream.close(DFSClient.java:3481)
at org.apache.hadoop.fs.FSDataOutputStream$PositionCache.close(FSDataOutputStream.java:61)
at org.apache.hadoop.fs.FSDataOutputStream.close(FSDataOutputStream.java:86)
at org.apache.hadoop.io.SequenceFile$Writer.close(SequenceFile.java:966)
at org.apache.hadoop.io.SequenceFile$BlockCompressWriter.close(SequenceFile.java:1297)
at org.apache.hadoop.mapreduce.lib.output.SequenceFileOutputFormat$1.close(SequenceFileOutputFormat.java:78)
at org.apache.hadoop.mapreduce.lib.output.MultipleOutputs$RecordWriterWithCounter.close(MultipleOutputs.java:303)
at org.apache.hadoop.mapreduce.lib.output.MultipleOutputs.close(MultipleOutputs.java:456)
at com.my.hadoop.platform.sortmerger.MergeSortHBaseReducer.cleanup(MergeSortHBaseReducer.java:145)
at org.apache.hadoop.mapreduce.Reducer.run(Reducer.java:178)
at org.apache.hadoop.mapred.ReduceTask.runNewReducer(ReduceTask.java:572)
at org.apache.hadoop.mapred.ReduceTask.run(ReduceTask.java:414)
at org.apache.hadoop.mapred.Child$4.run(Child.java:270)
at java.security.AccessController.doPrivileged(Native Method)
at javax.security.auth.Subject.doAs(Subject.java:396)
at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1127)
at org.apache.hadoop.mapred.Child.main(Child.java:264)
Ответы
Ответ 1
Мне удалось решить проблему:
Когда задание заканчивается, он удаляет /data/work/folder. Если несколько заданий выполняются параллельно, удаление также удалит файлы другого задания. на самом деле мне нужно удалить /data/work/.
Другими словами, это исключение возникает, когда задание пытается получить доступ к файлам, которые больше не существуют
Ответ 2
В моем случае другая программа считывает, записывает и удаляет этот файл tmp, вызывая эту ошибку.
Старайтесь избегать этого.
Ответ 3
КОРИЧНАЯ ПРИЧИНА
Политика хранения была установлена в промежуточном каталоге, и, следовательно, задание MAPREDUCE не удалось.
<property>
<name>yarn.app.mapreduce.am.staging-dir</name>
<value>/user</value>
</property>
Решение
Установочный каталог установки, для которого политика хранения не настроена. То есть Измените yarn.app.mapreduce.am.staging-dir в файле yarn-site.xml
<property>
<name>yarn.app.mapreduce.am.staging-dir</name>
<value>/tmp</value>
</property>
Ответ 4
Я использую Sqoop для импорта в HDFS и с той же ошибкой. С помощью предыдущих ответов я понял, что мне нужно удалить последний "/" из
--target-dir /dw/data/
Я использовал
--target-dir /dw/data
отлично работает
Ответ 5
Я столкнулся с этой проблемой, когда я изменил свою программу, чтобы использовать метод saveAsHadoopFile для повышения производительности, в котором я не могу напрямую использовать API DataFrame. см. проблему
Причина, по которой это произойдет, - это в основном то, что Zohar сказал, что метод saveAsHadoopFile с MultipleTextOutputFormat фактически не позволяет нескольким программам одновременно работать, чтобы сохранять файлы в тот же каталог, Как только программа закончится, она удалит общий каталог _temporary, который все еще нужен, я не уверен, что это ошибка в M/R API. (2.6.0-cdh5.12.1)
Вы можете попробовать это решение ниже, если вы не можете перепроектировать вашу программу:
Это исходный код FileOutputCommitter в M/R API: (вы должны загрузить соответствующую версию)
package org.apache.hadoop.mapreduce.lib.output;
public class FileOutputCommitter extends OutputCommitter {
private static final Log LOG = LogFactory.getLog(FileOutputCommitter.class);
/**
* Name of directory where pending data is placed. Data that has not been
* committed yet.
*/
public static final String PENDING_DIR_NAME = "_temporary";
Изменения:
"_temporary"
To:
System.getProperty("[the property name you like]")
Компилирует один класс со всеми необходимыми зависимостями, затем создает банку с тремя файлами выходных классов и помещает jar в ваш путь к классам. (сделайте это перед оригинальной банкой)
Или вы можете просто поместить исходный файл в свой проект.
Теперь вы можете настроить каталог temp для каждой программы, установив другое системное свойство.
Надеюсь, это поможет вам.