日复一日伐树的熊哥

日复一日伐树的熊哥

命令和 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/.hivercHOME/.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 &
10-22 06:36