文档章节

hive cli启动

政委007
 政委007
发布于 2017/04/27 11:30
字数 747
阅读 40
收藏 2

hive Cli 启动

[toc]

CliDriver

作用: 执行命令:hive时 实际上运行的类是org.apache.hadoop.hive.cli.CliDriver.java 。

入口

    public static void main(String[] args) throws Exception {
        int ret = new CliDriver().run(args);
        System.exit(ret);
    }
    public  int run(String[] args) throws Exception {
        //解析命令行参数, 把hiveconf 的参数设置到环境变量,吧define,和hivevar等参数添加到一个map中
        OptionsProcessor oproc = new OptionsProcessor();
        if (!oproc.process_stage1(args)) {
            return 1;
        }
        //初始化Log4j日志组件
        // NOTE: It is critical to do this here so that log4j is reinitialized
        // before any of the other core hive classes are loaded
        boolean logInitFailed = false;
        String logInitDetailMessage;
        try {
            logInitDetailMessage = LogUtils.initHiveLog4j();
        } catch (LogInitializationException e) {
            logInitFailed = true;
            logInitDetailMessage = e.getMessage();
        }
        //初始化HiveConf,并根据HiveConf实例化CliSessionState,设置输入输出流为标准控制台。
        //CliSessionState 继承了SessionState类,
        //创建了一些记录用户输入的字符串,在实例化的过程中,主要是用来记录HiveConf,并生成一个会话ID,参见SessionState构造函数.
        CliSessionState ss = new CliSessionState(new HiveConf(SessionState.class));
        //设置ss的输入,输出,把对ss的和hive cli的关联起来
        ss.in = System.in;
        try {
            ss.out = new PrintStream(System.out, true, "UTF-8");
            ss.info = new PrintStream(System.err, true, "UTF-8");
            ss.err = new CachingPrintStream(System.err, true, "UTF-8");
        } catch (UnsupportedEncodingException e) {
            return 3;
        }
        //根据stage1解析的参数内容,填充CliSessionState的字符串,比如用户输入了-e 则这个stage就把-e 对应的字符串赋值给CliSessionState的 execString成员。
        // -S 表示 沉默状态
        // -e 获取执行sql 
        // -f 获取要执行的sql文件
        // -v 是否详细显示
        // 其他, 处理hiveconf 和 i 等参数
        if (!oproc.process_stage2(ss)) {
            return 2;
        }
        //在允许打印输出的模式下,如果日志初始化失败,打印失败信息
        if (!ss.getIsSilent()) {
            if (logInitFailed) {
                System.err.println(logInitDetailMessage);
            } else {
                SessionState.getConsole().printInfo(logInitDetailMessage);
            }
        }
        //将用户命令行输入的配置信息和变量等,覆盖HiveConf的默认值
        // set all properties specified via command line
        HiveConf conf = ss.getConf();
        for (Map.Entry<Object, Object> item : ss.cmdProperties.entrySet()) {
            conf.set((String) item.getKey(), (String) item.getValue());
            ss.getOverriddenConfigurations().put((String) item.getKey(), (String) item.getValue());
        }

        // read prompt configuration and substitute variables.
        prompt = conf.getVar(HiveConf.ConfVars.CLIPROMPT);
        prompt = new VariableSubstitution(new HiveVariableSource() {
            @Override
            public Map<String, String> getHiveVariable() {
                return SessionState.get().getHiveVariables();
            }
        }).substitute(conf, prompt);
        prompt2 = spacesForString(prompt);
        //设置当前回话状态,执行CLI驱动
        SessionState.start(ss);
        //在这之前都是准备hive 参数
        try {
            return executeDriver(ss, conf, oproc);
        } finally {
            ss.close();
        }
    }

初始化cli命令

private int executeDriver(CliSessionState ss, HiveConf conf, OptionsProcessor oproc)
            throws Exception {

        CliDriver cli = new CliDriver();
        cli.setHiveVariables(oproc.getHiveVariables());
        //设置使用的数据库
        // use the specified database if specified
        cli.processSelectDatabase(ss);

        // Execute -i init files (always in silent mode)
        cli.processInitFiles(ss);
        //如果传递了要执行的sql 执行后退出
        if (ss.execString != null) {
            int cmdProcessStatus = cli.processLine(ss.execString);
            return cmdProcessStatus;
        }
        //执行sql文件
        try {
            if (ss.fileName != null) {
                return cli.processFile(ss.fileName);
            }
        } catch (FileNotFoundException e) {
            System.err.println("Could not open input file for reading. (" + e.getMessage() + ")");
            return 3;
        }
        //获取命令行的reader
        ConsoleReader reader =  getConsoleReader();
        reader.setExpandEvents(false);
        reader.setBellEnabled(false);
        // reader.setDebug(new PrintWriter(new FileWriter("writer.debug", true)));
        for (Completer completer : getCommandCompleter()) {
            reader.addCompleter(completer);
        }
        //略去一部分不重要代码

        int ret = 0;

        String prefix = "";
        String curDB = getFormattedDb(conf, ss);
        String curPrompt = prompt + curDB;
        String dbSpaces = spacesForString(curDB);
        //开始从命令行获取sql 语句,如果是以 ; 结尾,则开始执行sql
        while ((line = reader.readLine(curPrompt + "> ")) != null) {
            if (!prefix.equals("")) {
                prefix += '\n';
            }
            if (line.trim().endsWith(";") && !line.trim().endsWith("\\;")) {
                line = prefix + line;
                //开始执行hive 命令
                ret = cli.processLine(line, true);
                prefix = "";
                curDB = getFormattedDb(conf, ss);
                curPrompt = prompt + curDB;
                dbSpaces = dbSpaces.length() == curDB.length() ? dbSpaces : spacesForString(curDB);
            } else {
                prefix = prefix + line;
                curPrompt = prompt2 + dbSpaces;
                continue;
            }
        }

        if (history != null) {
            history.flush();
        }
        return ret;
    }

© 著作权归作者所有

政委007
粉丝 10
博文 15
码字总数 15843
作品 0
洛阳
程序员
私信 提问
Hive 入门介绍

1 Hive是什么 Hive是构建在Hadoop之上的数据仓库平台; Hive是一个SQL解析引擎,它将SQL语句转译成MapReduce任务,并在Hadoop上执行; Hive表是HDFS的一个文件目录,一个表名对应一个目录名,...

林中漫步
2016/07/13
75
0
Hive几种参数配置方法(转载)

转自:https://www.iteblog.com/archives/871.html Hive提供三种可以改变环境变量的方法,分别是:(1)、修改${HIVE_HOME}/conf/hive-site.xml配置文件;(2)、命令行参数;(3)、在已经进...

晴天哥
2017/09/04
0
0
Hive客户端脚本CLI分析及debug环境搭建

接触Hive,自然少不了它家的shell命令行模式,下面就来分析下,平常我们接触的这个脚本到底如何运行的。 研究的版本是 1.2.1.(先搭建好Hadoop环境) ---扩展阅读:有兴趣的看看别人写的 https:...

强子哥哥
2016/03/12
191
0
5-Hadoop之旅-Hive(一)

Hive能做什么? Hive是基于Hadoop的一个数据仓库工具,可以将结构化的数据文件映射为一张数据库表,并提供完整的sql查询功能,可以将sql语句转换为MapReduce任务进行运行。其优点是学习成本低...

SET
2016/09/12
85
0
Hive 随谈(二)– Hive 结构

主要分为以下几个部分: 用户接口,包括 CLI,Client,WUI。 元数据存储,通常是存储在关系数据库如 mysql, derby 中。 解释器、编译器、优化器、执行器。 Hadoop:用 HDFS 进行存储,利用 ...

红薯
2010/04/12
3K
1

没有更多内容

加载失败,请刷新页面

加载更多

只需一步,在Spring Boot中统一Restful API返回值格式与统一处理异常

统一返回值 在前后端分离大行其道的今天,有一个统一的返回值格式不仅能使我们的接口看起来更漂亮,而且还可以使前端可以统一处理很多东西,避免很多问题的产生。 比较通用的返回值格式如下:...

晓月寒丶
今天
59
0
区块链应用到供应链上的好处和实际案例

区块链可以解决供应链中的很多问题,例如记录以及追踪产品。那么使用区块链应用到各产品供应链上到底有什么好处?猎头悬赏平台解优人才网小编给大家做个简单的分享: 使用区块链的最突出的优...

猎头悬赏平台
今天
27
0
全世界到底有多少软件开发人员?

埃文斯数据公司(Evans Data Corporation) 2019 最新的统计数据(原文)显示,2018 年全球共有 2300 万软件开发人员,预计到 2019 年底这个数字将达到 2640万,到 2023 年达到 2770万。 而来自...

红薯
今天
61
0
Go 语言基础—— 通道(channel)

通过通信来共享内存(Java是通过共享内存来通信的) 定义 func service() string {time.Sleep(time.Millisecond * 50)return "Done"}func AsyncService() chan string {retCh := mak......

刘一草
今天
57
0
Apache Flink 零基础入门(一):基础概念解析

Apache Flink 的定义、架构及原理 Apache Flink 是一个分布式大数据处理引擎,可对有限数据流和无限数据流进行有状态或无状态的计算,能够部署在各种集群环境,对各种规模大小的数据进行快速...

Vincent-Duan
今天
59
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部