命令和 CLI
语言手册命令
命令是 non-SQL statements,例如设置 property 或添加资源。它们可以在 HiveQL 脚本中使用,也可以直接在CLI或Beeline中使用。
Sample 用法:
hive> set mapred.reduce.tasks=32;
hive> set;
hive> select a.* from tab1;
hive> !ls;
hive> dfs -ls;
Hive CLI
$HIVE_HOME/bin/hive 是一个 shell 实用程序,可用于以交互方式或批处理方式 run Hive 查询。
有利于 Beeline CLI 的弃用
HiveServer2(在 Hive 0.11 中引入)有自己的名为Beeline的 CLI,它是一个基于 SQLLine 的 JDBC client。由于新开发的重点是 HiveServer2,Hive CLI 很快就会被弃用支持 Beeline(HIVE-10511)。
请参阅 HiveServer2 文档中的使用 Beeline 替换 Hive CLI 的 Implementation和Beeline - 新命令 Line Shell。
Hive 命令 Line 选项
要获得帮助,请 run“hive -H”或“hive --help”。
用法(在 Hive 0.9.0 中):
usage: hive
-d,--define <key=value> Variable substitution to apply to Hive
commands. e.g. -d A=B or --define A=B
-e <quoted-query-string> SQL from command line
-f <filename> SQL from files
-H,--help Print help information
-h <hostname> Connecting to Hive Server on remote host
--hiveconf <property=value> Use value for given property
--hivevar <key=value> Variable substitution to apply to hive
commands. e.g. --hivevar A=B
-i <filename> Initialization SQL file
-p <port> Connecting to Hive Server on port number
-S,--silent Silent mode in interactive shell
-v,--verbose Verbose mode (echo executed SQL to the
console)
版本信息
从 Hive 0.10.0 开始,还有一个额外的命令 line 选项:
--database <dbname> Specify the database to use
注意:支持变体“-hiveconf”以及“–hiveconf”。
例子
有关使用hiveconf选项的示例,请参阅可变替代。
- 从命令 line 运行查询的示例
$HIVE_HOME/bin/hive -e 'select a.col from tab1 a'
- 设置 Hive configuration 变量的示例
$HIVE_HOME/bin/hive -e 'select a.col from tab1 a' --hiveconf hive.exec.scratchdir=/home/my/hive_scratch --hiveconf mapred.reduce.tasks=32
- 使用静默模式将数据从查询转储到文件中的示例
$HIVE_HOME/bin/hive -S -e 'select a.col from tab1 a' > a.txt
- 从本地磁盘运行脚本 non-interactively 的示例
$HIVE_HOME/bin/hive -f /home/my/hive-script.sql
- 从 Hadoop 支持的文件系统中运行脚本 non-interactively 的示例(从Hive 0.14开始)
$HIVE_HOME/bin/hive -f hdfs://<namenode>:<port>/hive-script.sql
$HIVE_HOME/bin/hive -f s3://mys3bucket/s3-script.sql
- 在进入交互模式之前 running 初始化脚本的示例
$HIVE_HOME/bin/hive -i /home/my/hive-init.sql
hiverc 文件
在没有-i选项的情况下调用 CLI 将尝试加载 H I V E H O M E / b i n / . h i v e r c 和 HIVE_HOME/bin/.hiverc 和 HIVEHOME/bin/.hiverc和HOME/.hiverc 作为初始化 files。
Logging
Hive 使用 log4j 进行 logging。默认情况下,这些日志不会发送到标准输出,而是捕获到 Hive 的 log4j properties 文件指定的 log 文件中。默认情况下,Hive 将在 Hive 安装的conf/目录中使用hive-log4j.default,该目录将日志写入/tmp//hive.log并使用WARN level。
通常需要将日志发送到标准输出 and/or 更改 logging level 以进行调试。这些可以通过命令 line 完成,如下所示:
$HIVE_HOME/bin/hive --hiveconf hive.root.logger=INFO,console
hive.root.logger指定 logging level 以及 log 目标。将console指定为目标会将日志发送到标准错误(而不是 log 文件)。
清除悬空划痕目录的工具
有关临时目录的信息,请参阅设置 HiveServer2 中的Scratch Directory Management,以及可以在 Hive CLI 和 HiveServer2 中使用的 command-line 用于删除悬空临时目录的工具。
Hive 批处理模式命令
当$HIVE_HOME/bin/hive与-e或-f选项一起运行时,它以批处理模式执行 SQL 命令。
- hive -e ''执行查询 string。
- hive -f 从文件执行一个或多个 SQL 查询。
Version 0.14
从 Hive 0.14 开始,可以来自 Hadoop 支持的文件系统之一(HDFS,S3,etc.))。
$HIVE_HOME/bin/hive -f hdfs://<namenode>:<port>/hive-script.sql $HIVE_HOME/bin/hive -f s3://mys3bucket/s3-script.sql
Hive Interactive Shell 命令
当$HIVE_HOME/bin/hive在没有-e或-f选项的情况下运行时,它将进入交互式 shell 模式。
使用 ”;” (分号)终止命令。可以使用“ - ”前缀指定脚本中的注释。
Sample 用法:
hive> set mapred.reduce.tasks=32;
hive> set;
hive> select a.* from tab1;
hive> !ls;
hive> dfs -ls;
Hive 资源
Hive 可以管理向 session 添加资源,其中这些资源需要在查询执行 time 时提供。资源可以是 files,jars 或 archives。可以将任何本地可访问的文件添加到 session。
将资源添加到 session 后,Hive 查询可以通过其 name(在 map/reduce/transform 子句中)引用它,并且资源在整个 Hadoop cluster 上的执行 time 时在本地可用。 Hive 使用 Hadoop 的分布式缓存在查询执行 time 时将添加的资源分发到 cluster 中的所有计算机。
用法:
ADD { FILE[S] | JAR[S] | ARCHIVE[S] } <filepath1> [<filepath2>]*
LIST { FILE[S] | JAR[S] | ARCHIVE[S] } [<filepath1> <filepath2> ..]
DELETE { FILE[S] | JAR[S] | ARCHIVE[S] } [<filepath1> <filepath2> ..]
- FILE 资源只是添加到分布式缓存中。通常,这可能类似于要执行的转换脚本。
- JAR 资源也被添加到 Java classpath 中。这在 reference objects 中是必需的,它们包含诸如 UDF 之类的对象。有关自定义 UDF 的更多信息,请参见Hive 插件。
- ARCHIVE 资源会自动取消归档,作为分发它们的一部分。
例:
hive> add FILE /tmp/tt.py;
hive> list FILES;
/tmp/tt.py
hive> select from networks a
MAP a.networkid
USING 'python tt.py' as nn where a.ds = '2009-01-04' limit 10;
Version 1.2.0
从Hive 1.2.0开始,可以使用 ivy://group:module:version 形式的常春藤 URL 添加和删除资源? querystring。
- group - 模块来自哪个模块 group。直接转换为 Maven groupId 或 Ivy Organization。
- module - 要加载的模块的 name。直接转换为 Maven artifactId 或 Ivy artifact。
- version - 要使用的模块的 version。可以使用任何 version 或*(最新)或 Ivy 范围。
可以在 querystring 中传递各种参数,以配置如何以及将哪些 jars 添加到工件中。参数采用 key value 对的形式,由’&'分隔。
用法:
ADD { FILE[S] | JAR[S] | ARCHIVE[S] } <ivy://org:module:version?key=value&key=value&...> <ivy://org:module:version?key=value&key1=value1&...>*
DELETE { FILE[S] | JAR[S] | ARCHIVE[S] } <ivy://org:module:version> <ivy://org:module:version>*
此外,我们可以在相同的 ADD 和 DELETE 命令中混合使用和。
ADD { FILE[S] | JAR[S] | ARCHIVE[S] } { <ivyurl> | <filepath> } <ivyurl>* <filepath>*
DELETE { FILE[S] | JAR[S] | ARCHIVE[S] } { <ivyurl> | <filepath> } <ivyurl>* <filepath>*
可以传递的不同参数是:
- exclude:以 org:module 形式使用逗号分隔的 value。
- transitive:取值 true 或 false。默认为 true。当 transitive = true 时,将下载所有传递依赖项并将其添加到 classpath。
- ext:要添加的文件的扩展名。 'jar’默认情况下。
- 分类器:要解析的 maven 分类器。
例子:
hive>ADD JAR ivy://org.apache.pig:pig:0.10.0?exclude=org.apache.hadoop:avro;
hive>ADD JAR ivy://org.apache.pig:pig:0.10.0?exclude=org.apache.hadoop:avro&transitive=false;
除非某些依赖项由其他资源共享,否则 DELETE 命令将删除资源及其所有传递依赖项。如果两个资源共享一组传递依赖项,并且使用 DELETE 语法删除其中一个资源,则除了共享的资源外,将删除资源的所有传递依赖项。
例子:
hive>ADD JAR ivy://org.apache.pig:pig:0.10.0
hive>ADD JAR ivy://org.apache.pig:pig:0.11.1.15
hive>DELETE JAR ivy://org.apache.pig:pig:0.10.0
如果 A 是包含 pig-0.10.0 的传递依赖性的集合,并且 B 是包含 pig-0.11.1.15 的传递依赖性的集合,则在执行上述命令之后,将删除 A-(A 交集 B)。
有关详细信息,请参阅HIVE-9664。
如果转换脚本中使用的 files 已经在 Hadoop cluster 中使用相同路径 name 的所有计算机上可用,则不必将 files 添加到 session。例如:
- … MAP a.networkid USING ‘wc -l’ …
这里wc是所有机器上都可用的可执行文件。 - … MAP a.networkid USING ‘/home/nfsserv1/hadoopscripts/tt.py’ …
这里tt.py可以通过在所有 cluster 节点上配置相同的 NFS 挂载点访问。
请注意,Hive configuration 参数还可以指定 jars,files 和 archives。有关更多信息,请参见Configuration 变量。
HCatalog CLI
HCatalog 随 Hive 一起安装,从 Hive release 0.11.0 开始。
许多(但不是全部)hcat命令可以作为hive命令发出,反之亦然。有关详细信息,请参阅HCatalog 手册中的 HCatalog 命令 Line 接口文档。
Beeline - 命令 Line Shell
此页面描述了HiveServer2支持的不同 clients。 HiveServer2 的其他文档包括:
- HiveServer2 概述
- 设置 HiveServer2
- Hive Configuration Properties:HiveServer2
版
在 Hive version 0.11 中引入。见HIVE-2935。
Beeline - 命令 Line Shell
HiveServer2 支持与 HiveServer2 一起使用的命令 shell Beeline。它是一个基于 SQLLine CLI(http://sqlline.sourceforge.net/)的 JDBC client。 SQLLine 的详细文件也适用于 Beeline。
使用 Beeline 替换 Hive CLI 的 Implementation
Beeline shell 既可以在嵌入模式下工作,也可以在 remote 模式下工作。在嵌入模式下,它运行嵌入式 Hive(类似于Hive CLI),而 remote 模式用于连接到 Thrift 上的单独 HiveServer2 process。从Hive 0.14开始,当 Beeline 与 HiveServer2 一起使用时,它还会从 HiveServer2 打印 log 消息,以查询它对 STDERR 执行的查询。 Remote HiveServer2 模式建议用于 production 使用,因为它更安全,不需要为用户授予直接的 HDFS/metastore 访问权限。
在 remote 模式下,HiveServer2 只接受有效的 Thrift calls - 即使在 HTTP 模式下,消息体也包含 Thrift 有效负载。
Beeline示例
% bin/beeline
Hive version 0.11.0-SNAPSHOT by Apache
beeline> !connect jdbc:hive2://localhost:10000 scott tiger
!connect jdbc:hive2://localhost:10000 scott tiger
Connecting to jdbc:hive2://localhost:10000
Connected to: Hive (version 0.10.0)
Driver: Hive (version 0.10.0-SNAPSHOT)
Transaction isolation: TRANSACTION_REPEATABLE_READ
0: jdbc:hive2://localhost:10000> show tables;
show tables;
+-------------------+
| tab_name |
+-------------------+
| primitives |
| src |
| src1 |
| src_json |
| src_sequencefile |
| src_thrift |
| srcbucket |
| srcbucket2 |
| srcpart |
+-------------------+
9 rows selected (1.079 seconds)
您还可以在命令 line 上指定连接参数。这意味着您可以从 UNIX shell 历史记录中找到带有连接 string 的命令。
% beeline -u jdbc:hive2://localhost:10000/default -n scott -w password_file
Hive version 0.11.0-SNAPSHOT by Apache
Connecting to jdbc:hive2://localhost:10000/default
Beeline与 NoSASL 连接
如果您想通过 NOSASL 模式进行连接,则必须明确指定身份验证模式:
% bin/beeline beeline> !connectjdbc:hive2://<host>:<port>/<db>;auth=noSasl hiveuser pass
HiveServer2 Logging
从 Hive 0.14.0 开始,HiveServer2 操作日志可用于 Beeline clients。这些参数配置 logging:
- hive.server2.logging.operation.enabled
- hive.server2.logging.operation.log.location
- hive.server2.logging.operation.verbose(Hive 0.14 to 1.1)
- hive.server2.logging.operation.level(Hive 1.2 向前)
HIVE-11488(Hive 2.0.0)将 logging queryId 和 sessionId 的支持添加到 HiveServer2 log 文件中。要启用它,edit/add%X {。 435}和%X {。 436}到 logging configuration 文件的 pattern 格式 string。
取消查询
当用户在 Beeline shell 上输入CTRL+C时,如果有一个查询在同一 time 运行运行,则 Beeline 会在关闭与 HiveServer2 的 socket 连接时尝试取消查询。仅当hive.server2.close.session.on.disconnect设置为true时才会启用此行为。从 Hive 2.2.0(HIVE-15626)开始当用户输入CTRL+C时,当取消 running 查询时,Beeline 不会退出命令 line shell。如果用户希望退出 shell,则在取消查询时,可以在第二个 time 输入CTRL+C。但是,如果当前没有查询 running,则第一个CTRL+C将退出 Beeline shell。此行为类似于 Hive CLI 处理CTRL+C的方式。
!quit是退出 Beeline shell 的推荐命令。
终端脚本中的后台查询
可以使用 nohup 和 disown 等命令将 Beeline 与终端 run 断开连接以进行批处理和自动化脚本。
某些版本的 Beeline client 可能需要一种解决方法,允许 nohup 命令在不停止的情况下将 Beeline process 正确放入后台。见HIVE-11717,H IVE-6758。
可以更新以下环境变量:
export HADOOP_CLIENT_OPTS="$HADOOP_CLIENT_OPTS -Djline.terminal=jline.UnsupportedTerminal"
Running with nohangup(nohup)和&符号(&)将 process 放在后台并允许终端断开连接,同时保持 Beeline process running。
nohup beeline --silent=true --showHeader=true --outputformat=dsv -f query.hql </dev/null > /tmp/output.log 2> /tmp/error.log &