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


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"放行.






免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM