No lease on /目录: File does not exist. [Lease. Holder: DFSClient_NONMAPREDUCE_-2059237550_1..]错误及解决方法

  感觉程序员的世界真是一个变幻无常且精彩绝伦的世界,每次跑程序都会发现不一样的问题。今天跑MapReduce程序来统计邮箱次数时遇到了一个问题,明明一样的代码,别人能跑,我却跑不了。我相信,基本做这行的都遇到过这种问题。好了,话不多说,来聊聊今天的错误吧。

  根据日志查看到报的错误为:No lease on /目录: File does not exist. [Lease.  Holder: DFSClient_NONMAPREDUCE_-2059237550_1, pendingcreates: 8],详细信息如下面日志所示。

2018-04-02 15:05:04,669 DEBUG [org.apache.hadoop.ipc.Client] - IPC Client (2124974876) connection to ******* from Zimo sending #55
2018-04-02 15:05:04,670 DEBUG [org.apache.hadoop.ipc.Client] - IPC Client (2124974876) connection to ******* from Zimo got value #55
2018-04-02 15:05:04,671 WARN [org.apache.hadoop.hdfs.DFSClient] - DataStreamer Exception
org.apache.hadoop.ipc.RemoteException(org.apache.hadoop.hdfs.server.namenode.LeaseExpiredException): No lease on /email/out/_temporary/0/_temporary/attempt_local1331388695_0001_r_000000_0/163-r-00000: File does not exist. [Lease.  Holder: DFSClient_NONMAPREDUCE_-979457887_1, pendingcreates: 8]
    at org.apache.hadoop.hdfs.server.namenode.FSNamesystem.checkLease(FSNamesystem.java:2737)
    at org.apache.hadoop.hdfs.server.namenode.FSNamesystem.analyzeFileState(FSNamesystem.java:2543)
    at org.apache.hadoop.hdfs.server.namenode.FSNamesystem.getAdditionalBlock(FSNamesystem.java:2454)
    at org.apache.hadoop.hdfs.server.namenode.NameNodeRpcServer.addBlock(NameNodeRpcServer.java:555)
    at org.apache.hadoop.hdfs.protocolPB.ClientNamenodeProtocolServerSideTranslatorPB.addBlock(ClientNamenodeProtocolServerSideTranslatorPB.java:387)
    at org.apache.hadoop.hdfs.protocol.proto.ClientNamenodeProtocolProtos$ClientNamenodeProtocol$2.callBlockingMethod(ClientNamenodeProtocolProtos.java:59582)
    at org.apache.hadoop.ipc.ProtobufRpcEngine$Server$ProtoBufRpcInvoker.call(ProtobufRpcEngine.java:585)
    at org.apache.hadoop.ipc.RPC$Server.call(RPC.java:928)
    at org.apache.hadoop.ipc.Server$Handler$1.run(Server.java:2048)
    at org.apache.hadoop.ipc.Server$Handler$1.run(Server.java:2044)
    at java.security.AccessController.doPrivileged(Native Method)
    at javax.security.auth.Subject.doAs(Subject.java:415)
    at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1491)
    at org.apache.hadoop.ipc.Server$Handler.run(Server.java:2042)

    at org.apache.hadoop.ipc.Client.call(Client.java:1347)
    at org.apache.hadoop.ipc.Client.call(Client.java:1300)
    at org.apache.hadoop.ipc.ProtobufRpcEngine$Invoker.invoke(ProtobufRpcEngine.java:206)
    at com.sun.proxy.$Proxy9.addBlock(Unknown Source)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)
    at org.apache.hadoop.io.retry.RetryInvocationHandler.invokeMethod(RetryInvocationHandler.java:186)
    at org.apache.hadoop.io.retry.RetryInvocationHandler.invoke(RetryInvocationHandler.java:102)
    at com.sun.proxy.$Proxy9.addBlock(Unknown Source)
    at org.apache.hadoop.hdfs.protocolPB.ClientNamenodeProtocolTranslatorPB.addBlock(ClientNamenodeProtocolTranslatorPB.java:330)
    at org.apache.hadoop.hdfs.DFSOutputStream$DataStreamer.locateFollowingBlock(DFSOutputStream.java:1226)
    at org.apache.hadoop.hdfs.DFSOutputStream$DataStreamer.nextBlockOutputStream(DFSOutputStream.java:1078)
    at org.apache.hadoop.hdfs.DFSOutputStream$DataStreamer.run(DFSOutputStream.java:514)
2018-04-02 15:05:04,671 ERROR [org.apache.hadoop.hdfs.DFSClient] - Failed to close file /email/out/_temporary/0/_temporary/attempt_local1331388695_0001_r_000000_0/163-r-00000
org.apache.hadoop.ipc.RemoteException(org.apache.hadoop.hdfs.server.namenode.LeaseExpiredException): No lease on /email/out/_temporary/0/_temporary/attempt_local1331388695_0001_r_000000_0/163-r-00000: File does not exist. [Lease.  Holder: DFSClient_NONMAPREDUCE_-979457887_1, pendingcreates: 8]
    at org.apache.hadoop.hdfs.server.namenode.FSNamesystem.checkLease(FSNamesystem.java:2737)
    at org.apache.hadoop.hdfs.server.namenode.FSNamesystem.analyzeFileState(FSNamesystem.java:2543)
    at org.apache.hadoop.hdfs.server.namenode.FSNamesystem.getAdditionalBlock(FSNamesystem.java:2454)
    at org.apache.hadoop.hdfs.server.namenode.NameNodeRpcServer.addBlock(NameNodeRpcServer.java:555)
    at org.apache.hadoop.hdfs.protocolPB.ClientNamenodeProtocolServerSideTranslatorPB.addBlock(ClientNamenodeProtocolServerSideTranslatorPB.java:387)
    at org.apache.hadoop.hdfs.protocol.proto.ClientNamenodeProtocolProtos$ClientNamenodeProtocol$2.callBlockingMethod(ClientNamenodeProtocolProtos.java:59582)
    at org.apache.hadoop.ipc.ProtobufRpcEngine$Server$ProtoBufRpcInvoker.call(ProtobufRpcEngine.java:585)
    at org.apache.hadoop.ipc.RPC$Server.call(RPC.java:928)
    at org.apache.hadoop.ipc.Server$Handler$1.run(Server.java:2048)
    at org.apache.hadoop.ipc.Server$Handler$1.run(Server.java:2044)
    at java.security.AccessController.doPrivileged(Native Method)
    at javax.security.auth.Subject.doAs(Subject.java:415)
    at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1491)
    at org.apache.hadoop.ipc.Server$Handler.run(Server.java:2042)

    at org.apache.hadoop.ipc.Client.call(Client.java:1347)
    at org.apache.hadoop.ipc.Client.call(Client.java:1300)
    at org.apache.hadoop.ipc.ProtobufRpcEngine$Invoker.invoke(ProtobufRpcEngine.java:206)
    at com.sun.proxy.$Proxy9.addBlock(Unknown Source)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)
    at org.apache.hadoop.io.retry.RetryInvocationHandler.invokeMethod(RetryInvocationHandler.java:186)
    at org.apache.hadoop.io.retry.RetryInvocationHandler.invoke(RetryInvocationHandler.java:102)
    at com.sun.proxy.$Proxy9.addBlock(Unknown Source)
    at org.apache.hadoop.hdfs.protocolPB.ClientNamenodeProtocolTranslatorPB.addBlock(ClientNamenodeProtocolTranslatorPB.java:330)
    at org.apache.hadoop.hdfs.DFSOutputStream$DataStreamer.locateFollowingBlock(DFSOutputStream.java:1226)
    at org.apache.hadoop.hdfs.DFSOutputStream$DataStreamer.nextBlockOutputStream(DFSOutputStream.java:1078)
    at org.apache.hadoop.hdfs.DFSOutputStream$DataStreamer.run(DFSOutputStream.java:514)
2018-04-02 15:05:04,672 DEBUG [org.apache.hadoop.ipc.Client] - Stopping client

  在前面跑MapReduce程序的时候没有出现过这个错误,就今天遇到了。遇到这个错误时需要在Reducer代码中加上cleanup方法以重新执行。

  protected void cleanup(Context context) throws IOException,InterruptedException {
            multipleOutputs.close();
       }

  cleanup()方法会被MapReduce框架仅且执行一次,在执行完毕Map任务后,进行相关变量或资源的释放工作。若是将释放资源工作放入方法map()中,也会导致Mapper任务在解析、处理每一行文本后释放资源,而且在下一行文本解析前还要重复初始化,导致反复重复,程序运行效率不高!

  现在我们再重新运行一次程序就会发现问题已经解决了!

以上就是博主为大家介绍的这一板块的主要内容,这都是博主自己的学习过程,希望能给大家带来一定的指导作用,有用的还望大家点个支持,如果对你没用也望包涵,有错误烦请指出。如有期待可关注博主以第一时间获取更新哦,谢谢!

 版权声明:本文为博主原创文章,未经博主允许不得转载。


### HDFS 文件租约冲突解决方案 在分布式文件系统 HDFS 中,当多个客户端尝试操作同一个文件时,可能会发生文件租约(Lease)冲突的情况。这种情况下,通常是因为某个客户端已经持有该文件的写入权限,而另一个客户端试图获取相同的权限。 #### 租约机制概述 HDFS 使用租约机制来管理文件的独占写入权。每当一个客户端打开一个新文件进行写入时,NameNode 会为此分配一个租约[^1]。如果另一个客户端尝试在同一时间对该文件执行写入操作,则会发生租约冲突错误。 #### 解决方法 以下是几种可能的方法用于释放或解决租约冲突: 1. **等待超时** 如果当前持有租约的客户端断开连接或者崩溃,NameNode 将会在一段时间后自动回收此租约并将其重新分配给新的请求者。默认情况下,这个超时时间为一分钟后触发心跳检测失败后的额外两分钟延迟。 2. **强制关闭进程** 找到正在运行的应用程序实例 (即 `DFSClient` 进程),通过终止这些应用程序可以立即解除其持有的任何现有租约。可以通过命令行工具定位具体进程 ID 并结束它: ```bash jps | grep DFSClient kill -9 <PID> ``` 3. **手动干预 NameNode 日志** 对于某些特殊情况下的长期未响应的租约问题,在确认无害的前提下可以直接编辑 Namenode 的元数据存储位置 `/tmp/dfs/name/current/finalized` 下的相关信息删除对应条目从而清理掉残留状态;不过这种方法风险较高建议仅作为最后手段考虑. 4. **重启服务** 另一种简单有效的方式就是完全停止再启动整个 hadoop 集群的服务链路,这将确保所有潜在悬空资源得到适当处理. ```bash stop-dfs.sh && start-dfs.sh ``` 以上措施能够帮助缓解因不同节点间竞争同一份资源所引发的一系列连锁反应. ### 示例代码片段展示如何查询当前活动中的 Lease 列表: 利用 Java API 获取当前所有的活跃 Leases: ```java Configuration conf = new Configuration(); FileSystem fs = FileSystem.get(conf); DistributedFileSystem hdfs = (DistributedFileSystem)fs; Collection<org.apache.hadoop.hdfs.protocol.ClientProtocol.Lease> leases = hdfs.getClient().listOpenFiles(); for(org.apache.hadoop.hdfs.protocol.ClientProtocol.Lease lease :leases){ System.out.println(lease.toString()); } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值