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

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等。





posted on 2021-01-12 17:47  月饼馅饺子  阅读(1795)  评论(0编辑  收藏  举报

导航