Hive cli源码阅读和梳理

对Cli的重新认识
*). hive cli有两种模式, 本地模式: 采用持有的driver对象来处理, 远程模式: 通过连接HiveServer来实现, 由此可见之前的架构图中的描述还是模糊且带有误导性
*). 支持singal的处理支持, 比如对ctrl+c中断, 需要两次才完全退出交互
*). 交互式命令处理模式

源码阅读
*). Signal类对象的使用,Singal
静态函数 Signal.handle(Singal singla, SingalHandler handler);
对signal函数的理解和看法, 对kill -9程序是无法捕获这类信号的,
Runtime.getRuntime().addShutdownHook()的局限性, 会遇到SIGKILL信号导致进程未能处理必要的清理工作

*). OptionBuilder
推崇链式编程+builder构建模式, 确实对命令行程序而言, 是非常好的处理模式

1     // -database database

2     options.addOption(OptionBuilder

3         .hasArg()

4         .withArgName("databasename")

5         .withLongOpt("database")

6         .withDescription("Specify the database to use")

7         .create());

apache.common.cli解析命令行:   heipark.iteye.com/blog/1397513
antlr处理命令行解析:  www.shangxueba.com/jingyan/99359.html

*). 可交互的shell如何编写
jline的学习和使用
whitesock.iteye.com/blog/692816

1 ConsoleReader reader = new ConsoleReader();

2 reader.setCompeletor(...);

3 while ( (line = reader.readLine("prompt>")) != null ) {

4     // handle(line);    

5 }

对jline处理流程的看法

    在Windows平台下,JLine通过自带的.dll文件初始化终端。jline.jar中包含了jline32.dll和jline64.dll,在Windows平台上使用的时候, JLine会自动将其解压缩到临时目录并进行加载。
    在Unix或者Max OS X平台下,JLine通过stty命令初始化终端。例如通过调用stty -icanon min 1将控制台设置为character-buffered模式。以及通过调用stty -echo禁止控制台回显。在修改终端的属性之前,JLine会对终端的属性进行备份,然后注册一个ShutdownHook,以便在程序退出时进行恢复。由于JVM在非正常退出时(例如收到SIGKILL信号)不保证ShutdownHook一定会被调用,因此终端的属性可能无法恢复。

 

*) cli的命令分类
source
list
quit/exit
! /bin/bash -c 'command'
hive的具体命令
---------------------
hive的具体命令又如下细分
#)Hive session配置相关命令
#)SQL相关的命令
参考url: www.cnblogs.com/ggjucheng/archive/2013/01/04/2844987.html

*). CommandProcessor类层次结构

 1 public final class CommandProcessorFactory {

 2     public static CommandProcessor get(String cmd, HiveConf conf);

 3 }

 4 

 5 public interface CommandProcessor {

 6     public void init();

 7     public CommandProcessorResponse run(String command) throws CommandNeedRetryException;

 8 }

 9 

10 //errorMessage & SQLState will be set only if responseCode is not zero

11 public class CommandProcessorResponse {

12     private int responseCode;

13     private String errorMessage;

14     private String SQLState;

15     private Schema resSchema;

16 }

一批具体的实现类
SetProcessor, ResetProcessor...
比较特殊的是Driver类, 封装了具体的功能

*). 主逻辑循环

while ( (line = readline()) != null ) {

    commands = parse(line);

    dispatch(commands);

    /*

    CommandProcessor processor = CommandProcessorFactory.get(command);

    CommandProcessorResponse response = processor.run(command);    

    handle(response);    

    */    

}


*) ClassLoader的使用方法
对类加载机制的理解和看法
blog.sina.com.cn/s/blog_5751ee0b0100g7bl.html
my.oschina.net/rouchongzi/blog/171046
blog.csdn.net/kabini/article/details/2975263

加密和安全
http://www.cnblogs.com/kanjingcai/archive/2009/04/30/1447265.html

你可能感兴趣的:(hive)