1.hadoop用户代理简介

hadoop用户代理功能的作用是让超级用户superuser模拟一个普通用户来执行任务。比如用户joe通过oozie提交一个任务到集群上,如果不设置用户代理,那么就会以启动oozie(oozie)进程的用户来提交任务,这样任务就显示为oozie,无法判断是哪个用户提交了任务。当开始proxy功能后,会以superuser模拟joe来提交任务,任务的提交者是supersuer,但显示为joe.

superuser指启动各个守护进程的用户,如name hive oozie等。

2.配置

用户代理分为host group user三个方面,分别表示哪些主机上的superuser 、模拟哪些组、模拟哪些用户

修改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>

上述三个配置分别表示,hadoop1 hadoop2上的hive用户可以superuser的方式模拟hadoop组的任务用户,还可以模拟bob和joe用户。

注意:host实限定了superuser所在的主机,而不是clinet所在的主机。

3.实验

上一节连接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)

再次验证了host参数只是用来限制superuser的主机而非client.

同样,只要是hadoop组,不管在哪台机器上都可以被代理。bob joe用户在任何机器上都可以被代理。

其它:除了hive外,凡是要使用hdfs 和 yarn的组件,都可以设置用户代理,比如oozie等。

[========]

2017/7/5补充:

昨晚在家安装beeline又遇到hadoop用户代理的问题.仔细思考了一下hadoop用户代理的机制:

http://hadoop.apache.org/docs/r2.6.0/hadoop-project-dist/hadoop-common/SecureMode.html

里有一段:

Some products such as Apache Oozie which access the services of Hadoop on behalf of end users need to be able to impersonate end users. You can configure proxy user using properties hadoop.proxyuser.$superuser.hosts along with either or both of hadoop.proxyuser.$superuser.groups and hadoop.proxyuser.$superuser.users.

注意第一句中的"end users",指的是实际使用oozie的用户,这个用户可能是bob john等(这些用户甚至不用存在于os上),但不是启动oozie服务的用户(一般是oozie),bob john不是以oozie的身份去执行任务,因此bob john是"end users".hadoop只对非"end users"开放通行,即各服务的启动用户,如oozie(oozie)\hive(hiveserver2)等.因此当"end user"使用oozie或者hiveserver2的服务时,就需要通过设置hadoop的用户代理功能.当启用hadoop用户代理后,yarn上的任务名就是"end users"的用户,而非oozie\hive等.

hive cli\sqoop客户端,本身没有"end users"用户,哪个用户启动就以哪个用户连接hadoop,而其中的用户验证过程是由hive cli\sqoop客户端和namenode一起完成的,因此不存在用户代理需要.

当hiveserver2关于自身的用户代理功能后,bob john执行的任务将以hive的名字提交,这时就没有"end users"了,所有的任务都是hive这个前端用户提交的,而hiveserver2和namenode一起完成了用户hive的验证,所以任务能提交成功.当这就是为什么hadoop对非"end users"放行.

HADOOP docker(五):hadoop用户代理 Proxy user的更多相关文章

  1. Hadoop教程(五)Hadoop分布式集群部署安装

    Hadoop教程(五)Hadoop分布式集群部署安装 1 Hadoop分布式集群部署安装 在hadoop2.0中通常由两个NameNode组成,一个处于active状态,还有一个处于standby状态 ...

  2. HADOOP docker(八):hadoop本地库

    前言2. Native Hadoop Library3. 使用本地库4. 本地库组件5. 支持的平台6. 下载7. 编译8. 运行时观察9. 检查本地库10. 如果共享本地库 小伙伴还记得每次启动hd ...

  3. docker 安装hadoop

    上一篇文章介绍了一些docker的基本命令,这篇文章来安装一个HADOOP 一.下载hadoop镜像 @~/git/github/docker-ambari (master)$ docker pull ...

  4. 使用Docker搭建Hadoop集群(伪分布式与完全分布式)

    之前用虚拟机搭建Hadoop集群(包括伪分布式和完全分布式:Hadoop之伪分布式安装),但是这样太消耗资源了,自学了Docker也来操练一把,用Docker来构建Hadoop集群,这里搭建的Hado ...

  5. 基于Docker搭建Hadoop+Hive

    为配合生产hadoop使用,在本地搭建测试环境,使用docker环境实现(主要是省事~),拉取阿里云已有hadoop镜像基础上,安装hive组件,参考下面两个专栏文章: 克里斯:基于 Docker 构 ...

  6. docker搭建Hadoop集群

    一个分布式系统基础架构,由Apache基金会所开发. 用户可以在不了解分布式底层细节的情况下,开发分布式程序.充分利用集群的威力高速运算和存储. 首先搭建Docker环境,Docker版本大于1.3. ...

  7. Docker部署Hadoop集群

    Docker部署Hadoop集群 2016-09-27 杜亦舒 前几天写了文章"Hadoop 集群搭建"之后,一个朋友留言说希望介绍下如何使用Docker部署,这个建议很好,Doc ...

  8. docker安装hadoop

    docker为hadoop的云化带来了极大便利,安装和应用也会更快更方便.进入正题: docker search hadoop 将会看到如下结果: INDEX NAME DESCRIPTION STA ...

  9. docker安装hadoop集群

    docker安装hadoop集群?图啥呢?不图啥,就是图好玩.本篇博客主要是来教大家如何搭建一个docker的hadoop集群.不要问 为什么我要做这么无聊的事情,答案你也许知道,因为没有女票.... ...

随机推荐

  1. 可能是catalan数吧

    What's the number of distinct BSTs containing nodes {1, 2, 3 ,4}? 包含节点{1,2,3,4}的不同二叉搜索树有多少棵? int Num ...

  2. mac appstore应用下载失败,不能更新等等问题,都可以解决

    打开终端,输入以下命令 open `getconf DARWIN_USER_CACHE_DIR`/com.apple.appstore 进入目录,删除 com.apple.appstore  重启系 ...

  3. 让 shell(bash) 命令行显示当前 git 的分支名称

    早上测试脚本的时候,偶然在这篇文章<Git – setting up a remote repository and doing an initial push>看到一个关于 git 的好 ...

  4. 微信小程序调用api接口

    请求的第三方微信url大概有3种 1)$url = "https://api.weixin.qq.com/sns/oauth2/access_token?appid=$appid&s ...

  5. Linux中Kibana部署

    1.下载kibana安装包kibana-5.5.0-linux-x86_64.tar.gz tar –xzf kibana-5.5.0-linux-x86_64.tar.gz解压 把文件移动到 Mv ...

  6. [].slice.call的理解

    首先要说明[].slice.call()与Array.prototype.slice.call() 有什么区别? [].slice === Array.prototype.slice true []为 ...

  7. jdk11新特性

    JDK 11主要特性一览 jdk11即将在9月25号发布正式版.确定的新特性包括以下17个 181 嵌套类可见性控制 309 动态文件常量 315 改进 Aarch64 Intrinsics 318 ...

  8. CASE WHEN 批量更新

    单个值: UPDATE categories SET display_order = CASE id WHEN 1 THEN 3 WHEN 2 THEN 4 WHEN 3 THEN 5 END WHE ...

  9. mysql的length与char_length的区别

    length:   是计算字段的长度一个汉字是算三个字符,一个数字或字母算一个字符 char_length:不管汉字还是数字或者是字母都算是一个字符 同时这两个函数,可用于判断数据中是否有中文文字 例 ...

  10. Flask后台管理

    管理后台主页 需求 为后台主页提供专门的视图函数 需要带入当前管理员用户相关信息以便在界面进行展示 代码实现 在 modules/admin/views.py 文件中添加视图函数 @admin_blu ...