lease機制導致hdfs創建文件失敗

最近遇到一個有關hadoop的租賃問題,現在將其記錄下來

12716 [main] WARN  org.apache.sqoop.tool.EvalSqlTool  - SQL exception executing statement: org.postgresql.util.PSQLException: , error: Failed to CREATE_FILE /hawq_data/ExtErrTbl/36f70260-6e94-44d0-900c-9d9210eeac5e/1545749452717109 for libhdfs3_client_random_1582511411_count_2_pid_506717_tid_140176099782080 on  

because this file lease is currently owned by libhdfs3_client_random_1582511411_count_2_pid_506733_tid_140176099782080 on  (extfmtcsv.c:189)  (seg1 :40000 pid=506717)
  詳細:

	at org.apache.hadoop.hdfs.server.namenode.FSNamesystem.recoverLeaseInternal(FSNamesystem.java:3190)
	at org.apache.hadoop.hdfs.server.namenode.FSNamesystem.startFileInternal(FSNamesystem.java:2809)
	at org.apache.hadoop.hdfs.server.namenode.FSNamesystem.startFileInt(FSNamesystem.java:2698)
	at org.apache.hadoop.hdfs.server.namenode.FSNamesystem.startFile(FSNamesystem.java:2582)
	at org.apache.hadoop.hdfs.server.namenode.NameNodeRpcServer.create(NameNodeRpcServer.java:736)
	at org.apache.hadoop.hdfs.protocolPB.ClientNamenodeProtocolServerSideTranslatorPB.create(ClientNamenodeProtocolServerSideTranslatorPB.java:409)
	at org.apache.hadoop.hdfs.protocol.proto.ClientNamenodeProtocolProtos$ClientNamenodeProtocol$2.callBlockingMethod(ClientNamenodeProtocolProtos.java)
	at org.apache.hadoop.ipc.ProtobufRpcEngine$Server$ProtoBufRpcInvoker.call(ProtobufRpcEngine.java:640)
	at org.apache.hadoop.ipc.RPC$Server.call(RPC.java:982)
	at org.apache.hadoop.ipc.Server$Handler$1.run(Server.java:2351)
	at org.apache.hadoop.ipc.Server$Handler$1.run(Server.java:2347)
	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:1866)
	at org.apache.hadoop.ipc.Server$Handler.run(Server.java:2347)
 (786949)

由上面這個問題我們可以看出因爲文件被hdfs給鎖定了,導致了沒法去重新創建,從而引發了sql錯誤。它爲什麼會被租賃呢,這個就需要說道hdfs的租賃機制了lease。下面是一個大佬的解答


1.      Lease 的機制:
hdfs支持write-once-read-many,也就是說不支持並行寫,那麼對讀寫的互斥同步就是靠Lease實現的。Lease說白了就是一個有時間約束的鎖。客戶端寫文件時需要先申請一個Lease,對應到namenode中的LeaseManager,客戶端的client name就作爲一個lease的holder,即租約持有者。LeaseManager維護了文件的path與lease的對應關係,還有clientname->lease的對應關係。LeaseManager中有兩個時間限制:softLimitand hardLimit。

軟限制就是寫文件時規定的租約超時時間,硬限制則是考慮到文件close時未來得及釋放lease的情況強制回收租約。
LeaseManager中還有一個Monitor線程來檢測Lease是否超過hardLimit。而軟租約的超時檢測則在DFSClient的LeaseChecker中進行。
當客戶端(DFSClient)create一個文件的時候,會通過RPC 調用 namenode 的createFile方法來創建文件。進而又調用FSNameSystem的startFile方法,又調用 LeaseManager 的addLease方法爲新創建的文件添加一個lease。如果lease已存在,則更新該lease的lastUpdate (最近更新時間)值,並將該文件的path對應該lease上。之後DFSClient 將該文件的path 添加 LeaseChecker中。文件創建成功後,守護線程LeaseChecker會每隔一定時間間隔renew該DFSClient所擁有的lease。

LeaseManagement是HDFS中的一個同步機制,用於保證同一時刻只有一個client對一個文件進行寫或創建操作。如當 新建一個文件f時,client向NameNode發起一個create請求,那麼leaseManager會想該client分配一個f文件的 lease。client憑藉該lease完成文件的創建操作。此時其他client無法獲得f的當client長時間(默認爲超過1min)不進行操作 時,發放的lease將被收回。

最後解決辦法 

我們只需要將軟超時默認時間由原來的一分鐘縮短就行了,當dfs客戶端只要一分鐘內沒有操作就收回lease鎖

hdfs.regionserver.lease.period=60000默認值 60000ms

 

參考地址:http://www.aboutyun.com/thread-17620-1-1.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章