Sau khi một số nghiên cứu tôi đến các giải pháp sau đây:
- Tôi không thực sự cần những giải pháp Kerberos đầy đủ, hiện vẫn đủ để khách hàng có thể chạy các yêu cầu HDFS từ bất kỳ người dùng. Bản thân môi trường được coi là an toàn.
- Điều này mang lại cho tôi giải pháp dựa trên lớp UserGroupInformation hadoop. Trong tương lai tôi có thể mở rộng nó để hỗ trợ Kerberos.
Mẫu mã có thể hữu ích cho những người cả cho 'giả xác thực và truy cập HDFS từ xa:
package org.myorg;
import java.security.PrivilegedExceptionAction;
import org.apache.hadoop.conf.*;
import org.apache.hadoop.security.UserGroupInformation;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.FileStatus;
public class HdfsTest {
public static void main(String args[]) {
try {
UserGroupInformation ugi
= UserGroupInformation.createRemoteUser("hbase");
ugi.doAs(new PrivilegedExceptionAction<Void>() {
public Void run() throws Exception {
Configuration conf = new Configuration();
conf.set("fs.defaultFS", "hdfs://1.2.3.4:8020/user/hbase");
conf.set("hadoop.job.ugi", "hbase");
FileSystem fs = FileSystem.get(conf);
fs.createNewFile(new Path("/user/hbase/test"));
FileStatus[] status = fs.listStatus(new Path("/user/hbase"));
for(int i=0;i<status.length;i++){
System.out.println(status[i].getPath());
}
return null;
}
});
} catch (Exception e) {
e.printStackTrace();
}
}
}
tài liệu tham khảo hữu ích cho những người có vấn đề tương tự:
- Cloudera bài đăng blog " Authorization and Authentication In Hadoop ". Ngắn gọn, tập trung vào giải thích đơn giản về các phương pháp bảo mật hadoop. Không có thông tin cụ thể cho giải pháp API Java nhưng tốt cho sự hiểu biết cơ bản về vấn đề.
UPDATE:
thay thế cho những người sử dụng dòng lệnh hdfs
hoặc hadoop
tiện ích mà không cần người dùng cục bộ cần thiết:
HADOOP_USER_NAME=hdfs hdfs fs -put /root/MyHadoop/file1.txt/
gì bạn thực sự làm là bạn đọc tập tin địa phương phù hợp với quyền địa phương của bạn, nhưng khi đặt tệp trên HDFS bạn được xác thực như người dùng hdfs
.
này được khá đặc tính tương tự để mã API minh họa:
- Bạn không cần
sudo
.
- Bạn không cần người dùng địa phương thực sự thích hợp 'hdfs'.
- Bạn không cần sao chép bất kỳ thứ gì hoặc thay đổi quyền vì các điểm trước đó.
Nguồn
2013-04-11 06:54:05
Tôi đã gặp sự cố tương tự như của bạn. Tôi đang cố gắng để gửi công việc Hadoop từ một khách hàng từ xa đến cụm sẽ thực hiện nó. Trong trường hợp của tôi, vấn đề là ** Hadoop 2.0.0 của Cloudera (Hadoop 2.0.0-cdh4.3.1) không cung cấp lớp UserGroupInformation ** mà bạn đã sử dụng.Dường như các phiên bản Apache Hadoop tương ứng cũng không cung cấp. Chỉ có một enum tên là UserGroupInformation - [link] (http://archive.cloudera.com/cdh4/cdh/4/hadoop/api/org/apache/hadoop/security/UserGroupInformation.AuthenticationMethod.html). Làm thế nào nó có thể được thực hiện trong trường hợp như vậy sau đó, theo ý kiến của bạn? – falconepl
Nó ở đó, nó không phải là cloudera. Tôi đang sử dụng máy khách hadoop 2.0.0-cdh4.3.1 ngay bây giờ. –
Bạn có ý gì khi nói nó ở đó? Tôi đã kiểm tra API Apache Hadoop 2.0.6 [[link] (http://hadoop.apache.org/docs/r2.0.6-alpha/api/index.html)] cũng như API 2.1.0 [[liên kết ] (http://hadoop.apache.org/docs/r2.1.0-beta/api/index.html)] (những Javadocs mà Apache cung cấp trên trang web của họ) và tiếc là không có lớp 'UserGroupInformation', chỉ là enum điều đó không giúp được gì nhiều. Và bằng cách này, không phải là '2.0.0-cdh4.3.1' Hadoop mà bạn đã đề cập đến bản phân phối Hadoop của Cloudera? – falconepl