2013-05-27 38 views
9

Tôi đang hạnh phúc kết nối với HDFS và niêm yết thư mục chính của tôi:HDFS từ Java - Xác định tài

Configuration conf = new Configuration(); 
conf.set("fs.defaultFS", "hdfs://hadoop:8020"); 
conf.set("fs.hdfs.impl", "org.apache.hadoop.hdfs.DistributedFileSystem"); 
FileSystem fs = FileSystem.get(conf); 
RemoteIterator<LocatedFileStatus> ri = fs.listFiles(fs.getHomeDirectory(), false); 
while (ri.hasNext()) { 
    LocatedFileStatus lfs = ri.next(); 
    log.debug(lfs.getPath().toString()); 
} 
fs.close(); 

Những gì tôi đang muốn làm bây giờ mặc dù được kết nối như một người dùng cụ thể (không phải là người sử dụng whois). Có ai biết cách bạn chỉ định người dùng nào bạn kết nối không?

+0

hi tôi đã cố gắng mã này để kết nối với một HDFS dụ từ xa nhưng tôi nhận được ngoại lệ trong chủ đề "chính" java.lang.UnsupportedOperationException: Không thực hiện bởi việc thực hiện DistributedFileSystem FileSystem – AbtPst

+0

bạn có biết làm thế nào để giải quyết này? – AbtPst

+0

Tôi đã hỏi câu hỏi này cách đây hơn 2 năm. Hadoop đã di chuyển một chặng đường dài kể từ đó. Theo như việc triển khai chính xác, mọi thứ hoàn toàn có thể được thực hiện theo một cách khác. – Kong

Trả lời

22

Ngay sau khi tôi thấy điều này được thực hiện thông qua các lớp UserGroupInformationPrivilegedAction hoặc PrivilegedExceptionAction. Đây là mẫu mã để kết nối với từ xa HDFS 'như' người dùng khác nhau ('HBase' trong trường hợp này). Hy vọng điều này sẽ giải quyết nhiệm vụ của bạn. Trong trường hợp bạn cần chương trình đầy đủ với xác thực bạn cần phải cải thiện xử lý người dùng. Nhưng đối với chương trình xác thực SIMPLE (thực sự không có xác thực) nó hoạt động tốt.

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(); 
     } 
    } 
} 
+0

Tôi đã tìm kiếm cài đặt thông số cấu hình hadoop và tôi không nhận được bất kỳ giải thích hữu ích nào. Có phải hbase có nghĩa là người dùng trong conf.set. Tôi có thể nhận được tất cả các giải thích về lớp học của lớp học không chỉ ở các lớp học có sẵn. Bất kỳ liên kết xin vui lòng? –

+1

'org.apache.hadoop.security.UserGroupInformation' là lớp khóa ở đây và nó cho phép chỉ định 'người dùng từ xa' thông qua' createRemoteUser() '. Vì vậy, cụm Hadoop thấy bạn là người dùng bạn đã chỉ định không phụ thuộc vào người dùng cục bộ của bạn. Tất nhiên điều này chỉ hoạt động nếu cụm Hadoop của bạn tin tưởng bạn (xác thực SIMPLE, thực sự không có). Với Kerberous, bạn sẽ cần phải cung cấp bằng chứng. –

+0

Tôi đã thử điều này nhưng tôi nhận được java.lang.UnsupportedOperationException: Không được triển khai thực hiện bởi DistributedFileSystem FileSystem – AbtPst

0

Nếu tôi nhận được chính xác, tất cả những gì bạn muốn là nhận thư mục chính của người dùng nếu chỉ định và không phải là người dùng whois.

Trong tệp cấu hình, hãy đặt thuộc tính homedir của bạn cho người dùng/$ {user.name}. Đảm bảo bạn có thuộc tính hệ thống có tên là user.name

Điều này đã hiệu quả trong trường hợp của tôi.

Tôi hy vọng đây là những gì bạn muốn làm, Nếu không thêm nhận xét.

+0

Tôi thực sự muốn duyệt toàn bộ hệ thống tệp HDFS, giống như những gì Hue làm. tức là người dùng hdfs. – Kong