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 123456 -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)

8 SQLLine

正如 Beeline 介紹部分,Beeline 使用的是 SQLLine,那我們這部分使用 SQLLine 來查詢數據,這裏主要以 MySQL、Hive、Impala 爲例,其他的可以參考官方文檔 SQLLine 1.0.2

8.1 安裝

# 1 創建安裝目錄
mkdir /opt/sqlline
cd /opt/sqlline
mkdir lib

# 2 下載 SQLLine
wget https://jaist.dl.sourceforge.net/project/sqlline/sqlline/1.0.2/sqlline-1_0_2.jar

# 3 下載 SQLLine 依賴的 jline
#  注意:jline版本不能高於 1.1.0,否則會報如下異常
#  Caused by: java.lang.ClassNotFoundException: jline.Completor
wget https://repo1.maven.org/maven2/jline/jline/1.0/jline-1.0.jar -P lib/

# 4 下載 MySQL 驅動
wget https://repo1.maven.org/maven2/mysql/mysql-connector-java/5.1.42/mysql-connector-java-5.1.42.jar -P lib/

# 5 下載 Impala 驅動
wget https://downloads.cloudera.com/connectors/impala_jdbc_2.5.41.1061.zip -P lib/
unzip lib/impala_jdbc_2.5.41.1061.zip -d lib/
unzip lib/2.5.41.1061\ GA/Cloudera_ImpalaJDBC41_2.5.41.zip -d lib/
rm -rf lib/2.5.41.1061\ GA
rm -rf lib/*.pdf

# 6 下載 Hive 驅動及其依賴
wget https://repo1.maven.org/maven2/org/apache/hive/hive-jdbc/1.1.1/hive-jdbc-1.1.1.jar
wget https://repo1.maven.org/maven2/org/apache/hive/hive-cli/1.1.0/hive-cli-1.1.0.jar
wget https://repo1.maven.org/maven2/org/apache/hive/hive-service/1.1.0/hive-service-1.1.0.jar
wget https://repo1.maven.org/maven2/org/apache/hadoop/hadoop-common/2.7.7/hadoop-common-2.7.7.jar
wget https://repo1.maven.org/maven2/org/apache/hive/hive-common/1.0.0/hive-common-1.0.0.jar
wget https://repo1.maven.org/maven2/com/google/guava/guava/11.0.2/guava-11.0.2.jar

8.2 進入 CLI

# 1 查看幫助
java -Djava.ext.dirs=$JAVA_HOME/jre/lib/ext:/opt/sqlline/lib -jar /opt/sqlline/sqlline-1_0_2.jar --help
Usage: java sqlline.SqlLine
   -u <database url>               the JDBC URL to connect to
   -n <username>                   the username to connect as
   -p <password>                   the password to connect as
   -d <driver class>               the driver class to use
   --color=[true/false]            control whether color is used for display
   --showHeader=[true/false]       show column names in query results
   --headerInterval=ROWS;          the interval between which heades are displayed
   --fastConnect=[true/false]      skip building table/column list for tab-completion
   --autoCommit=[true/false]       enable/disable automatic transaction commit
   --verbose=[true/false]          show verbose error messages and debug info
   --showWarnings=[true/false]     display connection warnings
   --force=[true/false]            continue running script even after errors
   --maxWidth=MAXWIDTH             the maximum width of the terminal
   --maxColumnWidth=MAXCOLWIDTH    the maximum width to use when displaying columns
   --silent=[true/false]           be more silent
   --autosave=[true/false]         automatically save preferences
   --outputformat=[table/vertical/csv/tsv]   format mode for result display
   --isolation=LEVEL               set the transaction isolation level
   --help                          display this message


# 2 連接 Hive
java -Djava.ext.dirs=$JAVA_HOME/jre/lib/ext:/opt/sqlline/lib -jar /opt/sqlline/sqlline-1_0_2.jar \
--color=true --autoCommit=false -d "org.apache.hive.jdbc.HiveDriver" \
-u "jdbc:hive2://cdh3:10000/default" -n hue -p hue123456

# 3 連接 MySQL
java -Djava.ext.dirs=$JAVA_HOME/jre/lib/ext:/opt/sqlline/lib -jar /opt/sqlline/sqlline-1_0_2.jar \
--color=true -d "com.mysql.jdbc.Driver" -u "jdbc:mysql://localhost:3306/flink_test" -n scm -p 3UsaTx#bHR

# 4 連接 Impala
java -Djava.ext.dirs=$JAVA_HOME/jre/lib/ext:/opt/sqlline/lib/ -jar /opt/sqlline/sqlline-1_0_2.jar \
--color=true --isolation=TRANSACTION_READ_UNCOMMITTED -d "com.cloudera.impala.jdbc41.Driver" \
-u "jdbc:impala://cdh3:21050/reportmart;UID=impala;AuthMech=3;SSL=0;PWD=cdhImpala_123" -n impala -p cdhImpala_123

8.3 執行 SQL

-- 1 進入 sqlline cli
-- java -Djava.ext.dirs=$JAVA_HOME/jre/lib/ext:/opt/sqlline/lib -jar /opt/sqlline/sqlline-1_0_2.jar 

-- 2 查看幫助
sqlline> !help
!all                Execute the specified SQL against all the current connections
!autocommit         Set autocommit mode on or off
!batch              Start or execute a batch of statements
!brief              Set verbose mode off
!call               Execute a callable statement
!close              Close the current connection to the database
!closeall           Close all current open connections
!columns            List all the columns for the specified table
!commit             Commit the current transaction (if autocommit is off)
!connect            Open a new connection to the database.
!dbinfo             Give metadata information about the database
!describe           Describe a table
!dropall            Drop all tables in the current database
!exportedkeys       List all the exported keys for the specified table
!go                 Select the current connection
!help               Print a summary of command usage
!history            Display the command history
!importedkeys       List all the imported keys for the specified table
!indexes            List all the indexes for the specified table
!isolation          Set the transaction isolation for this connection
!list               List the current connections
!manual             Display the SQLLine manual
!metadata           Obtain metadata information
!nativesql          Show the native SQL for the specified statement
!outputformat       Set the output format for displaying results
                    (table,vertical,csv,tsv,xmlattrs,xmlelements)
!primarykeys        List all the primary keys for the specified table
!procedures         List all the procedures
!properties         Connect to the database specified in the properties file(s)
!quit               Exits the program
!reconnect          Reconnect to the database
!record             Record all output to the specified file
!rehash             Fetch table and column names for command completion
!rollback           Roll back the current transaction (if autocommit is off)
!run                Run a script from the specified file
!save               Save the current variabes and aliases
!scan               Scan for installed JDBC drivers
!script             Start saving a script to a file
!set                Set a sqlline variable
!sql                Execute a SQL command
!tables             List all the tables in the database
!typeinfo           Display the type map for the current connection
!verbose            Set verbose mode on

-- 3 查看當前環境可使用 Driver
sqlline> !scan
scan complete in 457ms
8 driver classes found
Compliant Version Driver Class
no        2.5     com.cloudera.impala.jdbc41.Driver
no        5.1     com.mysql.fabric.jdbc.FabricMySQLDriver
no        5.1     com.mysql.jdbc.Driver
no        5.1     com.mysql.jdbc.NonRegisteringDriver
no        5.1     com.mysql.jdbc.NonRegisteringReplicationDriver
no        5.1     com.mysql.jdbc.ReplicationDriver
no        1.1     org.apache.hive.jdbc.HiveDriver
no        5.1     org.gjt.mm.mysql.Driver

-- 4 執行腳本
!connect jdbc:hive2://cdh3:10000/default impala cdhImpala_123 "org.apache.hive.jdbc.HiveDriver"
!run  /root/show_db.sql


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章