Beeline 的进阶使用

目录



1 Beeline 简介

操作 Hive 数据使用的客户端 比较常用的应该是 Hive CLI ,但我们查看官网文档时 LanguageManual,可以看到在 Commands and CLIs 时又给我们提供了一个 Beeline CLI (new),很显然这个是 Hive 新版本的 CLI ,当然也是推荐使用的 Hive CLI 连接方式。

Beeline 是一个基于 SQLLine CLI的 JDBC 客户端。HiveServer2 支持与 HiveServer2 一起使用的命令行 Shell Beeline。当然SQLLine 的语法( 详细文档见)也适用于也 Beeline。使用 Beeline 替代 Hive CLI 的详细实现可以查看此

Beeline Shell 在嵌入式模式(embedded mode)和远程模式(remote mode)下均可工作。 在嵌入式模式下,它运行嵌入式Hive(类似于Hive CLI),而远程模式用于通过Thrift连接到单独的 HiveServer2 进程。 从 Hive 0.14 开始,当 Beeline 与 HiveServer2 一起使用时它还会打印 HiveServer2 的日志消息,以查询执行到 STDERR(标准错误) 的查询。 建议将远程 HiveServer2 模式用于生产环境,因为它更安全并且不需要为用户授予直接 HDFS/metastore 访问权限。注意:在远程模式下 HiveServer2 仅接受有效的 Thrift 调用,即使在HTTP模式下,消息正文也包含 Thrift 有效负载。

2 Beeline 使用样例

可以在配置好环境变量的系统下执行

$ bin/beeline 
Beeline version 2.1.1-cdh6.3.2 by Apache Hive

beeline> !connect jdbc:hive2://cdh3:10000/default
Connecting to jdbc:hive2://cdh3:10000/default
Enter username for jdbc:hive2://cdh3:10000/default: 
Enter password for jdbc:hive2://cdh3:10000/default:
Connected to: Apache Hive (version 2.1.1-cdh6.3.2)
Driver: Hive JDBC (version 2.1.1-cdh6.3.2)
Transaction isolation: TRANSACTION_REPEATABLE_READ

0: jdbc:hive2://cdh3:10000/default> show tables;
+-------------------+
|     tab_name      |
+-------------------+
| primitives        |
| src               |
| src1              |
| src_json          |
| src_sequencefile  |
| src_thrift        |
| srcbucket         |
| srcbucket2        |
| srcpart           |
+-------------------+
9 rows selected (1.079 seconds)

我们还可以直接在系统的 shell 下直接输入如下命令进入 Beeline

$ beeline -u jdbc:hive2://cdh3:10000/default -n scott -w password_file

# 如果需要通过 NoSASL 模式进行连接的 Beeline ,则必须明确指定身份验证模式:
$ beeline -u jdbc:hive2://<host>:<port>/<db>;auth=noSasl -n scott -p pass

3 Beeline 命令参数说明

3.1 Beeline 命令项

Beeline CLI支持以下命令行选项:

命令 描述
-u <database URL> 要连接的 JDBC URL,如果需要参数值中的特殊字符应使用 URL 编码进行编码。
用法:beeline -u db_URL
r 重新连接到上次使用的URL(如果用户以前使用 !connect 到 URL,并且使用 !save 到 beeline.properties 文件)。
用法:beeline -r
版本:: 2.1.0 (HIVE-13670)
-n <username> 连接的用户名。
用法:beeline -n valid_user
-p <password> 连接的密码。
用法:beeline -p valid_password
可选的 password 模式。从Hive 2.2.0(HIVE-13589)开始,-p选项的参数是可选的。
用法:beeline -p [valid_password]
如果未提供密码,则-p Beeline 将在启动连接时提示您输入密码,当提供密码时,Beeline使用它来启动连接并且不提示。
-d <driver class> 要使用的驱动程序类。
用法:beeline -d driver_class
-e <query> 应该执行的查询,双引号或单引号引起来的查询字符串,可以多次指定此选项。
用法:beeline -e "query_string"
支持在单个 query_string 中运行多个用分号分隔的 SQL 语句:1.2.0(HIVE-9877
错误修复(空指针异常):0.13.0(HIVE-5765
错误修复(不支持--headerInterval):0.14.0(HIVE-7647
错误修复(在后台运行 -e):1.3.0 和 2.0.0(HIVE-6758);早期版本可用的解决方法
-f <file> 应执行的脚本文件。
用法:beeline -f filepath
版本:0.12.0 (HIVE-4268)
注意:如果脚本包含 tab 符,则查询编译在版本0.12.0中会失败,此错误已在版本0.13.0(HIVE-6359)中修复。错误修复(在后台运行-f):1.3.0和2.0.0(HIVE-6758);早期版本可用的解决方法
-i (or) --init <file or files> 用于初始化的 init 文件
用法:beeline -i /tmp/initfile
单文件。版本: 0.14.0 (HIVE-6561)
多文件文件。版本: 2.1.0 (HIVE-11336
-w (or) --password-file <password file> 从保存密码的文件中读取密码
版本:1.2.0 (HIVE-7175)
-a (or) --authType <auth type> 身份验证类型作为 auth 属性传递给 jdbc
版本:0.13.0 (HIVE-5155)
--property-file <file> 从中读取配置属性的文件
用法:beeline --property-file /tmp/a
版本:2.2.0 (HIVE-13964)
--hiveconf property=value 给定配置属性的使用值。hive.conf.restricted.list 中列出的属性无法使用 hiveconf 重置(请参阅限制列表和白名单)。
用法:beeline --hiveconf prop1=value1
版本:0.13.0 (HIVE-6173)
--hivevar name=value 配置单元变量名称和值,这是特定于 Hive 的设置,其中可以在会话级别设置变量,并在Hive命令或查询中引用。
用法:beeline --hivevar var1=value1
--color=[true/false] 控制是否使用颜色进行显示。默认为false。
用法:beeline --color=true
(不支持分数值输出格式。请参阅 HIVE-9770
--showHeader=[true/false] 在查询结果中显示列名(true)或者(false),默认为 true。
用法:beeline --showHeader=false
--headerInterval=ROWS 当 outputformat 为表时,重新显示列标题的间隔(以行数为单位),默认值为100。
用法:beeline --headerInterval=50
(不支持分数值输出格式。请参阅 HIVE-9770
--fastConnect=[true/false] 连接时跳过为 HiveQL 语句的制表符完成而建立所有表和列的列表(true)或建立list(false),默认为true。
用法:beeline --fastConnect=false
--autoCommit=[true/false] 启用/禁用 自动事务提交。默认为false。
用法:beeline --autoCommit=true
--verbose=[true/false] 显示详细的错误消息和调试信息(true)或不显示(false),默认为false。
用法:beeline --verbose=true
--showWarnings=[true/false] 显示发出任何 HiveQL 命令后在连接上报告的警告,默认为false。
用法:beeline --showWarnings=true
--showDbInPrompt=[true/false] 在提示中显示当前数据库名称(例如(库名)>),默认为false。
用法:beeline --showDbInPrompt=true
版本: 2.2.0 (HIVE-14123)
--showNestedErrs=[true/false] 显示嵌套错误,默认为false。
用法:beeline --showNestedErrs=true
--numberFormat=[pattern] 使用 DecimalFormat 模式格式化数字。
用法:beeline --numberFormat="#,###,##0.00"
--force=[true/false] 脚本出现错误是否继续运行,默认为false。
用法:beeline--force=true
--maxWidth=MAXWIDTH 当 outputformat 是 table 时,在截取数据之前显示的最大宽度(以字符为单位),默认是查询终端当前宽度,然后回落到 80。
用法:beeline --maxWidth=150
--maxColumnWidth=MAXCOLWIDTH 当 outputformat 为 table 时,最大列宽(以字符为单位)。在Hive 2.2.0+版本(请参阅 HIVE-14135)中,默认值为50;在较早版本中,默认值为15。
用法:beeline --maxColumnWidth=25
--silent=[true/false] 是否减少显示的信息消息的数量。它还停止显示来自 HiveServer2(Hive 0.14和更高版本)和 HiveQL 命令(Hive 1.2.0和更高版本)的查询日志消息。默认为false。
用法:beeline --silent=true
--autosave=[true/false] 自动保存首选项(true)或不自动保存(false),默认为false。
用法:beeline --autosave=true
--outputformat=[table/vertical/csv/tsv/dsv/csv2/tsv2] 结果显示的格式化模式,默认为表格。有关建议的sv选项的说明,请参见下面的分隔值输出格式
用法:beeline --outputformat=tsv
版本:dsv/csv2/tsv2 added in 0.14.0 (HIVE-8615)
--truncateTable=[true/false] 如果为true,则超过控制台长度时会在控制台中截断表格列。
版本:0.14.0 (HIVE-6928)
--delimiterForDSV= DELIMITER 定界符分隔值的分隔符输出格式。默认值为 ‘|’ 字符。
版本:0.14.0 (HIVE-7390)
--isolation=LEVEL 将事务隔离级别设置为 TRANSACTION_READ_COMMITTED 或者 TRANSACTION_SERIALIZABLE。请参阅Java Connection文档中的 “字段详细信息” 部分。
用法:beeline --isolation=TRANSACTION_SERIALIZABLE
--nullemptystring=[true/false] 使用将 null 打印为空字符串(true)的历史行为,或使用将 null 打印为 NULL(false)的当前行为,默认为false。
用法:beeline --nullemptystring=false
版本: 0.13.0 (HIVE-4485)
--incremental=[true/false] 从 Hive 2.3 起默认为true,之前默认为false。 如果设置为false,则在显示结果之前先提取并缓冲整个结果集,从而获得最佳的显示列大小。设置为true时,结果行将在提取时立即显示,从而以较低的显示列填充为代价,降低了等待时间和内存使用量。 如果在客户端遇到 OutOfMemory,则建议设置 --incremental=true(由于获取的结果集的大小太大)。
--incrementalBufferRows=NUMROWS 在 stdout 上打印行时要缓冲的行数,默认为1000;默认值为1000,仅在 --incremental=true--outputformat=table 时适用
用法:beeline --incrementalBufferRows=1000
版本: 2.3.0 (HIVE-14170)
--maxHistoryRows=NUMROWS Beeline 存储历史记录的最大行数。
版本:2.3.0 (HIVE-15166)
--delimiter=; 设置用 Beeline 编写的查询的分割符,允许使用多字符定界符,但不允许使用引号、斜杠,并且 --是默认的。
用法:beeline --delimiter=$$
版本:3.0.0 (HIVE-10865)
--convertBinaryArrayToString=[true/false] 将二进制列数据显示为字符串或字节数组。
用法:beeline --convertBinaryArrayToString=true
版本:3.0.0 (HIVE-14786)
--help 显示用法信息。
用法:beeline --help

3.2 Beeline 命令

命令 描述
!<SQLLine command> SQLLine 命令列表可从 http://sqlline.sourceforge.net/ 获得。
示例!quit 退出 Beeline 客户端。
!delimiter 设置用 Beeline 编写的查询的分隔符。允许使用多字符分隔符,但不允许使用引号、斜杠,并且--符为默认的;
用法!delimiter $$
版本3.0.0 (HIVE-10865)

3.3 Beeline Hive 命令

默认以 ; 作为命令的终止符,脚本的注释可以使用 -- 前缀指定。

命令 描述
reset 将配置重置为默认值。
reset <key> 将指定配置变量(key)的值重置为默认值。注意:如果是拼写错误的变量名,Beeline 将不会提示错误。
set <key>=<value> 设置特定配置变量(key)的值。注意:如果是拼写错误的变量名,Beeline 将不会提示错误。
set 打印由用户或 Hive 覆盖的变量列表
set -v 打印所有 Hadoop 和 Hive 配置变量
add FILE[S] <filepath> <filepath>*
add JAR[S] <filepath> <filepath>*
add ARCHIVE[S] <filepath> <filepath>*
将一个或多个文件、jar 或存档(archives)添加到分布式缓存中的资源列表。有关更多信息请参见Hive资源
add FILE[S] <ivyurl> <ivyurl>*
add JAR[S] <ivyurl> <ivyurl>*
add ARCHIVE[S] <ivyurl> <ivyurl>*
Hive 1.2.0开始,使用格式为 ivy://group:module:version?query_stringivy URL将一个或多个文件、jar或存档添加到分布式缓存中的资源列表中。有关更多信息请参见Hive资源
list FILE[S]
list JAR[S]
list ARCHIVE[S]
列出已经添加到分布式缓存的资源。有关更多信息请参见Hive资源。(自Hive 0.14.0起:HIVE-7592)。
list FILE[S] <filepath>*
list JAR[S] <filepath>*
③list ARCHIVE[S] <filepath>*
检查给定资源是否已经添加到分布式缓存中。有关更多信息请参见Hive资源
delete FILE[S] <filepath>*
delete JAR[S] <filepath>*
delete ARCHIVE[S] <filepath>*
从分布式缓存中删除资源。
delete FILE[S] <ivyurl> <ivyurl>*
delete JAR[S] <ivyurl> <ivyurl>*
delete ARCHIVE[S] <ivyurl> <ivyurl>*
Hive 1.2.0 开始,从分布式缓存中删除使用<ivyurl>添加的资源。有关更多信息,有关更多信息请参见Hive资源
reload Hive 0.14.0开始,使 HiveServer2 获知配置参数hive.reloadable.aux.jars.path 指定的路径中的任何jar变化(无需重新启动 HiveServer2)。所做的更改可以是添加、删除或更新jar文件。
dfs <dfs command> 执行dfs命令。
<query string> 执行 Hive 查询并将结果打印到标准输出。

4 Beeline 输出格式

在Beeline中,结果可以以不同的格式显示。可以使用 outputformat 选项设置格式模式。支持以下输出格式:

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

4.1 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  |
+-----+---------+-----------------+

4.2 vertical

结果的每一行都以键值格式的块显示,其中键是列的名称。例:

-- 查询结果
> 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

4.3 xmlattr

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

-- 查询结果
> 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>

4.4 xmlelements

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

-- 查询结果
> select id, value, comment from test_table;
<resultset>
  <result>
    <id>1</id>
    <value>Value1</value>
    <comment>Test comment 1</comment>
  </result>
  <result>
    <id>2</id>
    <value>Value2</value>
    <comment>Test comment 2</comment>
  </result>
  <result>
    <id>3</id>
    <value>Value3</value>
    <comment>Test comment 3</comment>
  </result>
</resultset>

4.5 csv2、tsv2、dsv

Hive 0.14 开始,提供了改进的 SV 输出格式,即dsv、csv2 和 tsv2。这三种格式的区别仅在于单元格之间的分隔符,对于 csv2 是逗号,对于 tsv2 是制表符,而对于 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

4.6 csv2、tsv2 和 dsv 格式中的引号

如果未禁用引号,则如果值包含特殊字符(例如分隔符或双引号字符)或跨多行,则在值周围添加双引号。 嵌入的双引号与前面的双引号一起转义。

可以通过将 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

4.7 csv、tsv

  • 这两种格式的区别仅在于值之间的分隔符,对于csv是逗号,对于tsv是制表符。
  • 即使使用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'


5 Beeline 链接 Hive

使用这种方式可以远程连接 Hive,只要环境中已经有可用的 beeline,主要远程访问 hive.server2.thrift.port 配置项的值,默认为 10000

当然除了使用 Beeline 连接 Hive,还可以通过其它方式连接 Hive。连接 Hive 的方式主要有如下几种,下面我们主要以 Beeline 为例进行介绍。

  • hive CLI
  • beeline
  • JDBC

5.1 测试数据

假设有如下表和数据

-- 1 查看表
0: jdbc:hive2://cdh3:10000 (default)> desc tmp_test;
OK
id                      int                 
name                    string 

-- 2 插入 3 条数据
0: jdbc:hive2://cdh3:10000 (default)> insert into tmp_test values(1, "a"),(2, "b"), (3, "c");

5.2 方式一:交互式

如下通过 Beeline 链接 Hive :

# 参数说明
#  -n	username,连接 Hive 的用户名(如果未开启权限认证可以不写)
#  -p   password, 连接 Hive 的用户的密码(如果未开启权限认证可以不写)
#  -d   driver class, 连接 Hive 的 驱动类(无特殊情况下,可以选填)
#  -u   database url, 必填,连接 Hive 的 URL
#  --color=true   彩色显示
#  --showDbInPrompt=true 在命令前面显示数据库的名称
#  --isolation 设置事物的隔离级别,<TRANSACTION_NONE | TRANSACTION_READ_COMMITTED | TRANSACTION_READ_UNCOMMITTED | TRANSACTION_REPEATABLE_READ | TRANSACTION_SERIALIZABLE>
#  --incremental=false  使输出的结果更加美观,但输出结果的速度会慢,2.3 之后默认为 true
beeline -n hive -p hive -d "org.apache.hive.jdbc.HiveDriver" -u "jdbc:hive2://cdh3:10000/hive_test" \
--color=true  --showDbInPrompt=true --isolation=TRANSACTION_SERIALIZABLE --incremental=false 

执行一个查询

0: jdbc:hive2://cdh3:10000 (hive_test)> SELECT * FROM tmp_test;
+--------------+----------------+
| tmp_test.id  | tmp_test.name  |
+--------------+----------------+
| 1            | a              |
| 2            | b              |
| 3            | c              |
+--------------+----------------+
3 rows selected (0.474 seconds)

5.3 方式二:执行 sql 语句

# 参数说明如下
#  --hiveconf  格式为 property=value , 设置 Hive 属性值
#  --hivevar  格式为 name=value,配置会话级别的变量名和值,例如 --hivevar hive.security.authorization.enabled=false
#  -e   query, 执行的 查询语句
#  --help  查看帮助
beeline -n hive -p hive -d "org.apache.hive.jdbc.HiveDriver" -u "jdbc:hive2://cdh3:10000/default" \
--hiveconf mapreduce.job.queuename=datacenter --color=true \
-e "select count(*) from hive_test.tmp_test"

# 结果如下
+------+
| _c0  |
+------+
| 3    |
+------+
1 row selected (34.441 seconds)

5.4 方式三:sql 脚本

在 sql 脚本的目录下有 my-hive.sql 文件,文件中有如下 SQL

SELECT m.id,m.movie_name,m.rating_num,m.rating_people,q.rank,q.quote FROM movie m LEFT JOIN quote q ON q.id=m.id ORDER BY m.rating_num DESC,m.rating_people DESC LIMIT 10;
use hive_test;
select count(*) from tmp_test;

使用 beeline 执行 上面的 SQL 脚本

# 参数说明:
#  -f   执行的脚本文件
beeline -n hive -p hive -d "org.apache.hive.jdbc.HiveDriver" -u "jdbc:hive2://cdh3:10000/default"  --color=true \
--hiveconf mapreduce.job.queuename=datacenter \
-f ./my-hive.sql

运行上面命令可以看到输出的结果如下:

0: jdbc:hive2://cdh3:10000/default> SELECT m.id,m.movie_name,m.rating_num,m.rating_people,q.rank,q.quote FROM movie m LEFT JOIN quote q ON q.id=m.id ORDER BY m.rating_num DESC,m.rating_people DESC LIMIT 10;
+----------+------------------------------------------+---------------+------------------+---------+------------------+
|   m.id   |               m.movie_name               | m.rating_num  | m.rating_people  | q.rank  |     q.quote      |
+----------+------------------------------------------+---------------+------------------+---------+------------------+
| 1292052  | 肖申克的救赎 The Shawshank Redemption (1994)   | 9.7           | 1502851          | 1       | 希望让人自由。          |
| 1291546  | 霸王别姬 (1993)                              | 9.6           | 1112641          | 2       | 风华绝代。            |
| 1296141  | 控方证人 Witness for the Prosecution (1957)  | 9.6           | 195362           | 29      | 比利·怀德满分作品。       |
| 1292063  | 美丽人生 La vita è bella (1997)              | 9.5           | 690618           | 5       | 最美的谎言。           |
| 1295124  | 辛德勒的名单 Schindler's List (1993)           | 9.5           | 613865           | 8       | 拯救一个人,就是拯救整个世界。  |
| 1295644  | 这个杀手不太冷 Léon (1994)                      | 9.4           | 1363430          | 3       | 怪蜀黍和小萝莉不得不说的故事。  |
| 1292720  | 阿甘正传 Forrest Gump (1994)                 | 9.4           | 1178003          | 4       | 一部美国近现代史。        |
| 1292722  | 泰坦尼克号 Titanic (1997)                     | 9.4           | 1119405          | 7       | 失去的才是永恒的。        |
| 1293182  | 十二怒汉 12 Angry Men (1957)                 | 9.4           | 253408           | 36      | 1957年的理想主义。      |
| 1291561  | 千与千寻 千と千尋の神隠し (2001)                     | 9.3           | 1205228          | 6       | 最好的宫崎骏,最好的久石让。   |
+----------+------------------------------------------+---------------+------------------+---------+------------------+
10 rows selected (50.576 seconds)
0: jdbc:hive2://cdh3:10000/default> use hive_test;
No rows affected (0.069 seconds)
0: jdbc:hive2://cdh3:10000/default> select count(*) from tmp_test;
+------+
| _c0  |
+------+
| 3    |
+------+
1 row selected (34.686 seconds)

5.5 关于脚本的后台执行

我们通过前面可以看到,不管是 sql 语句的执行,还是 sql 脚本的执行,都是在前台执行,如果有多个 beeline 命令要执行,则需要前面先执行后面的等待执行,这样很不适合于脚本的自动化和批量处理。

此时我们可以通过 ,在 CentOS 环境下我们可以使用 nohup 命令从终端断开进行后台处理。如下所示执行了两个后台命令,这样会在后台启动一个进程执行脚本或 SQL ,并将执行的结果和日志重定向输出到指定文件中。

nohup beeline -n hive -p hive -d "org.apache.hive.jdbc.HiveDriver" -u "jdbc:hive2://cdh3:10000/default" \
--hiveconf mapreduce.job.queuename=datacenter --silent=true --showHeader=true --outputformat=csv2 \
-e "desc hive_test.tmp_test" \
</dev/null >> /tmp/output.log 2>> /tmp/error.log &

nohup beeline -n hive -p hive -d "org.apache.hive.jdbc.HiveDriver" -u "jdbc:hive2://cdh3:10000/default" \
--hiveconf mapreduce.job.queuename=datacenter --silent=true --showHeader=true --outputformat=dsv \
-f ./my-hive.sql \
</dev/null >> /tmp/output.log 2>> /tmp/error.log &

上面的第一个命令时查看 tmp_test 结构,以 csv2 格式输出到 结果文件。第二个命令时执行 sql 脚本,输出格式为可配置的 dsv 格式(默认分隔符为 |),执行完毕后两个后台进程自动结束,查看结果文件如下:

col_name,data_type,comment
id,int,
name,string,
m.id|m.movie_name|m.rating_num|m.rating_people|q.rank|q.quote
1292052|肖申克的救赎 The Shawshank Redemption (1994)|9.7|1502851|1|希望让人自由。
1291546|霸王别姬 (1993)|9.6|1112641|2|风华绝代。
1296141|控方证人 Witness for the Prosecution (1957)|9.6|195362|29|比利·怀德满分作品。
1292063|美丽人生 La vita è bella (1997)|9.5|690618|5|最美的谎言。
1295124|辛德勒的名单 Schindler's List (1993)|9.5|613865|8|拯救一个人,就是拯救整个世界。
1295644|这个杀手不太冷 Léon (1994)|9.4|1363430|3|怪蜀黍和小萝莉不得不说的故事。
1292720|阿甘正传 Forrest Gump (1994)|9.4|1178003|4|一部美国近现代史。
1292722|泰坦尼克号 Titanic (1997)|9.4|1119405|7|失去的才是永恒的。
1293182|十二怒汉 12 Angry Men (1957)|9.4|253408|36|1957年的理想主义。
1291561|千与千寻 千と千尋の神隠し (2001)|9.3|1205228|6|最好的宫崎骏,最好的久石让。
_c0
3

6 Beeline 链接 Impala

6.1 分析系统环境的 beeline 脚本

这里以 CDH 环境为例,我们在 Beeline 环境下输入如下命令查看 beeline 信息,

# 1 查看系统环境下的 beeline 的路径
bogon:~ yoreyuan$ which beeline
/usr/bin/beeline

# 2 查看文件信息,发现这个是一个软连接,指向了 /etc/alternatives 下
bogon:~ yoreyuan$ ll -h /usr/bin/beeline
lrwxrwxrwx 1 root root 25 Dec 19 02:01 /usr/bin/beeline -> /etc/alternatives/beeline

# 3 我们再次查看 /etc/alternatives/beeline 文件,我们发现它依然是一个软连接
bogon:~ yoreyuan$ ll  /etc/alternatives/beeline
lrwxrwxrwx 1 root root 65 Dec 19 02:01 /etc/alternatives/beeline -> /opt/cloudera/parcels/CDH-6.3.2-1.cdh6.3.2.p0.1605554/bin/beeline

# 4 再次跟踪查看上面的文件。OK,这次是一个文件了
bogon:~ yoreyuan$ ll /opt/cloudera/parcels/CDH-6.3.2-1.cdh6.3.2.p0.1605554/bin/beeline
-rwxr-xr-x 1 root root 771 Nov  9 00:09 /opt/cloudera/parcels/CDH-6.3.2-1.cdh6.3.2.p0.1605554/bin/beeline

# 5 查看 beeline 脚本文件
bogon:~ yoreyuan$  vim  /opt/cloudera/parcels/CDH-6.3.2-1.cdh6.3.2.p0.1605554/bin/beeline

beeline 脚本文件如下。从脚本中我们可以看到最后执行的是exec $LIB_DIR/hive/bin/beeline "$@",这个值其实就是执行的 /opt/cloudera/parcels/CDH-6.3.2-1.cdh6.3.2.p0.1605554/bin/../lib/hive/bin/beeline 的 beeline 脚本,也就是 CDH 的 Hive 中带的 beeline 客户端。

#!/bin/bash
  # Reference: http://stackoverflow.com/questions/59895/can-a-bash-script-tell-what-directory-its-stored-in
  SOURCE="${BASH_SOURCE[0]}"
  BIN_DIR="$( dirname "$SOURCE" )"
  while [ -h "$SOURCE" ]
  do
    SOURCE="$(readlink "$SOURCE")"
    [[ $SOURCE != /* ]] && SOURCE="$BIN_DIR/$SOURCE"
    BIN_DIR="$( cd -P "$( dirname "$SOURCE"  )" && pwd )"
  done
  BIN_DIR="$( cd -P "$( dirname "$SOURCE" )" && pwd )"
  LIB_DIR=$BIN_DIR/../lib
# Autodetect JAVA_HOME if not defined
. $LIB_DIR/bigtop-utils/bigtop-detect-javahome
BIGTOP_DEFAULTS_DIR=${BIGTOP_DEFAULTS_DIR-$BIN_DIR/../etc/default}
[ -n "${BIGTOP_DEFAULTS_DIR}" -a -r ${BIGTOP_DEFAULTS_DIR}/hbase ] && . ${BIGTOP_DEFAULTS_DIR}/hbase
export HIVE_HOME=$LIB_DIR/hive
exec $LIB_DIR/hive/bin/beeline "$@"

因此我们再来查看 hive 下的 beeline 脚本:vim /opt/cloudera/parcels/CDH-6.3.2-1.cdh6.3.2.p0.1605554/bin/../lib/hive/bin/beeline,脚本内容如下:

#!/usr/bin/env bash

# Licensed to the Apache Software Foundation (ASF) under one or more
# contributor license agreements.  See the NOTICE file distributed with
# this work for additional information regarding copyright ownership.
# The ASF licenses this file to You under the Apache License, Version 2.0
# (the "License"); you may not use this file except in compliance with
# the License.  You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

bin=`dirname "$0"`
bin=`cd "$bin"; pwd`

# Set Hadoop User classpath to true so that httpclient jars are taken from
# hive lib instead of hadoop lib.
export HADOOP_USER_CLASSPATH_FIRST=true

# If process is backgrounded, don't change terminal settings
if [[ ( ! $(ps -o stat= -p $$) =~ "+" ) && ! ( -p /dev/stdin ) && ( ! $(ps -o tty= -p $$) =~ "?" ) ]]; then
  export HADOOP_CLIENT_OPTS="$HADOOP_CLIENT_OPTS -Djline.terminal=jline.UnsupportedTerminal"
fi

. "$bin"/hive --service beeline "$@"

从上面的脚本内容我们可以看到最终执行的命令为 "$bin"/hive --service beeline "$@",其中 $bin 的值为 /opt/cloudera/parcels/CDH/lib/hive/bin,也就是执行的是 hive 客户端脚本,只不过传入的参数为 --service beeline ,我们可以通过 hive --help 查看帮助信息:--service : 启动指定的 服务或组件,cli 是默认的 ,这个可以通过查看 hive 脚本第 69 行到 75 行验证(可见hive脚本):

if [ "$SERVICE" = "" ] ; then
  if [ "$HELP" = "_help" ] ; then
    SERVICE="help"
  else
    SERVICE="cli"
  fi
fi

我们进一步查看 hive 脚本大约在 146 行(可见hive脚本),可以看到 hive 脚本会将 ${HIVE_HOME}/auxlib/*.jar 下的 jar 包添加进来。

# adding jars from auxlib directory
for f in ${HIVE_HOME}/auxlib/*.jar; do
  if [[ ! -f $f ]]; then
      continue;
  fi
  if $cygwin; then
      f=`cygpath -w "$f"`
  fi
  AUX_CLASSPATH=${AUX_CLASSPATH}:$f
  if [ "${AUX_PARAM}" == "" ]; then
    AUX_PARAM=file://$f
  else
    AUX_PARAM=${AUX_PARAM},file://$f;
  fi
done

6.2 导入 Impala 驱动包

从上面可以看到脚本会加载 /opt/cloudera/parcels/CDH/lib/hive/auxlib/ 下的 jar 包,但是直接使用 beeline 连接 Impala 会报驱动找不到的错误。因此我们需要将 Impala 驱动包导入环境。

Connecting to jdbc:impala://cdh3:21050/impala_demo
com.cloudera.impala.jdbc41.Driver
com.cloudera.impala.jdbc41.Driver
No current connection

我们直接从官网下载 Impala 驱动包导入 上面的路径下即可(不用重启 Impala 也不用重启 Hive)。

# 1 下载驱动包
wget https://downloads.cloudera.com/connectors/impala_jdbc_2.5.41.1061.zip

# 2 解压到某一个临时的文件夹下
mkdir impala_drive
unzip impala_jdbc_2.5.41.1061.zip -d ./impala_drive/
# 查看  ./impala_drive/2.5.41.1061\ GA/ 可以看到有两个版本的 JDBC 驱动压缩包
unzip ./impala_drive/2.5.41.1061\ GA/Cloudera_ImpalaJDBC41_2.5.41.zip -d ./impala_drive/

# 3 拷贝第二步解压的两个 jar 包到指定目录(CDH 环境下)
cp ./impala_drive/ImpalaJDBC41.jar  /opt/cloudera/parcels/CDH/lib/hive/auxlib/
cp ./impala_drive/TCLIServiceClient.jar  /opt/cloudera/parcels/CDH/lib/hive/auxlib/

# 4 如果下载的驱动包不再使用,可以删除
rm -rf impala_drive/

6.3 mpala-shell 方式执行 sql

# 1 执行 sql 语句 
# 参数说明如下:
#   -u      认证的用户,默认为 root
#   -i      指定 Impala 的 IMPALAD 服务地址,默认为 localhost:21000,
#   -f      执行的查询 脚本文件
impala-shell -u impala -i cdh3:21000 \
-q "use impala_demo; SELECT id,movie_name,rating_num,rating_people,release_date FROM movie ORDER BY release_date DESC LIMIT 5;" 

# 2 sql 脚本
# 2.1 my-impala.sql 中有如下 sql
use impala_demo; 
SELECT id,movie_name,rating_num,rating_people,release_date FROM movie ORDER BY release_date DESC LIMIT 5;

# 2.2 执行
impala-shell -u impala -i cdh3:21000 \
-f ./my-impala.sql

6.4 通过 beeline 执行 Impala sql 语句

#  执行 sql 语句 
#  如果有错误提示 Error: [Simba][JDBC](11975) Unsupported transaction isolation level: 4. (state=HY000,code=11975)
#  可以加上参数:--isolation=default 
beeline -n impala -d "com.cloudera.impala.jdbc41.Driver" -u "jdbc:impala://cdh3:21050/impala_demo" \
--isolation=default \
-e "SELECT id,movie_name,rating_num,rating_people,release_date FROM movie ORDER BY release_date DESC LIMIT 5;"

6.5 通过 beeline 执行 Impala sql 脚本

# sql 脚本
beeline -n impala -d "com.cloudera.impala.jdbc41.Driver" -u "jdbc:impala://cdh3:21050/impala_demo" \
--isolation=default \
-f ./my-impala.sql

7 Beeline 链接 Mysql

通过前面的介绍我们可以知道 Impala 是一个基于 SQLLine CLI的 JDBC 客户端,那么当然也可以连接传统的关系型数据(可以查看啊 SQLine CLI introduction),例如 Oracle、MySQL 等。这里我们连接 MySQL 为例。

执行如下命令远程连接 MySQL。如果执行时报 MySQL驱动找不到,可以按照上面6.2 导入 Impala 驱动包中的方式下载 MySQL 驱动包导入环境中。因为我的这个节点是一个 cdh 的节点,在安装 CDH 时已经将 MySQL 驱动导入环境中了,所以这里可以直接使用 Beeline 连接 MySQL。

beeline -n scm -p 3UsaTx#bHR -d "com.mysql.jdbc.Driver" \
-u "jdbc:mysql://cdh1:3306/flink_test?useUnicode=true&characterEncoding=utf8&useSSL=false" \
--color=true --isolation=TRANSACTION_SERIALIZABLE --incremental=false 
Connecting to jdbc:mysql://cdh1:3306/flink_test?useUnicode=true&characterEncoding=utf8&useSSL=false
Connected to: MySQL (version 5.6.44-log)
Driver: MySQL Connector Java (version mysql-connector-java-5.1.42 ( Revision: 1f61b0b0270d9844b006572ba4e77f19c0f230d4 ))
Transaction isolation: TRANSACTION_SERIALIZABLE
Beeline version 2.1.1-cdh6.3.2 by Apache Hive
0: jdbc:mysql://cdh1:3306/flink_test> SHOW TABLES;
+-------------------------+
|  Tables_in_flink_test   |
+-------------------------+
| flower                  |
| …… 省略                  |
+-------------------------+
23 rows selected (0.108 seconds)

-- 执行 sql 
0: jdbc:mysql://cdh1:3306/flink_test> SELECT * FROM flower LIMIT 3;
+-----+-------+-------+---------------------+------------+
| id  | date  | name  |       en_name       | utterance  |
+-----+-------+-------+---------------------+------------+
| 1   | 11| 雪莲花   | Snow Drop           | 纯白的爱       |
| 2   | 12| 黄水仙   | Narcisus Jonquilla  | 神秘         |
| 3   | 13| 藏红花   | Spring Crocus       | 执著         |
+-----+-------+-------+---------------------+------------+
3 rows selected (0.25 seconds)

发布了40 篇原创文章 · 获赞 97 · 访问量 15万+

猜你喜欢

转载自blog.csdn.net/github_39577257/article/details/104645603