zoukankan      html  css  js  c++  java
  • 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等。





  • 相关阅读:
    软件下载链接获取方法
    【转】Linux 查看端口占用情况
    [转]SpringBoot第十集:国际化与Webjars的应用(2020最新最易懂)
    【转】Vue生命周期理解(带图的哦)
    Visual Studio 2019&WebStorm&CMD 创建vue项目
    Qt-Button使用QSS变图片按钮
    Qt-滚动条QSS样式
    Qt-鼠标点击别处隐藏widget
    OSG-修改osg鼠标中轮放大缩小的操作键
    OSG-在使用单位的kit编译osgQOpenGL时提示“语法错误:"unit"的前面应有“:””
  • 原文地址:https://www.cnblogs.com/skyrim/p/14268192.html
Copyright © 2011-2022 走看看