1. 程式人生 > 實用技巧 >HADOOP docker(五):hadoop使用者代理 Proxy user

HADOOP docker(五):hadoop使用者代理 Proxy user

hadoop使用者代理簡介
用例
配置
實驗TOC

hadoop使用者代理簡介

本文講"超級使用者"如何代理其它使用者提交作業或訪問叢集。
這裡的"超級使用者"即是啟動某個應用程式的使用者。例如有一個應用app01,則app01中的啟動使用者app為即為"超級使用者"。如果app01中有其它使用者,比如user01,則可以使用app來代理user01提交程式。這種代理的方式在kerberos叢集中很有效果,比如app使用者有kerberos憑證而user01沒有。
實際上,代理的是"超級"使用者在hadoop的"通行證",不配置代理使用者"超級使用者"自己也不能在hadoop上提交任務。
任何使用者,要提交任務到hadoop上必須配置代理使用者

用例

使用者名稱為super的超級使用者希望代表使用者joe提交作業並訪問hdfs。超級使用者有kerberos憑據,但是使用者joe沒有。這些任務需要以使用者joe的身份執行,對namenode的任何檔案訪問都需要以使用者joe的身份完成。它要求使用者joe能夠在使用super的kerberos憑據進行身份驗去提交作業或者連線叢集。換句話說,super使用者正在模擬使用者joe。一些產品,如Apache Oozie需要這個。
PS:實際上要提交作業到yarn程式都要使用超級使用者代理,如oozie、hive、spark等。

下面是一個示例程式碼片段:

    ...
    //Create ugi for joe. The login user is 'super'.
    UserGroupInformation ugi =
            UserGroupInformation.createProxyUser("joe", UserGroupInformation.getLoginUser());
    ugi.doAs(new PrivilegedExceptionAction<Void>() {
      public Void run() throws Exception {
        //Submit a job
        JobClient jc = new JobClient(conf);
        jc.submitJob(conf);
        //OR access hdfs
        FileSystem fs = FileSystem.get(conf);
        fs.mkdir(someFilePath);
      }
    }

配置

以下配置中$superuser即指"超級使用者"

hadoop.proxyuser.$superuser.hosts  :超級使用者可以在哪些主機上執行代理。
hadoop.proxyuser.$superuser.groups :超級使用者可以代理哪些組
hadoop.proxyuser.$superuser.users : 超級使用者可以代理哪些使用者。

修改core-site.xml,新增代理配置。

示例1:

   <property>
     <name>hadoop.proxyuser.super.hosts</name>
     <value>host1,host2</value>
   </property>
   <property>
     <name>hadoop.proxyuser.super.groups</name>
     <value>group1,group2</value>
   </property>

第一個配置:超級使用者super可以在主host1,host2上執行代理。
第二個配置:超級使用者super可以代理group1,group2中的使用者。

示例2:

  <property>
    <name>hadoop.proxyuser.oozie.hosts</name>
    <value>*</value>
  </property>
  <property>
    <name>hadoop.proxyuser.oozie.groups</name>
    <value>*</value>
  </property>

可以使用萬用字元"*"表示所有的。上面的配置表示oozie使用者可以在任何主機中代理任務組的使用者。

示例3:

   <property>
     <name>hadoop.proxyuser.super.hosts</name>
     <value>10.222.0.0/16,10.113.221.221</value>
   </property>
   <property>
     <name>hadoop.proxyuser.super.users</name>
     <value>user1,user2</value>
   </property>

hadoop.proxyuser.$superuser.hosts支援一個CIDR格式的IP列表。上面的配置表示super使用者可以在10.222.0.0/16的子網及10.113.221.221這個IP上執行代理。

實驗

上一節連線hiveserver2時關了hiveserver2的代理功能。這裡測試代理功能。
修改core-site.xml:

  <property>
     <name>hadoop.proxyuser.hive.hosts</name>
     <value>hadoop1,hadoop2</value>
  </property>
  <property>
     <name>hadoop.proxyuser.hive.groups</name>
     <value>hadoop</value>
  </property>
  <property>
     <name>hadoop.proxyuser.hive.users</name>
     <value>bob,joe</value>
  </property>

分發到各hadoop節點

修改hadoop1 hadoop2 上的hive-site.xml:

<property>
    <name>hive.server2.enable.doAs</name>
    <value>true</value>
</property>

其它hive做為beeline客戶端,不設定hive-site.xml。

然後在hadoop1上啟動hiveserver2。

在hadoop5上執行:

[hive@hadoop4 apache-hive-2.1.1]$ beeline
beeline> !connect jdbc:hive2://hadoop1:10000
Enter username for jdbc:hive2://hadoop1:10000: hive
Enter password for jdbc:hive2://hadoop1:10000: ****
Connected to: Apache Hive (version 2.1.1)
Driver: Hive JDBC (version 2.1.1)
17/04/21 18:10:54 [main]: WARN jdbc.HiveConnection: Request to set autoCommit to false; Hive does not support autoCommit=false.
Transaction isolation: TRANSACTION_REPEATABLE_READ
0: jdbc:hive2://hadoop1:10000>

發現已經連線上來了,而之前是報 "User: hive is not allowed to impersonate hive".

當hadoop4上的使用者通過beeline發起連線時,hadoop1上的hive使用者作為hive的superuser代理了hadoop4上的hive使用者。

另外,如果在hadoop3上啟hiveserver2,再去連線,又會報錯:

Enter username for jdbc:hive2://hadoop3:10000: hive
Enter password for jdbc:hive2://hadoop3:10000: ****
17/04/21 18:30:04 [main]: WARN jdbc.HiveConnection: Failed to connect to hadoop3:10000
Error: Could not open client transport with JDBC Uri: jdbc:hive2://hadoop3:10000: Failed to open new session: java.lang.RuntimeException: org.apache.hadoop.ipc.RemoteException(org.apache.hadoop.security.authorize.AuthorizationException): Unauthorized connection for super-user: hive from IP 172.18.0.13 (state=08S01,code=0)

也就是說,超級使用者只能代理引數中限制的主機。
同樣,只要是hadoop組,不管在哪臺機器上都可以被代理。bob joe使用者在任何機器上都可以被代理。

其它:除了hive外,凡是要使用hdfs 和 yarn的元件,都可以設定使用者代理,比如oozie等。



來自為知筆記(Wiz)