Hive命令和CLI(三)

Beeline – 命令行Shell

HiveServer2支持命令行工具Beeline, Beeline是一个基于SQLLine CLI的JDBC客户端。 SQLLine的使用规则也适用于Beeline。Beeline shell 既可以在本地模式下工作,也可以在远程模式下工作。在本地模式下,运行本地的Hive(类似于Hive CLI),而远程模式用于通过Thrift连接到单独的HiveServer2进程。从Hive 0.14开始,当Beeline与HiveServer2一起使用时,它还会打印HiveServer2的日志消息,以查询执行到STDERR的操作。建议将远程HiveServer2模式用于生产环境,因为它更安全并且不需要为用户授予直接HDFS /元存储访问权限。在远程模式下,HiveServer2仅接受有效的Thrift调用-即使在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)

也可以在命令行上指定连接参数。 这意味着可以从UNIX Shell历史记录中找到带有连接字符串的命令。例如:

% 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

beeline命令

命令 描述
! SQLLine命令列表。 例如:!quit退出 Beeline client。
!分界 为Beeline编写的查询设置分隔符。允许使用多字符分隔符,但不允许使用引号,斜杠和 - 。默认为; 用法:!delimiter $$

beeline Hive命令

当使用 Hive JDBC 驱动程序时,Hive 特定命令(与Hive CLI 命令相同)可以在Beeline 中运行。使用“;”(分号)终止命令。可以使用“--”前缀指定脚本中的注释。

命令 描述
reset 将 configuration 重置为默认值。
reset 将特定 configuration 变量(key)的 value 重置为默认 value。
**注意:**如果拼错变量 name,Beeline 不会显示错误。
set = 设置特定 configuration 变量(key)的 value。
**注意:**如果拼错变量 name,Beeline 不会显示错误。
set 打印由用户或 Hive 覆盖的 configuration 变量列表。
set -v 打印所有 Hadoop 和 Hive configuration 变量。
add FILE[S] *
add JAR[S] *
add ARCHIVE[S] *
将一个或多个 files,jars 或 archives 添加到分布式缓存中的资源列表中。
add FILE[S] *
add JAR[S] *
add ARCHIVE[S] *
从Hive 1.2.0开始,使用 ivy://group:module:version?query_string 形式的ivy URL 将一个或多个 files,jars 或 archives 添加到分布式缓存中的资源列表中。
list FILE[S]
list JAR[S]
list ARCHIVE[S]
列出已添加到分布式缓存的资源。
list FILE[S] * list JAR[S] * list ARCHIVE[S] * 检查给定资源是否已添加到分布式缓存中。
delete FILE[S] *
delete JAR[S] *
delete ARCHIVE[S] *
从分布式缓存中删除资源。
delete FILE[S] *
delete JAR[S] *
delete ARCHIVE[S] *
从Hive 1.2.0开始,删除使用从分布式缓存添加的资源。
reload 从Hive 0.14.0开始,使HiveServer2知道配置参数hive.reloadable.aux.jars.path指定的路径中的任何jar变化(无需重新启动HiveServer2)。
dfs 执行 dfs 命令。
执行 Hive 查询并将结果打印到标准输出。

beeline命令选项

选项 描述
-u 要连接的 JDBC URL。如果需要,参数值中的特殊字符应使用 URL 编码进行编码。 用法:beeline -u db_URL
-r 重新连接到上次使用的 URL(如果用户以前使用!connect到 URL 并使用!save到 beeline.properties 文件)。 用法:beeline -r
-n 要连接的用户名。 用法:beeline -n valid_user
-p 连接密码为 。 用法:beeline -p valid_password 可选密码模式: 启动 Hive 2.2.0 -p 选项的参数是可选的。 用法:beeline -p [148] 如果在-p Beeline 之后未提供密码,则会在启动连接时提示输入密码。当提供密码时,Beeline 使用它启动连接而不提示。
-d 要使用的驱动程序 class。 用法:beeline -d driverclass
-e 应该执行的查询。双或单引号括起查询 string。可以多次指定此选项。 用法:beeline -e "querystring", 支持 run 多个 SQL语句,每个 querystring 用分号分隔。
-f 应该执行的脚本文件。 用法:beeline -f filepath。
-i(或)–init init files 用于初始化 用法:beeline -i /tmp/initfile
-w(或)–password-file 从中读取密码的密码文件。
-a(或)–authType 身份验证类型作为 auth property Version 传递给 jdbc。
–property-file 从文件读取 configuration properties的 用法:beeline --property-file /tmp/a
–hiveconf property = value 对给定的 configuration property 使用 value。hive.conf.restricted.list中列出的 Properties 无法使用hiveconf重置。 用法:beeline --hiveconf prop1 = value1
–hivevar name = value Hive 变量 name 和 value。这是一个 Hive-specific 设置,其中变量可以在 session level 中设置并在 Hive 命令或查询中引用。用法:beeline --hivevar var1 = value1
–color = [true/false] 控制是否使用颜色进行显示。默认为 false。 用法:beeline --color=true (Separated-Value 输出格式不支持。
–showHeader = [true/false] 在查询结果中显示列名(true)或不显示(false)。默认为 true。 用法:beeline --showHeader=false
–headerInterval =Rows outputformat为 table 时,以行数重新显示列 headers 的时间间隔。默认值为 100. 用法:beeline --headerInterval=50
–fastConnect = [true/false] 当 connecting 时,跳过 building 为 tab-completion 的 HiveQL statements(true)或 build 列表(false)的所有表和列的列表。默认为 true。 用法:beeline --fastConnect=false
–autoCommit = [true/false] Enable/disable 自动 transaction 提交。默认为 false。 用法:beeline --autoCommit=true
–verbose = [true/false] 显示详细错误消息和调试信息(true)或不显示(false)。默认为 false。 用法:beeline --verbose=true
–showWarnings = [true/false] 显示发出任何 HiveQL 命令后在连接上报告的警告。默认为 false。 用法:beeline --showWarnings=true
–showDbInPrompt = [true/false] 在提示符中显示当前数据库 name。默认为 false。 用法:beeline --showDbInPrompt=true
–showNestedErrs = [true/false] 显示嵌套错误。默认为 false。 用法:beeline --showNestedErrs=true
–numberFormat = [pattern] 使用DecimalFormat模式格式化数字。 用法:beeline --numberFormat="#,###,##0.00"
–force = [true/false] 即使出现错误(true)或不继续(false)也继续运行脚本。 默认为false。用法:beeline--force=true
–maxWidth = MAXWIDTH 截断数据前显示的最大宽度,以字符为单位,当outputformat为 table 时。默认是查询终端当前宽度,然后回退到 80。用法:beeline --maxWidth=150
–maxColumnWidth = MAXCOLWIDTH outputformat为 table 时的最大列宽(以字符为单位)。 默认值为 50 或早期版本中为 15。 用法:beeline --maxColumnWidth=25
–silent = [true/false] 减少显示的信息量(true)或不减少(false)。它还会停止显示来自 HiveServer2和 HiveQL 命令的查询的日志消息。默认为 false。 用法:beeline --silent=true
–autosave = [true/false] 自动保存首选项(true)或不自动保存(false)。默认为 false。 用法:beeline --autosave=true
–outputformat = [table/vertical/csv/tsv/dsv/csv2/tsv2] 结果显示的格式模式。默认为 table。用法:beeline --outputformat=tsv
- truncateTable = [true/false] 如果 true,当 console 超过 console 长度时,会截断 console 中的 table 列。
–delimiterForDSV = DELIMITER delimiter-separated 值的分隔符输出格式。默认为’|‘
–isolation = LEVEL 将 transaction isolation level 设置为 TRANSACTION_READ_COMMITTED 或 TRANSACTION_SERIALIZABLE。用法:beeline --isolation=TRANSACTION_SERIALIZABLE
–nullemptystring = [true/false] 使用将 null 作为空 string(true)打印的历史行为,或使用将 null 作为 NULL(false)打印的当前行为。默认为 false。 用法:beeline --nullemptystring=false
–incremental = [true/false] 在默认为false .之前默认为true,设置为false时,整个结果集在显示之前被提取和缓冲,从而产生最佳的显示列大小。设置为true时,结果行会在获取时立即显示,从而以额外显示列填充的价格产生较低的延迟和 memory 使用率。如果在 client 端遇到 OutOfMemory,则建议设置--incremental=true(由于获取的结果集大小很大)。
–incrementalBufferRows = NUMROWS 在 stdout 上打印行时要缓冲的行数,默认为 1000;仅适用于--incremental=true--outputformat=table 用法:beeline --incrementalBufferRows=1000
–maxHistoryRows = NUMROWS store Beeline 历史记录的最大行数。
–delimiter =; 为以直线编写的查询设置分隔符。允许使用多字符分隔符,但不允许使用引号,斜杠和 - 。默认为; 用法:beeline --delimiter=$$
–convertBinaryArrayToString = [true/false] 将二进制列数据显示为 string 或 byte array。 用法:beeline --convertBinaryArrayToString=true
–help 显示用法消息。 用法:beeline --help

输出格式

在beeline中,结果可以以不同的格式显示。可以使用outputformat选项设置格式模式。

支持以下输出格式:

  • table
  • vertical
  • xmlattr
  • xmlelements
  • separated-value formats (csv, tsv, csv2, tsv2, dsv)
table

结果显示在 table 中。结果的一行对应于 table 中的一行,而一行中的值显示在 table 的不同列中。
这是默认格式模式。

例如:

查询结果select id, value, comment from test_table

+-----+---------+-----------------+
| id  |  value  |     comment     |
+-----+---------+-----------------+
| 1   | Value1  | Test comment 1  |
| 2   | Value2  | Test comment 2  |
| 3   | Value3  | Test comment 3  |
+-----+---------+-----------------+
vertical

结果的每一行都以 key-value 格式的块显示,其中键是列的名称。

例如

查询结果select id, value, comment from test_table

id       1
value    Value1
comment  Test comment 1

id       2
value    Value2
comment  Test comment 2

id       3
value    Value3
comment  Test comment 3
xmlattr

结果以 XML 格式显示,其中每一行都是 XML 中的“result”元素。行的值在“result”元素上显示为属性。属性的名称是列的名称。

例如

查询结果select id, value, comment from test_table

<resultset>
  <result id="1" value="Value1" comment="Test comment 1"/>
  <result id="2" value="Value2" comment="Test comment 2"/>
  <result id="3" value="Value3" comment="Test comment 3"/>
resultset>

xmlelements

结果以 XML 格式显示,其中每一行都是 XML 中的“result”元素。行的值显示为 result 元素的 child 元素。
例如

查询结果select id, value, comment from test_table

<resultset>
  <result>
    <id>1id>
    <value>Value1value>
    <comment>Test comment 1comment>
  result>
  <result>
    <id>2id>
    <value>Value2value>
    <comment>Test comment 2comment>
  result>
  <result>
    <id>3id>
    <value>Value3value>
    <comment>Test comment 3comment>
  result>
resultset>

Separated-Value 输出格式

行的值由不同的分隔符分隔。有五种 separated-value 输出格式:csv,tsv,csv2,tsv2 和 dsv。

csv2,tsv2,dsv

从Hive 0.14开始,可以使用改进的 SV 输出格式,即 dsv,csv2 和 tsv2。这三种格式仅与单元格之间的分隔符不同,csv2 为逗号,tsv2 为 tab,dsv 为可配置。对于 dsv 格式,可以使用delimiterForDSV选项设置分隔符。默认分隔符为“|”。请注意,仅支持单个字符分隔符。
例如

查询结果select id, value, comment from test_table

CSV2

id,value,comment
1,Value1,Test comment 1
2,Value2,Test comment 2
3,Value3,Test comment 3

TSV2

id	value	comment
1	Value1	Test comment 1
2	Value2	Test comment 2
3	Value3	Test comment 3

dsv(分隔符是|)

id|value|comment
1|Value1|Test comment 1
2|Value2|Test comment 2
3|Value3|Test comment 3
在 csv2,tsv2 和 dsv 格式中引用

如果未禁用引用,则在 value 周围添加双引号(如果它包含特殊字符(例如分隔符或双引号字符)或 spans multiple lines)。嵌入的双引号使用前面的双引号进行转义。可以通过将disable.quoting.for.sv系统变量设置为 true 来禁用引用。如果禁用引用,则不会在值周围添加 双引号(即使它们包含特殊字符),并且不会转义嵌入的双引号。默认情况下,引用被禁用。
例如

查询结果select id, value, comment from test_table

csv2,引用已启用

id,value,comment
1,"Value,1",Value contains comma
2,"Value""2",Value contains double quote
3,Value'3,Value contains single quote

csv2,引用被禁用

id,value,comment
1,Value,1,Value contains comma
2,Value"2,Value contains double quote
3,Value'3,Value contains single quote
csv,tsv

这两种格式的区别仅在于值之间的分隔符,即 csv 的逗号和 tsv 的 tab。即使引号被disable.quoting.for.sv系统变量禁用,值也始终用单引号字符包围。这些输出格式不会逃避嵌入的单引号。请注意,这些输出格式已弃用,仅为了向后兼容而维护。
例如

查询结果select id, value, comment from test_table

CSV

'id','value','comment'
'1','Value1','Test comment 1'
'2','Value2','Test comment 2'
'3','Value3','Test comment 3'

TSV

'id'	'value'	'comment'
'1'	'Value1'	'Test comment 1'
'2'	'Value2'	'Test comment 2'
'3'	'Value3'	'Test comment 3'

HiveServer2日志

从 Hive 0.14.0 开始,HiveServer2 操作日志可用于 Beeline客户端。这些参数配置 logging:

  • hive.server2.logging.operation.enabled
  • hive.server2.logging.operation.log.location
  • hive.server2.logging.operation.verbose
  • hive.server2.logging.operation.level

HIVE-11488将 logging queryId 和 sessionId 的支持添加到 HiveServer2日志文件中。要启用它,将%X和%X编辑/添加到日志记录配置文件的模式格式字符串中。

取消查询

当用户在 Beeline shell 上输入CTRL+C时,如果有一个查询在同一 time 运行运行,则 Beeline 会在关闭与 HiveServer2 的 socket 连接时尝试取消查询。仅当hive.server2.close.session.on.disconnect设置为true时才会启用此行为。从 Hive 2.2.0开始当用户输入CTRL+C时,当取消 running 查询时,Beeline 不会退出命令行 shell。如果用户希望退出命令行Shell,则可以在取消查询时第二次输入CTRL + C。但是,如果当前没有查询在运行,则第一个CTRL + C将退出Beeline Shell。 此行为类似于Hive CLI处理CTRL + C的方式。

!quit是退出 Beeline shell 的推荐命令。

终端脚本中的后台查询

可以使用 nohup 和 disown 等命令将 Beeline 与终端 run 断开连接以进行批处理和自动化脚本。某些版本的 Beeline客户端可能需要一种解决方法,允许 nohup 命令在不停止的情况下将 Beeline 程序正确放入后台。

可以更新以下环境变量:

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 &

JDBC

HiveServer2 有一个 JDBC 驱动程序。它支持对 HiveServer2 的本地和远程访问。远程HiveServer2 模式建议用于生产环境使用,因为它更安全,不需要为用户授予直接 HDFS/metastore 访问权限。

连接 URL
连接 URL 格式

HiveServer2 URL 是一个 string,语法如下:

jdbc:hive2://:,:/dbName;initFile=;sess_var_list?hive_conf_list#hive_var_list

其中

  • :,:是要连接的服务器实例或以逗号分隔的服务器实例列表(如果启用了动态服务发现)。如果为空,将使用本地服务器。
  • dbName是初始数据库的 name。
  • 是 init 脚本文件的路径。该脚本文件使用SQL语句编写,将在连接后自动执行。
  • sess_var_list是会话变量的键=值对的分号分隔列表(例如,user=foo;password=bar)
  • hive_conf_list是此会话的Hive配置变量的键=值对的分号分隔列表
  • hive_var_list是此会话的Hive变量的键=值对的分号分隔列表。

如果需要,sess_var_list, hive_conf_list, hive_var_list参数值中的特殊字符应根据需要使用URL编码进行编码。

远程或本地模式连接 URL

JDBC 连接 URL 格式的前缀为jdbc:hive2://,Driver class 为org.apache.hive.jdbc.HiveDriver。请注意,这与旧的HiveServer不同。

  • 对于远程服务器,URL 格式为jdbc:hive2://:/;initFile=(HiveServer2 的默认 port 为 10000)。
  • 对于本地服务器,URL 格式为jdbc:hive2:///;initFile=(无 host 或 port)。

initFile选项在Hive 2.2.0及更高版本中可用。

当 HiveServer2 在 HTTP 模式下运行时连接 URL

JDBC 连接 URL:jdbc:hive2://:/;transportMode=http;httpPath=,其中:

  • 是hive-site.xml中配置的相应 HTTP 端点。默认 value 是cliservice。
  • HTTP 传输模式的默认 port 是 10001。

在0.14版本前,这些参数过去分别被称为hive.server2.transport.modehive.server2.thrift.http.path,并且是 hive_conf_list 的一部分。这些版本已被弃用,以支持新版本(它们是 sess_var_list 的一部分),但现在仍在继续使用。

在 HiveServer2 中启用 SSL 时的连接 URL

JDBC 连接 URL:jdbc:hive2://:/;ssl=true;sslTrustStore=;trustStorePassword=,其中:

  • 是 client 的信任库文件所在的路径。
  • 是访问信任库的密码。

在 HTTP 模式下:jdbc:hive2://:/;ssl=true;sslTrustStore=;trustStorePassword=;transportMode=http;httpPath=

启用 ZooKeeper 服务开发时连接 URL

Hive 0.14.0中引入的 基于ZooKeeper开发服务可实现 HiveServer2 的高可用性和滚动升级。需要使用指定的 JDBC URL 来使用这些属性。

随着 Hive 2.0.0 和 1.3.0的进一步更改,需要指定其他 configuration 参数,例如身份验证模式,传输模式或 SSL 参数,因为它们是从 ZooKeeper 条目和主机名一起检索的。

JDBC 连接 URL:jdbc:hive2:///;serviceDiscoveryMode=zooKeeper;zooKeeperNamespace=hiveserver2

与 HiveServer2 使用的 hive-site.xml/hivserver2-site.xml 中 hive.zookeeper.quorum configuration 参数的 value 相同。

可以通过以下方式在URL中提供查询所需的其他运行时参数,方法是像以前一样将其附加为?

JDBC 连接 URL:jdbc:hive2:///;serviceDiscoveryMode=zooKeeper;zooKeeperNamespace=hiveserver2?tez.queue.name=hive1&hive.server2.thrift.resultset.serialize.in.tasks=true

命名连接 URL

从 Hive 2.1.0开始,Beeline 还通过使用环境变量来支持命名的 URL 连接 strings。如果您尝试将!connect设置为不像 URL 的 name,则 Beeline 将尝试查看是否存在名为 BEELINE_URL_ 的环境变量。例如,如果指定!connect blue,它将查找 BEELINE_URL_BLUE,并使用它进行连接。这应该使系统管理员更容易为用户指定环境变量,并且用户无需在每个 time 时键入完整的 URL 进行连接。

重新连接

传统上,!reconnect已经努力刷新已经建立的连接。 !close运行后,无法进行全新连接。从 Hive 2.1.0开始,Beeline 会记住在 session 中成功连接的最后一个 URL,并且即使已经 run 也可以重新连接。此外,如果用户执行!save,则会将其保存在 beeline.properties 文件中,然后允许!reconnect在多个直线会话中连接到此已保存的 last-connected-to URL。这也允许使用命令 line 中的beeline -r在启动时重新连接。

使用 hive-site.xml 自动连接到 HiveServer2

从 Hive 2.2.0开始,Beeline 添加了对使用 classpath 中存在的 hive-site.xml 的支持,以根据 hive-site.xml 中的 configuration properties 和其他用户 configuration 文件自动生成连接 URL。并非所有的 URL properties 都可以从 hive-site.xml 派生,因此在 order 中使用此 feature 用户必须创建一个名为“beeline-hs2-connection.xml”的 configuration 文件,这是一个 Hadoop XML 格式文件。此文件用于为连接 URL 提供 user-specific 连接 properties。 Beeline在$ /.beeline /(基于Unix的操作系统)或$ \ beeline \目录(对于Windows)中寻找此配置文件。如果在上述位置找不到文件,则Beeline会依次在$位置和/etc /hive /conf中检查该文件(检查HIVE-16335,它会从Hive 2.2.0中的/etc /conf /hive中修复此位置)。找到文件后,Beeline 将 beeline-hs2-connection.xml 与 class 路径中的 hive-site.xml 结合使用以确定连接 URL。

beeline-hs2-connection.xml中的URL连接属性必须具有前缀“ beeline.hs2.connection”。 然后是URL属性名称。 例如,为了提供属性ssl,beeline-hs2-connection.xml中的属性密钥应为“ beeline.hs2.connection.ssl”。 下面的示例beeline.hs2.connection.xml提供了Beeline连接URL的用户和密码值。 在这种情况下,其余的属性(例如HS2主机名和端口信息,Kerberos配置属性,SSL属性,传输模式等)是使用类路径中的hive-site.xml来获取的。 如果密码为空,则应删除beeline.hs2.connection.password属性。 在大多数情况下,beeline-hs2-connection.xml中的以下配置值以及类路径中正确的hive-site.xml应该足以建立与HiveServer2的连接。



<configuration>
<property>
 <name>beeline.hs2.connection.username>
 <value>hivevalue>
property>
<property>
 <name>beeline.hs2.connection.passwordname>
 <value>hivevalue>
property>
configuration>

如果beeline-hs2-connection.xml和hive-site.xml中都存在属性,则从beeline-hs2-connection.xml派生的属性值优先。 例如,在下面的beeline-hs2-connection.xml文件中,提供了在启用Kerberos的环境中Beeline连接的主体值。 在这种情况下,就连接URL而言,beeline.hs2.connection.principal的属性值将覆盖hive-site.xml中的HiveConf.ConfVars.HIVE_SERVER2_KERBEROS_PRINCIPAL的值。



<configuration>
<property>
 <name>beeline.hs2.connection.hostsname>
 <value>localhost:10000value>
property>
<property>
 <name>beeline.hs2.connection.principalname>
 <value>hive/[email protected]value>
property>
configuration>

对于属性beeline.hs2.connection.hosts,beeline.hs2.connection.hiveconf和beeline.hs2.connection.hivevar,属性值是逗号分隔的值列表。 例如,以下beeline-hs2-connection.xml以逗号分隔格式提供hiveconf和hivevar值。



<configuration>
<property>
 <name>beeline.hs2.connection.username>
 <value>hivevalue>
property>
<property>
 <name>beeline.hs2.connection.hiveconfname>
 <value>hive.cli.print.current.db=true, hive.cli.print.header=truevalue>
property>
<property>
 <name>beeline.hs2.connection.hivevarname>
 <value>testVarName1=value1, testVarName2=value2value>
property>
configuration>

当 beeline-hs2-connection.xml 存在且没有提供其他 arguments 时,Beeline 会自动连接到使用 configuration files 生成的 URL。当提供连接 arguments(-u,-n 或-p)时,Beeline 使用它们并且不使用 beeline-hs2-connection.xml 自动连接。删除或重命名 beeline-hs2-connection.xml 会禁用此 feature。

使用 beeline-site.xml 自动连接到 HiveServer2

除了使用 hive-site.xml 和 beeline-hs2-connection.xml 来导出从 Beeline 连接到 HiveServer2 时使用的 JDBC 连接 URL 的上述方法之外,用户可以选择将 beeline-site.xml 添加到 classpath,并且在 beeline-site.xml 中,可以指定完整的 JDBC URL。用户还可以指定多个命名 URL 并使用beeline -c连接到特定 URL。当相同的 cluster 具有多个 HiveServer2 实例 running 具有不同的配置时,这尤其有用。其中一个命名的 URL 被视为默认值(这是用户只需键入beeline时使用的 URL)。 beeline-site.xml 如下所示:



<configuration>
<property>
  <name>beeline.hs2.jdbc.url.tcpUrlname>
  <value>jdbc:hive2://localhost:10000/default;user=hive;password=hivevalue>
property>

<property>
  <name>beeline.hs2.jdbc.url.httpUrlname>
  <value>jdbc:hive2://localhost:10000/default;user=hive;password=hive;transportMode=http;httpPath=cliservicevalue>
property>

<property>
  <name>beeline.hs2.jdbc.url.defaultname>
  <value>tcpUrlvalue>
property>
configuration>

在上面的例子中,只需 typing beeline打开一个到jdbc:hive2://localhost:10000/default;user=hive;password=hive的新 JDBC 连接。如果 classpath 中同时存在 beeline-site.xml 和 beeline-hs2-connection.xml,则通过在 beeline-hs2-connection.xml 派生的 URL properties 之上应用 beeline-hs2-connection.xml 中指定的 properties 来创建最终 URL。作为示例,请考虑以下 beeline-hs2-connection.xml:



<configuration>
<property>
 <name>beeline.hs2.connection.username>
 <value>hivevalue>
property>
<property>
  <name>beeline.hs2.connection.passwordname>
  <value>hivevalue>
property>
configuration>

考虑以下 beeline-site.xml:



<configuration>
<property>
  <name>beeline.hs2.jdbc.url.tcpUrlname>
  <value>jdbc:hive2://localhost:10000/defaultvalue>
property>

<property>
  <name>beeline.hs2.jdbc.url.httpUrlname>
  <value>jdbc:hive2://localhost:10000/default;transportMode=http;httpPath=cliservicevalue>
property>

<property>
  <name>beeline.hs2.jdbc.url.defaultname>
  <value>tcpUrlvalue>
property>
configuration>

在上面的例子中,只需 typing beeline打开一个到j dbc:hive2://localhost:10000/default;user=hive;password=hive的新 JDBC 连接。当用户键入beeline -c httpUrl时,连接将打开jdbc:hive2://localhost:10000/default;transportMode=http;httpPath=cliservice;user=hive;password=hive。 ``

使用 JDBC

可以使用 JDBC 访问存储在关系数据库或其他表格格式中的数据。

  • 加载 HiveServer2 JDBC 驱动程序。从1.2.0应用开始,不再需要使用 Class.forName()显式加载 JDBC 驱动程序。

例如:

Class.forName("org.apache.hive.jdbc.HiveDriver");
  • 通过使用 JDBC 驱动程序创建Connection object 来连接数据库。

例如:

Connection cnct = DriverManager.getConnection("jdbc:hive2://<host>:<port>", "<user>", "<password>");

默认是 10000.在 non-secure 配置中,为查询指定以 run 为。在 non-secure 模式中忽略``字段 value。

Connection cnct = DriverManager.getConnection("jdbc:hive2://<host>:<port>", "<user>", "");

在 Kerberos 安全模式下,用户信息基于 Kerberos 凭据。

  • 通过创建Statement object 并使用其executeQuery()方法将 SQL 提交到数据库。

例如:

Statement stmt = cnct.createStatement();
ResultSet rset = stmt.executeQuery("SELECT foo FROM bar");
  • 如有必要,处理结果集。

这些步骤在下面的 sample code 中说明。

JDBC Client Sample Code
import java.sql.SQLException;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.Statement;
import java.sql.DriverManager;

public class HiveJdbcClient {
  private static String driverName = "org.apache.hive.jdbc.HiveDriver";

  /**
   * @param args
   * @throws SQLException
   */
  public static void main(String[] args) throws SQLException {
      try {
      Class.forName(driverName);
    } catch (ClassNotFoundException e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
      System.exit(1);
    }
    //replace "hive" here with the name of the user the queries should run as
    Connection con = DriverManager.getConnection("jdbc:hive2://localhost:10000/default", "hive", "");
    Statement stmt = con.createStatement();
    String tableName = "testHiveDriverTable";
    stmt.execute("drop table if exists " + tableName);
    stmt.execute("create table " + tableName + " (key int, value string)");
    // show tables
    String sql = "show tables '" + tableName + "'";
    System.out.println("Running: " + sql);
    ResultSet res = stmt.executeQuery(sql);
    if (res.next()) {
      System.out.println(res.getString(1));
    }
       // describe table
    sql = "describe " + tableName;
    System.out.println("Running: " + sql);
    res = stmt.executeQuery(sql);
    while (res.next()) {
      System.out.println(res.getString(1) + "\t" + res.getString(2));
    }

    // load data into table
    // NOTE: filepath has to be local to the hive server
    // NOTE: /tmp/a.txt is a ctrl-A separated file with two fields per line
    String filepath = "/tmp/a.txt";
    sql = "load data local inpath '" + filepath + "' into table " + tableName;
    System.out.println("Running: " + sql);
    stmt.execute(sql);

    // select * query
    sql = "select * from " + tableName;
    System.out.println("Running: " + sql);
    res = stmt.executeQuery(sql);
    while (res.next()) {
      System.out.println(String.valueOf(res.getInt(1)) + "\t" + res.getString(2));
    }

    // regular hive query
    sql = "select count(1) from " + tableName;
    System.out.println("Running: " + sql);
    res = stmt.executeQuery(sql);
    while (res.next()) {
      System.out.println(res.getString(1));
    }
  }
}
运行 JDBC Sample Code
# Then on the command-line
$ javac HiveJdbcClient.java

# To run the program using remote hiveserver in non-kerberos mode, we need the following jars in the classpath
# from hive/build/dist/lib
#     hive-jdbc*.jar
#     hive-service*.jar
#     libfb303-0.9.0.jar
# 	  libthrift-0.9.0.jar
# 	  log4j-1.2.16.jar
# 	  slf4j-api-1.6.1.jar
#	  slf4j-log4j12-1.6.1.jar
# 	  commons-logging-1.0.4.jar
#
#
# To run the program using kerberos secure mode, we need the following jars in the classpath 
#     hive-exec*.jar
#     commons-configuration-1.6.jar (This is not needed with Hadoop 2.6.x and later).
#  and from hadoop
#     hadoop-core*.jar (use hadoop-common*.jar for Hadoop 2.x)
#
# To run the program in embedded mode, we need the following additional jars in the classpath
# from hive/build/dist/lib
#     hive-exec*.jar
#     hive-metastore*.jar
#     antlr-runtime-3.0.1.jar
#     derby.jar
#     jdo2-api-2.1.jar
#     jpox-core-1.2.2.jar
#     jpox-rdbms-1.2.2.jar
# and from hadoop/build
#     hadoop-core*.jar
# as well as hive/build/dist/conf, any HIVE_AUX_JARS_PATH set,
# and hadoop jars necessary to run MR jobs (eg lzo codec)

$ java -cp $CLASSPATH HiveJdbcClient

或者,您可以运行以下 bash 脚本,该脚本将调用数据文件并在调用 client 之前 build 您的 classpath。该脚本还添加了在嵌入模式下使用 HiveServer2 所需的所有其他 jars。

#!/bin/bash
HADOOP_HOME=/your/path/to/hadoop
HIVE_HOME=/your/path/to/hive

echo -e '1\x01foo' > /tmp/a.txt
echo -e '2\x01bar' >> /tmp/a.txt

HADOOP_CORE=$(ls $HADOOP_HOME/hadoop-core*.jar)
CLASSPATH=.:$HIVE_HOME/conf:$(hadoop classpath)

for i in ${HIVE_HOME}/lib/*.jar ; do
    CLASSPATH=$CLASSPATH:$i
done

java -cp $CLASSPATH HiveJdbcClient
JDBC 数据类型

以下 table lists 列出了为 HiveServer2 JDBC 实现的数据类型。

Hive 类型 Java 类型 格式
TINYINT 字节 签名或未签名的 1-byte integer
SMALLINT 签名 2-byte integer
INT INT 签名 4-byte integer
BIGINT 签名 8-byte integer
浮动 single-precision 数字(约 7 位数)
double-precision 号码(约 15 位数)
DECIMAL java.math.BigDecimal fixed-precision decimal value
BOOLEAN boolean 一位(0 或 1)
character string 或 variable-length character string
TIMESTAMP java.sql.Timestamp date 和 time value
BINARY 二进制数据
复杂类型
array String - json 编码 一种数据类型的值
地图 String - json 编码 key-value 对
STRUCT String - json 编码 结构化价值观
安全 Cluster 的 JDBC Client 设置

使用 Kerberos 身份验证连接到 HiveServer2 时,URL 格式为:

jdbc:hive2://:/;principal=

在 connecting 之前,client 需要在票证缓存中具有有效的 Kerberos 票证。

注意:如果 port 编号后面没有“/”,则 jdbc 驱动程序不会解析主机名,并且_End up running HS2 处于嵌入模式。因此,如果要指定主机名,请确保在 port 编号后面有“/”或“/ ”。

对于 LDAP,CUSTOM 或 PAM 身份验证,client 需要将有效的用户 name 和密码传递给 JDBC 连接 API。

To use sasl.qop, add the following to the sessionconf part of your HiveJDBC hive connection string, e.g.
jdbc:hive://hostname/dbname;sasl.qop=auth-int
Multi-User 场景和程序化登录 Kerberos KDC

在当前使用 Kerberos 的方法中,您需要在 connecting 之前在票证缓存中拥有有效的 Kerberos 票证。这需要静态登录(使用 kinit,key tab 或 ticketcache)以及每个 client 限制一个 Kerberos 用户。这些限制限制了中间件系统和其他 multi-user 场景的使用,以及 client 希望以编程方式登录 Kerberos KDC 的情况。

缓解 multi-user 场景问题的一种方法是使用安全代理用户。从 Hive 0.13.0 开始,对安全代理用户的支持有两个组成部分:

  • 特权 Hadoop 用户的直接代理访问。这使特权用户可以在连接期间直接指定备用 session 用户。如果 connecting 用户具有 Hadoop level 特权来模拟请求的用户标识,则 HiveServer2 将_seun 运行 session 作为请求的用户。
  • Oozie的基于委托令牌的连接。这是 Hadoop 生态系统组件的 common 机制。

Hadoop 生态系统中的代理用户权限与用户名和主机相关联。也就是说,该特权可用于某些主机的某些用户。如果您从一台授权(祝福)机器连接,之后您需要从另一台 non-blessed 机器建立连接,则应使用 Hive 中的委派令牌。您从受祝福的计算机获取委派令牌,并使用来自 non-blessed 计算机的委派令牌进行连接。主要用例是 Oozie,它从服务器计算机获取委托令牌,然后从 Hadoop 任务节点获取另一个连接。

如果只是从单个受保护的计算机作为特权用户建立 JDBC 连接,则直接代理访问是更简单的方法。您可以使用 hive.server2.proxy.user = 参数传递您需要在 JDBC URL 中模拟的用户。

使用 HiveServer2 二进制传输模式hive.server2.transport.mode支持委托令牌从 0.13.0 开始可用;在HIVE-13169中添加了对具有 HTTP 传输模式的 feature 的支持,这应该是 Hive 2.1.0 的一部分。

另一种方法是使用 pre-authenticated Kerberos 主题。在此方法中,从 Hive 0.13.0 开始,Hive JDBC client 可以使用 pre-authenticated 主题对 HiveServer2 进行身份验证。这使得中间件系统能够在用户运行 client 时运行查询。

将 Kerberos 与 Pre-Authenticated 主题一起使用

要使用 pre-authenticated 主题,您需要进行以下更改。

  • 除了常规的 Hive JDBC jars(不需要 commons-configuration-1.6.jar 和 hadoop-core * .jar)之外,还要将 hive-exec * .jar 添加到 classpath。
  • 除了具有“principal”url property 之外,还要添加 auth=kerberos 和 kerberosAuthType=fromSubject JDBC URL properties。
  • 在 Subject.doAs()中打开连接。

以下 code 片段说明了用法:

static Connection getConnection( Subject signedOnUserSubject ) throws Exception{
       Connection conn = (Connection) Subject.doAs(signedOnUserSubject, new PrivilegedExceptionAction<Object>()
           {
               public Object run()
               {
                       Connection con = null;
                       String JDBC_DB_URL = "jdbc:hive2://HiveHost:10000/default;" ||
                                              "principal=hive/[email protected];" || 
                                              "kerberosAuthType=fromSubject";
                       try {
                               Class.forName(JDBC_DRIVER);
                               con =  DriverManager.getConnection(JDBC_DB_URL);
                       } catch (SQLException e) {
                               e.printStackTrace();
                       } catch (ClassNotFoundException e) {
                               e.printStackTrace();
                       }
                       return con;
               }
           });
       return conn;
}
与 SQuirrel SQL Client 集成
  • 从SQuirrel SQL 网站下载,安装和启动 SQuirrel SQL Client。
  • 选择’Drivers - > New Driver …'来注册与 HiveServer2 一起使用的 Hive 的 JDBC 驱动程序。
  • 输入驱动程序 name 和 example URL:
Name: Hive
   Example URL: jdbc:hive2://localhost:10000/default
  • 选择’Extra Class Path - > Add’,从本地 Hive 和 Hadoop 发行版中添加以下 jars。
HIVE_HOME/lib/hive-jdbc-*-standalone.jar
   HADOOP_HOME/share/hadoop/common/hadoop-common-*.jar

版本信息

Hive JDBC 独立 jars 用于 Hive 0.14.0 向前;对于以前版本的 Hive,请改用HIVE_HOME/build/dist/lib/*.jar

hadoop-common jars 适用于 Hadoop 2.0;对于以前版本的 Hadoop,请改用HADOOP_HOME/hadoop-*-core.jar

  • 选择“列表驱动程序”。这将导致 SQuirrel 解析您的 jars for JDBC 驱动程序,可能需要几秒钟。从’Class Name’输入框中选择 Hive 驱动程序以使用 HiveServer2:
org.apache.hive.jdbc.HiveDriver
  • 单击“确定”以完成驱动程序注册。
  • 选择’别名 - >添加别名…'以创建 HiveServer2 实例的连接别名。
  • 在“Name”输入框中为连接别名指定 name。
  • 从’Driver’drop-down 中选择 Hive 驱动程序。
  • 根据需要修改 example URL 以指向 HiveServer2 实例。
  • 输入“User Name”和“Password”,然后单击“确定”以保存连接别名。
  • 要连接到 HiveServer2,double-click Hive 别名并单击“连接”。

建立连接后,您将在 log console 中看到错误,并可能会收到驱动程序与 JDBC 3.0 兼容的警告。这些警报是由 JDBC 元数据 API 的 yet-to-be-implemented 部分引起的,可以安全地忽略。要测试连接,请在 console 中输入 SHOW TABLES,然后单击 run 图标。

另请注意,当查询为 running 时,对“取消”按钮的支持尚不可用。

与 SQL Developer 集成

使用 JDBC 连接可以使用 Oracle SQLDeveloper 集成。

  • 免费下载,安装和启动 DbVisualizer 或从https://www.dbvis.com/购买 DbVisualizer Pro。
  • 按照github上的说明操作。
Integration 与其他工具的高级 Features
在 HTTP 模式下支持 Cookie 重放

Version 1.2.0 以及之后,此选项从Hive 1.2.0开始可用。HIVE-9709引入了对 JDBC 驱动程序的支持,以启用 cookie 重放。默认情况下会启用此功能,以便将传入的 cookies 发送回服务器进行身份验证。

启用时的 JDBC 连接 URL 应如下所示:

jdbc:hive2://:/?transportMode=http;httpPath=;cookieAuth=true;cookieName=
  • cookieAuth 默认设置为true
  • cookieName:如果任何传入的 cookies’键匹配 cookieName 的 value,则 JDBC 驱动程序不会向服务器发送任何登录 credentials/Kerberos 票证。 client 只会将 cookie 单独发送回服务器进行身份验证。 cookieName 的默认 value 是 hive.server2.auth(这是 HiveServer2 cookie name)。
  • 要关闭 cookie 重放,必须在 JDBC URL 中使用 cookieAuth=false。
  • **重要说明:**作为HIVE-9709的一部分,我们将 Hive 的 Apache http-client 和 http-core 组件升级为 4.4. 为了避免 HttpComponents 的升级 version 与系统中可能存在的其他任何版本之间发生任何冲突(例如 Apache Hadoop 2.6 提供的@这样一种方式 Beeline-related jars 出现在 HADOOP lib jars 之前。这是通过在使用 hive-jdbc 之前设置 HADOOP_USERCLASSPATH_FIRST=true 来实现的。事实上,在 bin/beeline.sh 我们这样做!
在 HTTP 模式下使用 2-way SSL

此选项从Hive 1.2.0开始可用。HIVE-10447使 JDBC 驱动程序在 HTTP 模式下支持 2-way SSL。请注意,HiveServer2 目前不支持 2-way SSL。因此,当有一个像 Knox 这样的中间服务器需要 client 来支持 2-way SSL 时,这个 feature 很方便。

JDBC 连接 URL:

jdbc:hive2://:/;ssl=true;twoWay=true;` `sslTrustStore=;trustStorePassword=;sslKeyStore=;keyStorePassword=` `?transportMode=http;httpPath=
  • < truststore_path >是 client 的信任库文件所在的路径。这是一个强制的 non-empty 字段。
  • 是访问信任库的密码。
  • < keystore_path >是 client 的密钥库文件所在的路径。这是一个强制的 non-empty 字段。
  • < key_store_password>是访问密钥库的密码。
通过 JDBC 驱动程序传递 HTTP 标头 Key/Value 对

此选项从Hive 1.2.0开始可用。HIVE-10339为 clients 引入了一个选项,以提供可以发送到底层服务器的自定义 HTTP headers(Hive 1.2.0 及更高版本)。

JDBC 连接 URL:

jdbc:hive2://:/;transportMode=http;httpPath=;http.header.=;http.header.=

指定上述 URL 后,Beeline 将调用基础请求以将 HTTP 标头集添加到和,将另一个 HTTP 标头集设置为和。当最终用户需要将 HTTP 标头中的标识向下发送到中间服务器(如 Knox,通过 Beeline 进行身份验证)时,这非常有用,例如http.header.USERNAME=;http.header.PASSWORD=

通过 JDBC 驱动程序传递自定义 HTTP Cookie Key/Value 对

在 Hive version 3.0.0,HIVE-18447中为 clients 引入了一个选项,以提供可以发送到底层服务器的自定义 HTTP cookies。某些身份验证机制(如 Single Sign On)需要能够通过 JDBC 驱动程序将 cookie 传递给某些中间身份验证服务(如 Knox)。

JDBC 连接 URL:

jdbc:hive2://:/;transportMode=http;httpPath=;http.cookie.=;http.cookie.=

指定上述 URL 后,Beeline 将调用基础请求以在请求标头中添加 HTTP cookie,并将其设置为 = 和 = 。

你可能感兴趣的:(Hive学习笔记)