복붙노트

[HADOOP] LeaseExpiredException : HDFS에 임대 오류가 없습니다.

HADOOP

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. ==============================

    1.문제를 해결할 수있었습니다.

    문제를 해결할 수있었습니다.

    작업이 끝나면 / 데이터 / 작업 / 폴더가 삭제됩니다. 병렬로 실행되는 작업이 거의없는 경우 삭제 작업은 다른 작업의 파일도 삭제합니다. 실제로 / data / work /를 삭제해야합니다.

    즉,이 예외는 작업이 더 이상 존재하지 않는 파일에 액세스하려고하면 발생합니다.

  2. ==============================

    2.나는 같은 경로에 다른 데이터를 쓰려면 물론 MultipleTextOutputFormat을 사용하여 Hadoop (2.6.0-cdh5.7.1)에 saveAsHeadopFile을 스트리밍 할 때 동일한 문제를 만난다. Zohar가 말한 예외가 때때로 발생합니다. 그 이유는 Matiji66이 말한 것처럼입니다 :

    나는 같은 경로에 다른 데이터를 쓰려면 물론 MultipleTextOutputFormat을 사용하여 Hadoop (2.6.0-cdh5.7.1)에 saveAsHeadopFile을 스트리밍 할 때 동일한 문제를 만난다. Zohar가 말한 예외가 때때로 발생합니다. 그 이유는 Matiji66이 말한 것처럼입니다 :

    그러나 그가 이야기하지 않은 근본적인 이유는 투기 적 (hadoop speculative)이다 :

    그래서 진짜 이유는, 당신의 작업이 느린 실행, 그때 hadoop 같은 일을 (내 경우에는 hadoop에 파일에 데이터를 저장하는 것입니다) 다른 작업을 실행, 두 작업 중 하나의 작업이 완료되면, 그것은 임시 파일 및 완료 후 다른 파일은 동일한 파일을 삭제 한 다음 존재하지 않으므로 예외가 발생합니다

    일어난

    당신은 spark와 hadoop의 추측을 닫음으로써 그것을 고칠 수 있습니다 :

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

    3.필자의 경우 다른 프로그램에서이 tmp 파일을 읽고 쓰고 삭제하면이 오류가 발생합니다. 이것을 피하십시오.

    필자의 경우 다른 프로그램에서이 tmp 파일을 읽고 쓰고 삭제하면이 오류가 발생합니다. 이것을 피하십시오.

  4. ==============================

    4.근본 원인

    근본 원인

    저장소 정책이 준비 디렉토리에 설정되어 있으므로 MAPREDUCE 작업이 실패했습니다.

    <이름> yarn.app.mapreduce.am.staging-dir / user

    해결

    스토리지 정책이 설정되지 않은 준비 스테이징 디렉토리를 설정합니다. 나. yarn-site.xml의 yarn.app.mapreduce.am.staging-dir을 수정하십시오.

    <property> 
    <name>yarn.app.mapreduce.am.staging-dir</name> 
    <value>/tmp</value> 
    </property>
    
  5. ==============================

    5.나는 Sqoop을 사용하여 HDFS로 가져오고 같은 오류가 발생합니다. 이전 답변의 도움으로 --target-dir / dw / data /에서 마지막 "/"을 제거해야한다는 것을 깨달았습니다.

    나는 Sqoop을 사용하여 HDFS로 가져오고 같은 오류가 발생합니다. 이전 답변의 도움으로 --target-dir / dw / data /에서 마지막 "/"을 제거해야한다는 것을 깨달았습니다.

    --target-dir / dw / data를 사용했습니다. 잘 작동합니다.

  6. ==============================

    6.saveAsHadoopFile 메서드를 사용하여 성능을 향상시키기 위해 프로그램을 변경했을 때이 문제가 발생했습니다.이 시나리오에서는 DataFrame API를 직접 사용할 수 없습니다. 문제를 보아라.

    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]")
    

    모든 필수 종속성을 가진 단일 Class를 컴파일 한 다음 세 개의 출력 클래스 파일로 jar를 만들고 classpath에 jar를 배치합니다. (원래의 항아리 앞에서 확인하십시오)

    또는 소스 파일을 프로젝트에 간단히 넣을 수도 있습니다.

    이제 다른 시스템 속성을 설정하여 각 프로그램의 임시 디렉토리를 구성 할 수 있습니다.

    희망이 당신을 도울 수 있습니다.

  7. from https://stackoverflow.com/questions/7559880/leaseexpiredexception-no-lease-error-on-hdfs by cc-by-sa and MIT license