2013-04-11 45 views
10

Tôi cần sử dụng cụm HDFS từ máy tính từ xa thông qua API Java. Tất cả mọi thứ hoạt động OK cho đến khi nói đến quyền truy cập ghi. Nếu tôi đang cố gắng tạo bất kỳ tập tin nào tôi nhận được ngoại lệ cho phép truy cập. Đường dẫn có vẻ tốt nhưng ngoại lệ cho biết tên người dùng máy tính để bàn từ xa của tôi mà tất nhiên không phải là thứ tôi cần để truy cập thư mục HDFS cần thiết.Truy cập HDFS từ máy chủ từ xa thông qua API Java, xác thực người dùng

Câu hỏi đặt ra là: - Có cách nào để đại diện cho tên người dùng khác nhau bằng cách sử dụng xác thực 'đơn giản' trong API Java không? - Bạn có thể vui lòng chỉ ra một số giải thích tốt về các lược đồ xác thực/ủy quyền trong hadoop/HDFS phù hợp hơn với các ví dụ Java API không?

Có, tôi đã biết 'whoami' có thể bị quá tải trong trường hợp này bằng cách sử dụng bí danh vỏ nhưng tôi thích tránh các giải pháp như thế này. Ngoài ra chi tiết cụ thể ở đây là tôi không thích sử dụng một số thủ thuật như đường ống thông qua SSH và kịch bản. Tôi muốn thực hiện mọi thứ chỉ bằng Java API. Cảm ơn bạn trước.

Trả lời

14

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:

  1. Bạn không cần sudo.
  2. Bạn không cần người dùng địa phương thực sự thích hợp 'hdfs'.
  3. 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 đó.
+0

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

+0

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ờ. –

+0

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

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