복붙노트

[HADOOP] 원격 호스트에서 Java API, 사용자 인증을 통한 HDFS 액세스

HADOOP

원격 호스트에서 Java API, 사용자 인증을 통한 HDFS 액세스

원격 데스크톱에서 Java API를 통해 HDFS 클러스터를 사용해야합니다. 쓰기 액세스에 이르기까지 모든 것이 정상적으로 작동합니다. 파일을 만들려고하면 액세스 권한 예외가 발생합니다. 경로는 좋아 보이지만 예외는 필자가 필요한 HDFS 디렉토리에 액세스하는 데 필요한 원격 데스크톱 사용자 이름을 나타냅니다.

질문은 ~이야: - Java API에서 '간단한'인증을 사용하여 다른 사용자 이름을 나타내는 방법이 있습니까? - Java API 예제와 함께 hadoop / HDFS의 인증 / 권한 부여 스키마에 대한 좋은 설명이 바람직할까요?

예, 이미 'Whoami'가 쉘 별칭을 사용하여이 경우에 오버로드 될 수 있지만이 같은 솔루션은 피하는 것이 좋습니다. 또한 여기서 구체적인 것은 SSH와 스크립트를 통한 파이프와 같은 몇 가지 트릭의 사용법을 싫어한다는 것입니다. Java API만으로 모든 것을 수행하고 싶습니다. 미리 감사드립니다.

해결법

  1. ==============================

    1.몇 가지 연구를 마친 후 다음 해결책을 찾았습니다.

    몇 가지 연구를 마친 후 다음 해결책을 찾았습니다.

    샘플 코드는 '가짜 인증'과 원격 HDFS 액세스 모두에 유용 할 것입니다.

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

    유사한 문제가있는 사람들을위한 유용한 참고서 :

    최신 정보: 로컬 사용자없이 명령 줄 hdfs 또는 hadoop 유틸리티를 사용하는 사람들을위한 대안 :

     HADOOP_USER_NAME=hdfs hdfs fs -put /root/MyHadoop/file1.txt /
    

    실제로하는 일은 로컬 권한에 따라 로컬 파일을 읽는 것이지만 HDFS에 파일을 배치하면 사용자 hdfs처럼 인증됩니다.

    이는 그림과 같은 API 코드와 매우 유사한 속성을가집니다.

  2. from https://stackoverflow.com/questions/15941108/hdfs-access-from-remote-host-through-java-api-user-authentication by cc-by-sa and MIT license