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有效负载。
% 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
命令 | 描述 |
---|---|
! | SQLLine命令列表。 例如:!quit 退出 Beeline client。 |
!分界 | 为Beeline编写的查询设置分隔符。允许使用多字符分隔符,但不允许使用引号,斜杠和 - 。默认为; 用法:!delimiter $$ |
当使用 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 查询并将结果打印到标准输出。 |
选项 | 描述 |
---|---|
-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 中。结果的一行对应于 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 |
+-----+---------+-----------------+
结果的每一行都以 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
结果以 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>
结果以 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 输出格式:csv,tsv,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
如果未禁用引用,则在 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 的 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'
从 Hive 0.14.0 开始,HiveServer2 操作日志可用于 Beeline客户端。这些参数配置 logging:
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 &
HiveServer2 有一个 JDBC 驱动程序。它支持对 HiveServer2 的本地和远程访问。远程HiveServer2 模式建议用于生产环境使用,因为它更安全,不需要为用户授予直接 HDFS/metastore 访问权限。
HiveServer2 URL 是一个 string,语法如下:
jdbc:hive2://:,:/dbName;initFile=;sess_var_list?hive_conf_list#hive_var_list
其中
:,:
是要连接的服务器实例或以逗号分隔的服务器实例列表(如果启用了动态服务发现)。如果为空,将使用本地服务器。dbName
是初始数据库的 name。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编码进行编码。
JDBC 连接 URL 格式的前缀为jdbc:hive2://
,Driver class 为org.apache.hive.jdbc.HiveDriver
。请注意,这与旧的HiveServer不同。
jdbc:hive2://:/;initFile=
(HiveServer2 的默认 port 为 10000)。jdbc:hive2:///;initFile=
(无 host 或 port)。initFile
选项在Hive 2.2.0及更高版本中可用。
JDBC 连接 URL:jdbc:hive2://:/;transportMode=http;httpPath=
,其中:
是hive-site.xml中配置的相应 HTTP 端点。默认 value 是
cliservice。在0.14版本前,这些参数过去分别被称为hive.server2.transport.mode
和hive.server2.thrift.http.path
,并且是 hive_conf_list 的一部分。这些版本已被弃用,以支持新版本(它们是 sess_var_list 的一部分),但现在仍在继续使用。
JDBC 连接 URL:jdbc:hive2://:/;ssl=true;sslTrustStore=;trustStorePassword=
,其中:
在 HTTP 模式下:jdbc:hive2://:/;ssl=true;sslTrustStore=;trustStorePassword=;transportMode=http;httpPath=
。
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://
从 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 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。
除了使用 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 访问存储在关系数据库或其他表格格式中的数据。
例如:
Class.forName("org.apache.hive.jdbc.HiveDriver");
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 中说明。
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));
}
}
}
# 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
以下 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 编码 | 结构化价值观 |
使用 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
在当前使用 Kerberos 的方法中,您需要在 connecting 之前在票证缓存中拥有有效的 Kerberos 票证。这需要静态登录(使用 kinit,key tab 或 ticketcache)以及每个 client 限制一个 Kerberos 用户。这些限制限制了中间件系统和其他 multi-user 场景的使用,以及 client 希望以编程方式登录 Kerberos KDC 的情况。
缓解 multi-user 场景问题的一种方法是使用安全代理用户。从 Hive 0.13.0 开始,对安全代理用户的支持有两个组成部分:
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 时运行查询。
要使用 pre-authenticated 主题,您需要进行以下更改。
以下 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;
}
Name: Hive
Example URL: jdbc:hive2://localhost:10000/default
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
。
org.apache.hive.jdbc.HiveDriver
建立连接后,您将在 log console 中看到错误,并可能会收到驱动程序与 JDBC 3.0 兼容的警告。这些警报是由 JDBC 元数据 API 的 yet-to-be-implemented 部分引起的,可以安全地忽略。要测试连接,请在 console 中输入 SHOW TABLES,然后单击 run 图标。
另请注意,当查询为 running 时,对“取消”按钮的支持尚不可用。
使用 JDBC 连接可以使用 Oracle SQLDeveloper 集成。
Version 1.2.0 以及之后,此选项从Hive 1.2.0开始可用。HIVE-9709引入了对 JDBC 驱动程序的支持,以启用 cookie 重放。默认情况下会启用此功能,以便将传入的 cookies 发送回服务器进行身份验证。
启用时的 JDBC 连接 URL 应如下所示:
jdbc:hive2://:/?transportMode=http;httpPath=;cookieAuth=true;cookieName=
true
。此选项从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=
此选项从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=
。
在 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,并将其设置为 = 和 = 。