首页 > 代码库 > Hive cli源码阅读和梳理

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