복붙노트

[HADOOP] Java webapp에 내장 된 클라이언트에 대해 hadoop 시스템 사용자 설정

HADOOP

Java webapp에 내장 된 클라이언트에 대해 hadoop 시스템 사용자 설정

java 웹 애플리케이션의 MapReduce 작업을 원격 Hadoop 클러스터에 제출하고 싶지만 작업을 제출해야하는 사용자를 지정할 수 없습니다. 모든 MapReduce 작업에 사용해야하는 시스템 사용자를 구성하고 사용하고 싶습니다.

현재 클라이언트 시스템의 현재 로그인 한 사용자의 사용자 이름으로 hadoop 작업을 실행해도 사용자를 지정할 수 없습니다. 이로 인해 메시지에 오류가 발생합니다.

Permission denied: user=alice, access=WRITE, inode="staging":hduser:supergroup:rwxr-xr-x

... "alice"는 클라이언트 시스템의 로컬 로그인 사용자입니다.

나는 노력했다.

... 아무 소용이 없습니다. 1)에 관해서는이 수업이 어떻게 사용되어야하는지에 대한 단서가 없다는 것을 인정합니다. 또한 Java System 속성을 변경하는 것이 웹 응용 프로그램에서 사용하기위한 실제 솔루션이 아니라는 점에 유의하십시오.

Hadoop이 원격 시스템에 연결하는 데 사용하는 사용자를 지정하는 방법을 알고 있습니까?

PS / Hadoop은 기본 구성을 사용하며 클러스터에 연결할 때 인증이 사용되지 않으며 Kerberos가 원격 시스템과 통신하는 데 사용되지 않는다는 것을 의미합니다.

해결법

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

    1.마침내 나는 상수를 발견했다.

    마침내 나는 상수를 발견했다.

    static final String HADOOP_USER_NAME = "HADOOP_USER_NAME";`
    

    UserGroupInformation 클래스에 있습니다.

    이것을 환경 변수로 시작시 Java 시스템 등록 정보 (-D 사용)로 또는 System.setProperty ( "HADOOP_USER_NAME", "hduser")로 프로그래밍 방식으로 설정합니다. Hadoop은 원격 Hadoop 클러스터에 연결하기 위해 원하는 사용자 이름을 사용합니다.

  2. ==============================

    2.아래의 코드는 다음과 같은 방식으로 작동합니다.

    아래의 코드는 다음과 같은 방식으로 작동합니다.

    System.setProperty("HADOOP_USER_NAME", "hduser")
    
    UserGroupInformation ugi = UserGroupInformation.createRemoteUser("hduser"); 
    ugi.doAs(new PrivilegedExceptionAction<Void>() {
        public Void run() throws Exception {
            Configuration configuration = new Configuration(); 
            configuration.set("hadoop.job.ugi", "hduser");
            int res = ToolRunner.run(configuration, new YourTool(), args);
            return null; 
        }
    });
    
  3. ==============================

    3.나는 보안 위장 기능 http://hadoop.apache.org/docs/stable1/Secure_Impersonation.html을 사용하여 유사한 문제를 해결할 수 있습니다.

    나는 보안 위장 기능 http://hadoop.apache.org/docs/stable1/Secure_Impersonation.html을 사용하여 유사한 문제를 해결할 수 있습니다.

    다음은 코드 스 니펫입니다.

    UserGroupInformation ugi = UserGroupInformation.createProxyUser("hduser", UserGroupInformation.getLoginUser()); 
    
    ugi.doAs(new PrivilegedExceptionAction() { 
    public Void run() throws Exception { 
      Configuration jobconf = new Configuration(); 
      jobconf.set("fs.default.name", "hdfs://server:hdfsport"); 
      jobconf.set("hadoop.job.ugi", "hduser"); 
      jobconf.set("mapred.job.tracker", "server:jobtracker port"); 
      String[] args = new String[] { "data/input", "data/output" }; 
      ToolRunner.run(jobconf, WordCount.class.newInstance(), args); 
      return null; 
    } });
    

    앞서 언급 한 URL에서 언급 한 것처럼 원격 (Windows 데스크톱 호스트의 경우) 로그인 사용자 아이디가 core-site.xml에 추가되어야합니다

  4. from https://stackoverflow.com/questions/11041253/set-hadoop-system-user-for-client-embedded-in-java-webapp by cc-by-sa and MIT license