Hive中hiverc文件的加载实现与剖析

Alex / 5-24 17:18 / Hive / Tag: hive

    使用hive时,我们都知道可以通过指定 -i参数或者配置.hiverc来设置hive启动时在提示符出现之前先执行这些文件,比如可以把udf的定义写到.hiverc文件中。

    在${HIVE_HOME}/bin目录下有个.hiverc文件,它是隐藏文件,我们可以用Linux的ls -a命令查看。我们在启动Hive的时候会去加载这个文件中的内容,所以我们可以在这个文件中配置一些常用的参数,如下:

    !看网上有网友说是在 ${HIVE_HOME}/bin目录下 但是我在使用时,不能正确加载,提示下面的问题,说明在需要配置HIVE_CONF_DIR根目录中特此提醒!

    Putting the global hiverc in $HIVE_HOME/bin/.hiverc is deprecated. Please use $HIVE_CONF_DIR/.hiverc i
nstead.


#在命令行中显示当前数据库名

set hive.cli.print.current.db=true;

#查询出来的结果显示列的名称

set hive.cli.print.header=true;

#启用桶表

set hive.enforce.bucketing=true;

#压缩hive的中间结果

set hive.exec.compress.intermediate=true;

#对map端输出的内容使用BZip2编码/解码器

set mapred.map.output.compression.codec=org.apache.hadoop.io.compress.BZip2Codec;

#压缩hive的输出

set hive.exec.compress.output=true;

#对hive中的MR输出内容使用BZip2编码/解码器

set mapred.output.compression.codec=org.apache.hadoop.io.compress.BZip2Codec;

#让hive尽量尝试local模式查询而不是mapred方式

set hive.exec.mode.local.auto=true;


加载.hiverc的过程是在CliDriver类中定义的。

具体的方法调用顺序:

main->run->executeDriver->processInitFiles->processFile->processReader->processLine->processCmd

processCmd里面的具体实现就比较多了。


1)其中executeDriver中,处理 初始化文件的调用部分:


 // Execute -i init files (always in silent mode)
    cli.processInitFiles (ss);  // 加载初始文件
    if (ss. execString != null ) {
      int cmdProcessStatus = cli.processLine(ss. execString);  // -e的情况  ss.execString = commandLine.getOptionValue( 'e');
      return cmdProcessStatus;
    }
    try {
      if (ss. fileName != null) {
        return cli.processFile(ss.fileName );  // -f的情况   ss.fileName = commandLine.getOptionValue('f' );
      }
    } catch (FileNotFoundException e) {
      System. err.println("Could not open input file for reading. (" + e.getMessage() + ")" );
      return 3;
    }

2)其中在 processReader定义了.hiverc文件中注释的写法(以--开头)

public int processReader(BufferedReader r) throws IOException {
    String line;
    StringBuilder qsb = new StringBuilder();
    while ((line = r.readLine()) != null) {
      // Skipping through comments
      if (! line.startsWith( "--")) {
        qsb.append(line + "\n");
      }
    }
    return (processLine(qsb.toString()));
  }

3)processInitFiles定义了加载的顺序:

-i指定或者  

$HIVE_HOME/bin/.hiverc--->$HIVE_CONF_DIR/.hiverc--->${user.home}/.hiverc
代码实现:


public void processInitFiles(CliSessionState ss) throws IOException {
    boolean saveSilent = ss. getIsSilent();
    ss.setIsSilent(true);
    for (String initFile : ss. initFiles) {  // ss. initFiles 指由 hive -i参数传入的文件路径
      int rc = processFile(initFile);
      if (rc != 0) {
        System. exit(rc);
      }
    }
    if (ss. initFiles.size() == 0) { // 如果 没有指定 -i参数,则按如下路径加载
      if (System.getenv("HIVE_HOME" ) != null) {   // $HIVE_HOME/bin/.hiverc
        String hivercDefault = System. getenv("HIVE_HOME") + File. separator +
          "bin" + File.separator + HIVERCFILE;
        if (new File(hivercDefault).exists()) {
          int rc = processFile(hivercDefault);
          if (rc != 0) {
            System. exit(rc);
          }
          console.printError( "Putting the global hiverc in " +
                             "$HIVE_HOME/bin/.hiverc is deprecated. Please " +
                             "use $HIVE_CONF_DIR/.hiverc instead." );
        }
      }
      if (System.getenv("HIVE_CONF_DIR" ) != null) { // $HIVE_CONF_DIR/.hiverc
        String hivercDefault = System. getenv("HIVE_CONF_DIR") + File. separator
          + HIVERCFILE;
        if (new File(hivercDefault).exists()) {
          int rc = processFile(hivercDefault);
          if (rc != 0) {
            System. exit(rc);
          }
        }
      }
      if (System.getProperty("user.home" ) != null) { //${user.home}/.hiverc
        String hivercUser = System. getProperty("user.home") + File. separator +
          HIVERCFILE;
        if (new File(hivercUser).exists()) {
          int rc = processFile(hivercUser);
          if (rc != 0) {
            System. exit(rc);
          }
        }
      }
    }
    ss.setIsSilent(saveSilent);
  }


参考:http://caiguangguang.blog.51cto.com/1652935/1542269/

        http://m.blog.csdn.net/blog/lzm1340458776/43119445



发表留言:

利用sqoop从hive导入mysql的常见错误总结 Hive问题记录0523 FAILED: Execution Error, return code 1 from org.apache.hadoop.hive.ql.exec.DDLTask. org/apache/hadoop/ hbase/HBaseConfiguration
返回顶部
Themes by lishiyu.cn