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

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=,其中:

  • <http_endpoint>是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=,其中:

  • <trust_store_path>是 client 的信任庫文件所在的路徑。
  • <trust_store_password>是訪問信任庫的密碼。

在 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://<zookeeper quorum>/;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的連接。

<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
<property>
 <name>beeline.hs2.connection.user</name>
 <value>hive</value>
</property>
<property>
 <name>beeline.hs2.connection.password</name>
 <value>hive</value>
</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的值。

<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
<property>
 <name>beeline.hs2.connection.hosts</name>
 <value>localhost:10000</value>
</property>
<property>
 <name>beeline.hs2.connection.principal</name>
 <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值。

<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
<property>
 <name>beeline.hs2.connection.user</name>
 <value>hive</value>
</property>
<property>
 <name>beeline.hs2.connection.hiveconf</name>
 <value>hive.cli.print.current.db=true, hive.cli.print.header=true</value>
</property>
<property>
 <name>beeline.hs2.connection.hivevar</name>
 <value>testVarName1=value1, testVarName2=value2</value>
</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 如下所示:

<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
<property>
  <name>beeline.hs2.jdbc.url.tcpUrl</name>
  <value>jdbc:hive2://localhost:10000/default;user=hive;password=hive</value>
</property>

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

<property>
  <name>beeline.hs2.jdbc.url.default</name>
  <value>tcpUrl</value>
</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:

<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
<property>
 <name>beeline.hs2.connection.user</name>
 <value>hive</value>
</property>
<property>
  <name>beeline.hs2.connection.password</name>
  <value>hive</value>
</property>
</configuration>

考慮以下 beeline-site.xml:

<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
<property>
  <name>beeline.hs2.jdbc.url.tcpUrl</name>
  <value>jdbc:hive2://localhost:10000/default</value>
</property>

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

<property>
  <name>beeline.hs2.jdbc.url.default</name>
  <value>tcpUrl</value>
</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 字段。
  • <trust_store_password>是訪問信任庫的密碼。
  • < 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,並將其設置爲 = 和 = 。

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