使用 Beeline 替代 Hive CLI 的实现

为什么要替换现有的 Hive CLI?

Hive CLI是旧版工具,主要有两个用例。第一个是它用作 Hadoop 上 SQL 的胖 Client 端,第二个是它用作 Hive Server(原始的 Hive 服务器,现在通常称为“ HiveServer1”)的命令行工具。从 Hive 1.0.0(HIVE-6977)开始,Hive Server 已被弃用,并已从 Hive 代码库中删除,并已替换为 HiveServer2(HIVE-2935),因此第二个用例不再适用。对于第一个用例,Beeline提供或应该提供相同的功能,但实现方式与 Hive CLI 不同。

理想情况下,不建议使用 Hive CLI,因为 Hive 社区长期以来建议使用 Beeline plus HiveServer2 配置。但是,由于 Hive CLI 的广泛使用,我们改为在 Beeline 以及嵌入式 HiveServer2(HIVE-10511)之上用新的 Hive CLI 替换 Hive CLI 的实现,以便 Hive 社区只需要维护一个代码路径。这样,新的 Hive CLI 在 Shell 脚本级别和高代码级别都只是 Beeline 的别名。目标是使用 Hive CLI 对现有用户脚本进行更改或不需要进行任何更改。

Hive CLI 功能支持

我们在 Beeline 之上使用新的 Hive CLI 来实现 Hive CLI 功能。由于新的 Hive CLI 不支持某些现有的 Hive CLI 功能,因此默认情况下,我们使用的是旧的 HiveClient 端实现。使用以下命令指定新的基于 Beeline 的 Hive CLI 工具:

export USE_DEPRECATED_CLI=false

请注意,log4j 配置文件已更改为“ beeline-log4j.properties”。

Hive CLI 选项支持

要获取帮助,请运行“ hive -H”或“ hive --help”。

usage: hive
 -d,--define <key=value>          Variable subsitution to apply to hive
                                  commands. e.g. -d A=B or --define A=B
    --database <databasename>     Specify the database to use
 -e <quoted-query-string>         SQL from command line
 -f <filename>                    SQL from files
 -H,--help                        Print help information
    --hiveconf <property=value>   Use value for given property
    --hivevar <key=value>         Variable subsitution to apply to hive
                                  commands. e.g. --hivevar A=B
 -i <filename>                    Initialization SQL file
 -S,--silent                      Silent mode in interactive shell
 -v,--verbose                     Verbose mode (echo executed SQL to the
                                  console)

Examples

  • 从命令行运行查询的示例
$HIVE_HOME/bin/hive -e 'select a.foo from pokes a'
  • 设置 Hive 配置变量的示例
$HIVE_HOME/bin/hive -e 'select a.foo from pokes a' --hiveconf hive.exec.scratchdir=/opt/my/hive_scratch --hiveconf mapred.reduce.tasks=1
  • 使用静默模式将数据从查询中转储到文件中的示例
$HIVE_HOME/bin/hive -S -e 'select a.foo from pokes a' > a.txt
  • 从本地磁盘非交互运行脚本的示例
$HIVE_HOME/bin/hive -f /home/my/hive-script.sql
  • 从 Hadoop 支持的文件系统非交互地运行脚本的示例(从Hive 0.14开始)
$HIVE_HOME/bin/hive -f hdfs://<namenode>:<port>/hive-script.sql

Hive CLI 交互式 Shell 命令支持

如果没有使用-e-f选项运行$HIVE_HOME/bin/hive,它将进入交互式 shell 模式。

用 ”;” (分号)终止命令。脚本中的 Comments 可以使用“-”前缀指定。

CommandDescription
quit

exit
使用 quit 或 exit 离开交互式 Shell。
reset将配置重置为默认值(从 Hive 0.10 开始:请参见HIVE-3202)。
set<key> =<value>设置特定配置变量(键)的值。
注意: 如果您拼写错误的变量名,则 CLI 不会显示错误。
set打印由用户或 Hive 覆盖的配置变量列表。
set -v打印所有 Hadoop 和 Hive 配置变量。
添加文件[S]<filepath><filepath> *
添加 JAR [S]<filepath><filepath> *
添加 ARCHIVE [S]<filepath><filepath> *
将一个或多个文件,jar 或 Files 添加到分布式缓存中的资源列表中。有关更多信息,请参见Hive Resources
添加文件[S]<ivyurl><ivyurl> *
添加 JAR [S]<ivyurl><ivyurl> *
Hive 1.2.0开始,添加 ARCHIVE [S]<ivyurl><ivyurl> *
,使用ivy://group:module:version?query_string形式的Ivy URL 将一个或多个文件,jar 或存档添加到分布式缓存中的资源列表中。有关更多信息,请参见Hive Resources
list FILE[S]
list JAR[S]
list ARCHIVE [S]
列出已经添加到分布式缓存的资源。有关更多信息,请参见Hive Resources
列出文件[S]<filepath> *
列出 JAR [S]<filepath> *
list ARCHIVE [S]<filepath> *
检查给定资源是否已经添加到分布式缓存中。有关更多信息,请参见Hive Resources
删除文件[S]<filepath> *
删除 JAR [S]<filepath> *
删除 ARCHIVE [S]<filepath> *从分布式缓存中删除资源。
删除文件[S]<ivyurl><ivyurl> *
删除 JAR [S]<ivyurl><ivyurl> *
delete ARCHIVE [S]<ivyurl><ivyurl> *
Hive 1.2.0开始,从分布式缓存中删除使用\ 添加的资源。有关更多信息,请参见Hive Resources
!<command>从 Hive shell 执行 shell 命令。
dfs<dfs command>从 Hive shell 执行 dfs 命令。
<query string>执行 Hive 查询并将结果打印到标准输出中。
source FILE<filepath>在 CLI 内执行脚本文件。

Shell 命令示例:

hive> source /root/test.sql;
hive> show tables;
test1
test2
hive> exit;
hive> quit;
hive> set;
hive> set hive.cli.print.header=true;
hive> set -v;
hive> reset;
hive> add file /opt/a.txt;
Added resources: [/opt/a.txt]
hive> list files;
/opt/a.txt
hive> delete file /opt/a.txt;
hive> add jar /usr/share/vnc/classes/vncviewer.jar;
Added [/usr/share/vnc/classes/vncviewer.jar]to class path
Added resources:[/usr/share/vnc/classes/vncviewer.jar]
hive> list jars;
/usr/share/vnc/classes/vncviewer.jar
hive> delete jar /usr/share/vnc/classes/vncviewer.jar;
hive> !ls;
bin
conf
hive> dfs -ls / ;
Found 2 items
drwx-wx-wx  - root supergroup  0   2015-08-12 19:06 /tmp
drwxr-xr-x  - root supergroup  0   2015-08-12 19:43 /user
hive> select * from pokes; 
OK
pokes.foo   pokes.bar
238         val_238
86          val_86
311         val_311
hive>source /opt/s.sql;

Hive CLI 配置支持

Configuration Name在新的 Hive CLI 中受支持Description
hive.cli.print.headerYes是否打印查询输出中的列名。 HIVE-11624
hive.cli.errors.ignoreYes发生错误时是否强制执行脚本。 HIVE-11191
hive.cli.promptYes命令行提示符配置值。可以在此配置值中使用其他 hiveconf。 HIVE-11226
hive.cli.pretty.output.num.colsYes格式化 DESCRIBE PRETTY * table_name *命令生成的输出时要使用的列数。 HIVE-11779
hive.cli.print.current.dbYes是否在 Hive 提示中包括当前数据库。 HIVE-11637

Performance Impacts

使用 JMH 来度量检索数据集时的平均时间成本,我们得到以下结果。

Benchmark                                                       Mode  Samples           Score   Error  Units
o.a.h.b.c.CliBench.BeeLineDriverBench.testSQLWithInitialFile    avgt        1  1713326099.000 ?  NaN  ns/op
o.a.h.b.c.CliBench.CliDriverBench.testSQLWithInitialFile        avgt        1  1852995786.000 ?  NaN  ns/op

分数越低越好,因为我们正在评估时间成本。在检索数据方面没有明显的性能差距。