实现hive proxy3-日志目录权限问题解决

使用proxy之后,目录名为proxy之后的用户名目录,但是生成的文件属主是当前登陆用户,导致不能正常写入,日志目录的创建在org.apache.hadoop.hive.ql.history.HiveHistoryImpl类中,
更改后的构造方法(增加了proxy之后的代码):

public HiveHistoryImpl(SessionState ss) {
  try {
    console = new LogHelper(LOG);
    if(ss.getConf().getBoolVar(HiveConf.ConfVars.HIVE_USE_CUSTOM_PROXY)){
       LOG.warn("user custom proxy,gen history log file");
        proxyUser = ss.getConf().getVar(HiveConf.ConfVars.HIVE_CUSTOM_PROXY_USER);
        if(("").equals(proxyUser)||proxyUser == null||("hdfs").equals(proxyUser)){
            console.printError("gen history file,use proxy,but proxy user is " + proxyUser);
            return;
        }
        conf_file_loc = System.getProperty("java.io.tmpdir") + File.separator + proxyUser;
    }else {
        conf_file_loc = ss.getConf().getVar(
        HiveConf.ConfVars.HIVEHISTORYFILELOC);
    }
    LOG.warn("user history log dir is " + conf_file_loc);
    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";
    } 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));
  }
}

日志目录的创建相关代码:

    // 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;
      }
    }

一个思路,我们可以把这个目录的权限设大一点,比如777,这里调用了File.mkdirs()方法
(File的mkdirs方法,存在返回false,不存在返回true,创建失败返回false),在File类中最终调用了FileSystem.createDirectory()方法,在File的源码中我们可以看到有如下方法可以设置目录的权限:

    public boolean setWritable( boolean writable, boolean ownerOnly) {
        SecurityManager security = System.getSecurityManager();
        if (security != null) {
            security.checkWrite( path);
        }
        if (isInvalid()) {
            return false ;
        }
        return fs.setPermission(this, FileSystem ACCESS_WRITE, writable, ownerOnly);
    }

可以通过这个方法来更改日志目录的权限,更改HiveHistoryImpl相关的代码如下:

private boolean createDir;
.....
// 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;
  }else{
    LOG.warn("create dir success,start chmod,dir is " + histDir);
    createDir = histDir.setWritable(true,false);
  }
}else{
    LOG.warn("dir already exists,start chmod,dir is " + histDir);
    createDir = histDir.setWritable(true,false);
}
do {
  histFileName = conf_file_loc + File.separator + "hive_job_log_" + ss.getSessionId() + "_"
    + Math.abs(randGen.nextInt()) + ".txt";
} while (! new File(histFileName).createNewFile());

不过这里有个限制,因为不能更改别的用户的日志目录权限,因此要求是新建目录(不能更改旧的目录),最好的方法还是日志文件不要用proxy之后的用户文件就可以啦。

时间: 2024-10-05 04:14:45

实现hive proxy3-日志目录权限问题解决的相关文章

实现hive proxy5-数据目录权限问题解决

hive创建目录时相关的几个hdfs中的类: org.apache.hadoop.hdfs.DistributedFileSystem,FileSystem 的具体实现类 org.apache.hadoop.hdfs.DFSClient,client操作hdfs文件系统的类 org.apache.hadoop.fs.permission.FsPermission 文件权限相关类,主要的方法有getUMask和applyUMask方法 org.apache.hadoop.hdfs.Distribu

实现hive proxy4-scratch目录权限问题解决

hive在hdfs中的job中间文件是根据当前登陆用户产生的,其默认值为/tmp/hive-${user.name},这就导致实现proxy的功能时会遇到临时文件的权限问题,比如在实现了proxy功能后,以超级用户hdfs proxy到普通用户user时,在hdfs中的临时文件在/tmp/hive-user目录中,而目录的属主是hdfs,这时再以普通用户user运行job时,对这个目录就会有权限问题,下面说下这里proxy的实现和解决权限问题的方法:1.实现proxy功能更改org.apache

linux系统下修改文件夹目录权限

linux系统下修改文件夹目录权限 文件夹权限问题 Linux.Fedora.Ubuntu修改文件.文件夹权限的方法差不多.很多人开始接触Linux时都很头痛Linux的文件权限问题.这里告诉大家如何修改Linux文件-文件夹权限.以主文件夹下的一个名为cc的文件夹为例. 下面一步一步介绍如何修改权限: 1.打开终端.输入su(没 Linux.Fedora.Ubuntu修改文件.文件夹权限的方法差不多.很多人开始接触Linux时都很头痛Linux的文件权限问题.这里告诉大家如何修改Linux文件

Linux下ThinkPHP网站目录权限设置

在windows上运行好好的项目,迁移到Linux上就遇到了很多问题,其中最为重要的是网站目录权限的设置,当然简单期间你可以用 命令 "chmod 777 -R you web site" ,这样你就不用担心项目运行的时候会涉及到权限问题.通常来说如果你的项目时部署在公网或者是部 署在租用的Linux服务器上不建议这么做,应为如果这样设置了那么任何用户都可以对这个站点下的文件,目录进行操作,这样也会影响网站的运营, 同样不安全.下面以ubuntu14.4 系统为主进行分析. 最简单的做

使用阿里云服务器的总结二-----目录权限

项目在本地windows上运行好好地,上传到linux系统上就各种权限问题,很是烦恼,当时就想:哪里有问题,哪里777~~~ 虽然这样当时是没有问题的,但是在安全性上是也就降低了,找了个时间找了一些资料,发现一个还比较好的 服务器上项目是放在/alidata/www/default这个文件夹下 如果使用root 用户上传项目,则全部默认所有者和组为root,但是我仔细看了一下默认的那几个文件的所有者和组都是www 根据文档和自己的思考,设置步骤如下: 1.把网站目录和文件所有者和组都设置为www

大数据兼云计算(王明龙)讲师-LINUX-DAY02-文件与目录权限管理

一.查看[文件/目录]信息 ls -l或ll 文件名ls -d或ll -d 目录名二.修改属主与属组 chown 用户名 文件名/目录名 // 修改文件与目录的属主chown .组名 文件名/目录名 // 修改文件与目录的属组chown :组名 文件名/目录名 // 修改文件与目录的属组chown 用户名:组名 文件名/目录名 // 修改文件与目录的属主属组三.权限管理 1.基本权限:ugo=主/组/其它人 rwx=421 2.查看基本权限: stat 文件名/目录名getfacl 文件名/目录

Linux系统chmod 777 误操作目录权限 - 恢复方法

小白操作Linux,手抖导致误修改了系统文件和目录权限,导致系统宕机的修复. chmod 777 -R / chmod 777 -R / test 有的是真不懂,执行了上面的第一条命令,有的是懂,但是操作太快或者粗心大意,或者有乱敲空格的恶习,诸如此类... 不胜枚举,总之闯祸了. Linux 中,如果意外误操作将根目录目录权限批量设置,比如 chmod -R 777 / ,系统中的大部分服务以及命令将无法使用,这时候可以通过系统自带的 getfacl 命令来拷贝和还原系统权限,若是其他系统目录

umask值与Linux中文件和目录权限的关系

umask值与文件和目录的权限 1.1 -R参数设置目录权限(chmod) 1.2 权限字母说明 1.3umask说明 1.umask的值决定着文件和目录的权限,创建文件默认最大权限为666(-rw-rw-rw-),默认创建的文件没有可执行权限x位. 2.对于文件来说,umask的设置是在假定文件拥有八进制666的权限上进行的,文件的权限就是666减去umask(umask的各个位数字也不能大于6,如,077就不符合条件)的掩码数值:重点在接下来的内容,如果umask的部分位或全部位为奇数,那么

Mac系统home目录权限修改【转载】

转载自:http://ju.outofmemory.cn/entry/283070 最近,想把某程序安装到mac下的/home目录下面,发现没有权限,即便是使用sudo命令也无法创建程序目录,在网上查询了半天发现可以通过如下方法来提升mac下/home目录的权限. 编译/etc/auto_master文件,注释掉或者移除以/home开头的那一行,保存. sudo vim /etc/auto_master 注释掉 /home 哪一行,如下所示: # # Automounter master map