web-dev-qa-db-ja.com

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)
27
zohar

私は問題を解決することができました:

ジョブが終了すると、彼は/ data/work /フォルダーを削除します。並行して実行されているジョブがほとんどない場合、削除によって別のジョブのファイルも削除されます。実際に/ data/work /を削除する必要があります。

つまり、ジョブがもう存在しないファイルにアクセスしようとすると、この例外がスローされます

14
zohar

sparkを使用してsaveAsHadoopFileをHadoop(2.6.0-cdh5.7.1)にストリーミングします。もちろん、MultipleTextOutputFormatを使用して異なるデータを異なるパスに書き込むと、同じ問題が発生します。 Zohar は起こると言われた。理由は Matiji66 と言う:

別のプログラムがこのtmpファイルを読み取り、書き込み、削除すると、このエラーが発生します。

しかし、彼が話をしなかった根本的な理由はハドープ投機的です:

Hadoopは、実行速度の遅いタスクを診断して修正しようとするのではなく、代わりにそれらを検出してバックアップタスクを実行しようとします。

だから本当に理由は、タスクの実行が遅く、hadoopが同じことをするために別のタスクを実行することです(私の場合はhadoop上のファイルにデータを保存することです)、2つのタスクの1つのタスクが終了すると、一時ファイル、および終了後のもう一方は、同じファイルを削除しますが、存在しないため、例外

開いているファイルはありません

起こりました

sparkとhadoopの投機を閉じることで修正できます:

sparkConf.set("spark.speculation", "false");
sparkConf.set("spark.hadoop.mapreduce.map.speculative", "false");
sparkConf.set("spark.hadoop.mapreduce.reduce.speculative", "false")
5
littleq

私の場合、別のプログラムがこのtmpファイルを読み取り、書き込み、削除すると、このエラーが発生します。これを避けるようにしてください。

1
Matiji66

Sqoopを使用してHDFSにインポートすると、同じエラーが発生します。以前の回答の助けによって、私は最後の「/」を削除する必要があることに気づきました

--target-dir/dw/data /

使った

--target-dir/dw/data
0
Erkan Şirin

パフォーマンスを向上させるためにsaveAsHadoopFileメソッドを使用するようにプログラムを変更したときに、この問題が発生しました。このシナリオでは、DataFrame APIを直接使用できません。 問題を参照

これが発生する理由は、基本的に Zohar が言ったことです。MultipleTextOutputFormatを指定したsaveAsHadoopFileメソッドでは、複数のプログラムを同時に実行してファイルを同じディレクトリに保存できません。プログラムが終了すると、他の人がまだ必要とする共通の_temporaryディレクトリが削除されますが、M/R APIのバグかどうかはわかりません。 ( 2.6.0-cdh5.12.1

プログラムを再設計できない場合は、以下のソリューションを試すことができます:

これは、M/R APIのFileOutputCommitterのソースコードです(対応するバージョンをダウンロードする必要があります)。

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"

に:

System.getProperty("[the property name you like]")

必要なすべての依存関係で単一のクラスをコンパイルし、3つの出力クラスファイルでjarを作成し、jarをクラスパスに配置します。 (元のjarの前に作成します)

または、単純にソースファイルをプロジェクトに配置できます。

これで、異なるシステムプロパティを設定して、プログラムごとに一時ディレクトリを構成できます。

それがあなたを助けることを願っています。

0
fancige

根本的な原因

ストレージポリシーがステージングディレクトリに設定されているため、MAPREDUCEジョブが失敗しました。

<property> <name>yarn.app.mapreduce.am.staging-dir</name> <value>/user</value> </property>

解決

ストレージポリシーがセットアップされていないステージングディレクトリをセットアップします。つまりyarn-site.xmlのyarn.app.mapreduce.am.staging-dirを変更します

<property> 
<name>yarn.app.mapreduce.am.staging-dir</name> 
<value>/tmp</value> 
</property>
0
user1989252