实现hive proxy2-hive操作hadoop时使用用户的地方

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介:

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
     public  static  SessionState start(SessionState startSs) {
     setCurrentSessionState(startSs);
     if (startSs.hiveHist ==  null ){
       if  (startSs.getConf().getBoolVar(HiveConf.ConfVars.HIVE_SESSION_HISTORY_ENABLED)) { 
       // 如果设置hive.session.history.enabled为true,则会初始化日志文件,默认为false
         startSs.hiveHist =  new  HiveHistoryImpl(startSs);    // 由HiveHistoryImpl 产生日志文件
       } else  {
         //Hive history is disabled, create a no-op proxy
         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
public  HiveHistoryImpl(SessionState ss) {
   try  {
     console =  new  LogHelper(LOG);
     String conf_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( "No history file location given" );
       return ;
     }
     // Create directory
     File histDir =  new  File(conf_file_loc);
     if  (!histDir.exists()) {  //创建日志目录
       if  (!histDir.mkdirs()) {
         console.printError( "Unable to create log directory "  + 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  (!  new  File(histFileName).createNewFile());
     console.printInfo( "Hive history file="  + histFileName);
     histStream =  new  PrintWriter(histFileName);
     HashMap<String, String> hm =  new  HashMap<String, String>();
     hm.put(Keys.SESSION_ID.name(), ss.getSessionId());
     log(RecordTypes.SessionStart, hm);
   catch  (IOException e) {
     console.printError( "FAILED: Failed to open Query Log : "  + 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
  // scratch path to use for all non-local (ie. hdfs) file system tmp folders
   private  final  Path nonLocalScratchPath;
   // scratch directory to use for local file system tmp folders
   private  final  String localScratchDir ;
   // the permission to scratch directory (local and hdfs )
   private  final  String scratchDirPermission ;
...
public  Context(Configuration conf, String executionId)  {
   this .conf = conf;
   this .executionId = executionId;
   // local & non-local tmp location is configurable. however it is the same across
   // all external file systems
   nonLocalScratchPath =
     new  Path(HiveConf.getVar(conf, HiveConf.ConfVars.SCRATCHDIR),
              executionId);
   localScratchDir =  new  Path(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方法
   UserGroupInformation clientUgi;
....
   public  void  init( JobConf conf)  throws  IOException {
     setConf(conf);
     cluster =  new  Cluster(conf);
     clientUgi = UserGroupInformation.getCurrentUser();
   }

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

1
2
3
4
5
6
7
8
9
10
11
12
public  void  init(JobConf conf)  throws  IOException {
   setConf(conf);
   cluster =  new  Cluster(conf);
   if  (conf.getBoolean( "use.custom.proxy" , false ))
   {
       String proxyUser = conf.get( "custom.proxy.user" );
       clientUgi = UserGroupInformation.createRemoteUser(proxyUser);
   } else {
       clientUgi = UserGroupInformation.getCurrentUser();
   }
   LOG.warn( "clientUgi is "  + clientUgi);
}


本文转自菜菜光 51CTO博客,原文链接:http://blog.51cto.com/caiguangguang/1589874,如需转载请自行联系原作者
相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
相关文章
|
2月前
|
SQL 分布式计算 关系型数据库
Hadoop-13-Hive 启动Hive 修改启动参数命令行启动测试 几句简单的HQL了解Hive
Hadoop-13-Hive 启动Hive 修改启动参数命令行启动测试 几句简单的HQL了解Hive
61 2
|
2月前
|
SQL 分布式计算 Hadoop
手把手的教你搭建hadoop、hive
手把手的教你搭建hadoop、hive
116 1
|
2月前
|
SQL 分布式计算 关系型数据库
Hadoop-21 Sqoop 数据迁移工具 简介与环境配置 云服务器 ETL工具 MySQL与Hive数据互相迁移 导入导出
Hadoop-21 Sqoop 数据迁移工具 简介与环境配置 云服务器 ETL工具 MySQL与Hive数据互相迁移 导入导出
61 3
|
2月前
|
SQL 分布式计算 Hadoop
Hadoop-12-Hive 基本介绍 下载安装配置 MariaDB安装 3台云服务Hadoop集群 架构图 对比SQL HQL
Hadoop-12-Hive 基本介绍 下载安装配置 MariaDB安装 3台云服务Hadoop集群 架构图 对比SQL HQL
69 3
|
2月前
|
SQL 分布式计算 Hadoop
Hadoop-19 Flume Agent批量采集数据到HDFS集群 监听Hive的日志 操作则把记录写入到HDFS 方便后续分析
Hadoop-19 Flume Agent批量采集数据到HDFS集群 监听Hive的日志 操作则把记录写入到HDFS 方便后续分析
48 2
|
2月前
|
SQL 分布式计算 关系型数据库
Hadoop-24 Sqoop迁移 MySQL到Hive 与 Hive到MySQL SQL生成数据 HDFS集群 Sqoop import jdbc ETL MapReduce
Hadoop-24 Sqoop迁移 MySQL到Hive 与 Hive到MySQL SQL生成数据 HDFS集群 Sqoop import jdbc ETL MapReduce
89 0
|
5月前
|
SQL 关系型数据库 MySQL
实时计算 Flink版操作报错合集之从mysql读数据写到hive报错,是什么原因
在使用实时计算Flink版过程中,可能会遇到各种错误,了解这些错误的原因及解决方法对于高效排错至关重要。针对具体问题,查看Flink的日志是关键,它们通常会提供更详细的错误信息和堆栈跟踪,有助于定位问题。此外,Flink社区文档和官方论坛也是寻求帮助的好去处。以下是一些常见的操作报错及其可能的原因与解决策略。
|
5月前
|
分布式计算 Hadoop 关系型数据库
实时计算 Flink版操作报错合集之Hadoop在将文件写入HDFS时,无法在所有指定的数据节点上进行复制,该如何解决
在使用实时计算Flink版过程中,可能会遇到各种错误,了解这些错误的原因及解决方法对于高效排错至关重要。针对具体问题,查看Flink的日志是关键,它们通常会提供更详细的错误信息和堆栈跟踪,有助于定位问题。此外,Flink社区文档和官方论坛也是寻求帮助的好去处。以下是一些常见的操作报错及其可能的原因与解决策略。
|
5月前
|
SQL 分布式计算 关系型数据库
Hadoop-12-Hive 基本介绍 下载安装配置 MariaDB安装 3台云服务Hadoop集群 架构图 对比SQL HQL
Hadoop-12-Hive 基本介绍 下载安装配置 MariaDB安装 3台云服务Hadoop集群 架构图 对比SQL HQL
71 2
|
6月前
|
SQL 分布式计算 DataWorks
DataWorks操作报错合集之在进行Hive分区truncate操作时遇到权限不足,怎么解决
DataWorks是阿里云提供的一站式大数据开发与治理平台,支持数据集成、数据开发、数据服务、数据质量管理、数据安全管理等全流程数据处理。在使用DataWorks过程中,可能会遇到各种操作报错。以下是一些常见的报错情况及其可能的原因和解决方法。
76 0