设为首页 加入收藏

TOP

实现hive proxy2-hive操作hadoop时使用用户的地方
2019-05-09 12:57:13 】 浏览:423
Tags:实现 hive proxy2-hive 操作 hadoop 使用 用户 地方

hive权限有两层,hive本身的验证和hadoop的验证。自定义hive的proxy功能时,hive层面的相关验证更改在
http://caiguangguang.blog.51cto.com/1652935/1587251

中已经提过,这里说下hive和hadoop以及本地文件系统相关的几个出现用户的地方:
1.job的log文件

session初始化时会初始化日志文件,主要在SessionState的start方法中:

1
2
3
4
5
6
7
8
9
10
11
12
publicstaticSessionStatestart(SessionStatestartSs){
setCurrentSessionState(startSs);
if(startSs.hiveHist==null){
if(startSs.getConf().getBoolVar(HiveConf.ConfVars.HIVE_SESSION_HISTORY_ENABLED)){
//如果设置hive.session.history.enabled为true,则会初始化日志文件,默认为false
startSs.hiveHist=newHiveHistoryImpl(startSs);//由HiveHistoryImpl产生日志文件
}else{
//Hivehistoryisdisabled,createano-opproxy
startSs.hiveHist=HiveHistoryProxyHandler.getNoOpHiveHistoryProxy();
}
}
...

再来看org.apache.hadoop.hive.ql.history.HiveHistoryImpl类的构造函数,定义了日志的路径,如果日志目录不存在,则创建目录:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
publicHiveHistoryImpl(SessionStatess){
try{
console=newLogHelper(LOG);
Stringconf_file_loc=ss.getConf().getVar(
HiveConf.ConfVars.HIVEHISTORYFILELOC);
//HIVEHISTORYFILELOC("hive.querylog.location",System.getProperty("java.io.tmpdir")+File.separator+System.getProperty("user.name")),
默认值是/tmp/${user.name}/目录
if((conf_file_loc==null)||conf_file_loc.length()==0){
console.printError("Nohistoryfilelocationgiven");
return;
}
//Createdirectory
FilehistDir=newFile(conf_file_loc);
if(!histDir.exists()){//创建日志目录
if(!histDir.mkdirs()){
console.printError("Unabletocreatelogdirectory"+conf_file_loc);
return;
}
}
do{
histFileName=conf_file_loc+File.separator+"hive_job_log_"+ss.getSessionId()+"_"
+Math.abs(randGen.nextInt())+".txt";
//日志文件的完整路径比如/tmp/hdfs/hive_job_log_4f96f470-a6c1-41ae-9d30-def308e5412f_564454280.txt
/tmp/hdfs/hive_job_log_sessionid_随机数.txt
}while(!newFile(histFileName).createNewFile());
console.printInfo("Hivehistoryfile="+histFileName);
histStream=newPrintWriter(histFileName);
HashMap<String,String>hm=newHashMap<String,String>();
hm.put(Keys.SESSION_ID.name(),ss.getSessionId());
log(RecordTypes.SessionStart,hm);
}catch(IOExceptione){
console.printError("FAILED:FailedtoopenQueryLog:"+histFileName
+""+e.getMessage(),"\n"
+org.apache.hadoop.util.StringUtils.stringifyException(e));
}
}

2.job的中间文件
hive执行过程中保存在hdfs的路径,由hive.exec.scratchdir和hive.exec.local.scratchdir定义
scratch文件是在org.apache.hadoop.hive.ql.Context类的构造方法中获取
关于scratch目录的相关配置:

1
2
3
4
SCRATCHDIR("hive.exec.scratchdir","/tmp/hive-"+System.getProperty("user.name")),
//默认值为/tmp/hive-当前登录用户
LOCALSCRATCHDIR("hive.exec.local.scratchdir",System.getProperty("java.io.tmpdir")+File.separator+System.etProperty("user.name")),
SCRATCHDIRPERMISSION("hive.scratch.dir.permission","700"),

在org.apache.hadoop.hive.ql.Context类的构造方法中

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
//scratchpathtouseforallnon-local(ie.hdfs)filesystemtmpfolders
privatefinalPathnonLocalScratchPath;
//scratchdirectorytouseforlocalfilesystemtmpfolders
privatefinalStringlocalScratchDir;
//thepermissiontoscratchdirectory(localandhdfs)
privatefinalStringscratchDirPermission;
...
publicContext(Configurationconf,StringexecutionId){
this.conf=conf;
this.executionId=executionId;
//local&non-localtmplocationisconfigurable.howeveritisthesameacross
//allexternalfilesystems
nonLocalScratchPath=
newPath(HiveConf.getVar(conf,HiveConf.ConfVars.SCRATCHDIR),
executionId);
localScratchDir=newPath(HiveConf.getVar(conf,HiveConf.ConfVars.LOCALSCRATCHDIR),
executionId).toUri().getPath();
scratchDirPermission=HiveConf.getVar(conf,HiveConf.ConfVars.SCRATCHDIRPERMISSION);
}

在Driver的compile方法中会初始化这个对象。

3.job提交的用户

1
2
3
4
5
6
7
8
JobClient的init方法
UserGroupInformationclientUgi;
....
publicvoidinit(JobConfconf)throwsIOException{
setConf(conf);
cluster=newCluster(conf);
clientUgi=UserGroupInformation.getCurrentUser();
}

这里增加proxy比较容易,用UserGroupInformation的createRemoteUser方法即可:
比如把init方法改为:

1
2
3
4
5
6
7
8
9
10
11
12
publicvoidinit(JobConfconf)throwsIOException{
setConf(conf);
cluster=newCluster(conf);
if(conf.getBoolean("use.custom.proxy",false))
{
StringproxyUser=conf.get("custom.proxy.user");
clientUgi=UserGroupInformation.createRemoteUser(proxyUser);
}else{
clientUgi=UserGroupInformation.getCurrentUser();
}
LOG.warn("clientUgiis"+clientUgi);
}


本文转自菜菜光 51CTO博客,原文链接:http://blog.51cto.com/caiguangguang/1589874,如需转载请自行联系原作者
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇spark on hive原理与环境搭建 &nb.. 下一篇MetaException(message:Hive Sche..

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目