HADOOP docker(五):hadoop使用者代理 Proxy user
用例
配置
實驗
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)