CDH4.2.0开始支持hiveserver2impersonation,只需要设置参数hive.server2.enable.impersonation(该参数在Hive里是HIVE_SERVER2_KERBEROS_IMPERSONATION,容易被误会和kerberos一起使用)true即可,这样可以使得提交的HQL以提交用户来运行MAPREDUCE而不是运行HiveserverUser,那么具体是如何实现的呢:

当通过ThriftCliService开启一个Session时,如果开启了上面的参数,则会调用CliServiceopenSessionWithImpersonation方法进而SessionManager就会生成一个HiveSession的动态代理HiveSessionImplwithUGI,并把用户的UGI传入进去:

session = (HiveSession)HiveSessionProxy.getProxy(hiveSessionUgi,hiveSessionUgi.getSessionUgi());

hiveSessionUgi.setProxySession(session);

每次执行方法的时候都是通过ShimLoader.getHadoopShims().doAs执行,如果没有指定该参数则是以运行Hiveserver的用户执行.