2011-09-26 16 views
12

Tôi đang cố tải dữ liệu lớn vào HDFS và đôi khi tôi gặp lỗi bên dưới. bất kỳ ý tưởng tại sao?LeaseExpiredException: Không có lỗi cho thuê trên HDFS

Lỗi:

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) 
+0

Bạn đang cố gắng tải dữ liệu như thế nào? – CanSpice

+0

với M/R và MultipleOutputs – zohar

+0

Bạn có thể đăng ngoại lệ trong các tệp nhật ký (tên người và các tệp khác) không? –

Trả lời

11

tôi quản lý để khắc phục vấn đề:

Khi công việc kết thúc, ông xóa/dữ liệu/công việc/thư mục. Nếu ít công việc đang chạy song song việc xóa cũng sẽ xóa các tệp của công việc khác. thực sự tôi cần xóa/data/work /.

Nói cách khác ngoại lệ này được ném khi công việc cố gắng truy cập vào các tập tin mà không tồn tại nữa

+0

Bạn đã xoay xở để khắc phục sự cố như thế nào? Bằng cách đặt hive.exec.parallel = false? Ha, có lẽ bạn không sử dụng Hive? –

+0

cách bạn sửa lỗi này? –

+1

Tôi đã thay đổi thiết kế MR của tôi. Tôi không xóa bản chính. – zohar

0

ROOT NGUYÊN NHÂN

chính sách lưu trữ được đặt trên dàn dựng thư mục và do đó việc MapReduce thất bại.

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

GIẢI

thư mục cài đặt dàn mà chính sách lưu trữ không được thiết lập. I E. sửa đổi yarn.app.mapreduce.am.staging-dir trong yarn-site.xml

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

Đối với trường hợp của tôi, một chương trình khác đọc, ghi và xóa tệp tmp này gây ra lỗi này. Cố gắng tránh điều này.

0

Tôi sử dụng Sqoop để nhập vào HDFS và có cùng lỗi. Bằng sự giúp đỡ của câu trả lời trước tôi đã nhận ra rằng tôi cần thiết để loại bỏ cuối cùng "/" từ

--target-dir /dw/data/

tôi đã sử dụng

--target-dir /dw/data
hoạt động tốt

0

tôi gặp phải vấn đề này khi tôi đã thay đổi chương trình của tôi sử dụng phương pháp saveAsHadoopFile để cải thiện hiệu suất , trong trường hợp đó, tôi không thể sử dụng API DataFrame trực tiếp. see the problem

Lý do tại sao điều này xảy ra về cơ bản là những gì Zohar cho biết, phương thức saveAsHadoopFile với MultipleTextOutputFormat thực sự không cho phép nhiều chương trình chạy đồng thời để lưu tệp vào cùng một thư mục. Khi chương trình kết thúc, nó sẽ xóa thư mục _temporary phổ biến mà những người khác vẫn cần, tôi không chắc đó có phải là lỗi trong API M/R hay không. (2.6.0-cdh5.12.1)

Bạn có thể thử giải pháp dưới đây nếu bạn không thể thiết kế lại chương trình của bạn:

Đây là mã nguồn của FileOutputCommitter trong M API/R: (bạn phải tải về một phiên bản theo)

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"; 

Thay đổi:

"_temporary" 

Để:

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

Soạn một lớp với tất cả các phụ thuộc bắt buộc, sau đó tạo một cái bình với ba tệp lớp đầu ra và đặt bình cho bạn classpath.(làm cho nó trước khi bình gốc)

Hoặc, bạn có thể chỉ cần đặt tệp nguồn vào dự án của mình.

Bây giờ, bạn có thể định cấu hình thư mục tạm thời cho từng chương trình bằng cách đặt thuộc tính hệ thống khác.

Hy vọng nó có thể giúp bạn.

Các vấn đề liên quan