2.3 Hive 內部介紹: P44
$HIVE_HOME/lib 下的 jar 文件是具體的功能部分;(CLI模塊)
其它組件,Thrift 服務,可以遠程訪問其他進程功能;也有使用 JDBC 和 ODBC 訪問 Hive 的功能;
所有Hive 客戶端都需要一個 metastoreservice(元數據服務),Hive 用這個服務來存儲表模式信息和其他元數據信息;默認會使用內置的 Derby SQL服務器提供有限的單進程的存儲服務;
HWI Hive 網頁界面,提供了遠程訪問Hive 的服務;
conf 目錄下存放了Hive 的配置文件
2.4 啟動 Hive 進入 CLI 模式
$HIVE_HOME/bin/hive 會顯示用戶所執行的命令和查詢日志數據所存放在的本地文件系統中的位置,還有OK 及查詢所消耗的時間等信息;
注意:Hive 中的關鍵字是不區分大小寫的;
如果使用 Derby 數據庫作為元數據存儲的話,那么會在用戶使用的當前的目錄是建立一個 metastore_db 的目錄,此目錄是在啟動Hive會話的時候由 Derby 建立的,如果用戶切換其它目錄來執行啟動Hive ,它會在其他目錄新建立這個 目錄 ,並忘記以前的目錄會造成數據丟失,所以要把元數據存儲配置成一個永久的路徑最好;
hive.metastore.warehouse.dir 用於指定 Hive 表存儲所在的位置 在 Hadoop中默認的值是
/usr/hive/warehouse 這個為屬性指定不同的值可以允許每個用戶定義其自己的數據倉庫目錄,這樣可以避免影響其他系統用戶,如:set
hive.metastore.warehouse.dir=/user/myname/hive/warehouse; 為了不讓每次啟動Hive時指定這樣的一個腳本比較麻煩,可以把它放在
$HIVE_HOME/.hiverc 文件中,每次啟動Hive 文件都會執行這個文件;
2.5 使用 JDBC 連接元數據
Hive所提供的組件中沒有元數據存儲組件的,這個是Hadoop所沒有的,需要外部提供;元數據存儲中趕集了表的模式和分區信息等元數據信息,用戶在執行操作(create tablse 、alter talbe)的時候會指定這些信息,因為多用戶系統可能並發這些元數據存儲,所以默認的內置數據庫並不適用於生產環境;
設置MySQL 來作業元數據存儲:假設在 db1.mydomain.pvt 服務器的 3306 端口上運行着 MySQL,且數據庫名為 hive_db
設置 hive-siet.xml 中的元數據存儲數據庫配置
<property>
<name>javax.jdo.option.ConnectionURL</name>
<value>jdbc:mysql://db1.mydomain.pvt:3306/hive_db?createDatabaseIfNotExist=true</value>
<description>JDBC connect string for a JDBC metastore</description>
</property>
<property>
<name>javax.jdo.option.ConnectionDriverName</name>
<value>com.mysql.jdbc.Driver</value>
<description>Driver class name for a JDBC metastore</description>
</property>
<property>
<name>javax.jdo.option.ConnectionUserName</name>
<value>root</value>
<description>username to use against metastore database</description>
</property>
<property>
<name>javax.jdo.option.ConnectionPassword</name>
<value>911</value>
<description>password to use against metastore database</description>
</property>
<property>
為了使 Hive 能夠連接上 MySql,需要將 JDBC 驅動放置在類路徑下: MySQL JDBC (Jconnector 下載地址:http://www.mysql.com/downloads/connecotr/j/)下載完后可放置在 Hive 庫路徑下,$HOME_HIVE/lib 下;配置信息完畢后 Hive 就會把元數據存儲到 MySql 中;
2.6 Hive 命令
$HOME_HIVE/bin/hive 進入 CLI 的 Hive e服務通道
bin/hive --helfp 查看hive 命令的幫助
Service List 里面的內容提供的服務,包括我們常使用的CLI,可以通過 --service name 服務名稱來啟用某個服務;
Hive 的服務:
cli 命令行界面;用戶定義表,執行查詢等
hiveserver Hive Server 監聽來自於其他進程的 Thrift 連接的一個守護進程
hwi HiveWeb 界面;是一個可以執行查詢語句和其他命令的簡單的 web界面,可以不用登錄到集群中的機器上使用 CLI 來進行查詢
jar hadoop jar 命令的一個擴展,這樣可以執行需要 Hive 環境的應用
metastore 啟動一個擴展的 Hive 元數據服務,可以供多客戶端使用
rcfilecat 一個可以打印出 RCFile 格式文件內容的工具;
--auxpath 選項允許用戶指定一個以冒號分割的 附屬的 Java 包 這些文件中包含用戶可能需要的自定義的擴展;
--config 文件目錄 這個命令允許用戶覆蓋 $HIVE_HOME/conf 中默認的屬性配置,而指向一個新的配置文件目錄;
2.7 命令行界面
$hive --help --service cli 顯示 CLI 所提供的選項列表
usage: hive
-d,--define <key=value> Variable subsitution to apply to hive
commands. e.g. -d A=B or --define A=B
--database <databasename> Specify the database to use
-e <quoted-query-string> SQL from command line
-f <filename> SQL from files
-h <hostname> connecting to Hive Server on remote host
-H,--help Print help information
--hiveconf <property=value> Use value for given property
--hivevar <key=value> Variable subsitution to apply to hive commands. e.g. --hivevar A=B
-i <filename> Initialization SQL file
-p <port> connecting to Hive Server on port number
-S,--silent Silent mode in interactive shell
-v,--verbose Verbose mode (echo executed SQL to the console)
變量和屬性:
--fefine key=value 和 --hivevar key=value 是等價的,二者都可以讓用戶在命令行定義用戶自定義變量以便在 Hive 腳本中引用,來滿足不同情況的執行;0.8.0以后的版本才有;並會將這些鍵值對放到 hivevar 命名空間,以便與其他3種內置命令空間(hiveconf、system、env)進行區分 ;
Hive 中變量和屬性命名空間
hivevar 讀/寫 用戶自定義變量
hiveconf 讀/寫 Hive 相關配置
system 讀/寫 Java 定義的配置屬性
env 讀 Shell 環境定義的環境變量
Hive 變量內部是以 Java 字符串的方式存儲的,用戶可以在查詢中引用變量,Hive會先使用變量值替換掉查詢的變量引用,然后才會將語句提交給查詢處理器;
CLI 中可使用 SET 顯示或修改變量值;
set evn:HOME 顯示當前執行hive的目錄;
set 輸出更多目錄
hvie -v; 如果不加 -v 則會打印出所以的變更內容;如果使用 -v 則還會打印 hadoop 中所定義的所有的屬性,
set --define foo=bar 定義變量
set foo 顯示變量 foo=bar;
set hivevar:foo; 顯示 變量 foo 顯示內容 hivevar:foo=bar
set hivevar:foo=bar2; 設置變量;
set foo; 顯示 foo=bar2
從以上可以看出 hivevar: 是可選的;
在CLI 中查詢語句中的變量引用會先被替換掉然后才會提交給查詢處理器。
create table tossl(i int,${hivevar:foo} string);
describe tossl; 顯示 ${hivevar:foo} 變量的值;
set hive.cli.print.current.db 查看此設置的值; 默認為 false ; 設置為 true 可以在CLI 提示符打印當前所在的數據庫名;默認的數據名為 default ;
hive> set system:user.name; 顯示 system:user.name=root;
hive>set env:HOME; 顯示 env:HOME=/root
注意:用戶必須使用 system: 或者 env: 前綴來指定系統屬性和環境變量;
Hive 中 “一次使用”的命令可以這樣:
$hive -e "select * from mytable limit 3"; 可以執行一次命令后就會退出;
$ hive -S -e
"select * from mytable limit 3" > /tmp/myquery ; -S 選項可以開啟靜默模式,結果里就不顯示 OK ,Timetaken 等;並將結果存入 /tmp/myquery 文件 而不是HDFS 中;
$hive -S -e "set" | grep warehouse 如果記不清楚某個屬性名時,可以使用此命令來查詢屬性;
從文件中執行 Hive 查詢,Hive中可以使用 -f 文件名試執行指定文件中的一個或者多個查詢語句;一般把這些 Hive 查詢文件保存為.q 或 .hql 后綴的文件;
$hive -f /path/to/file/withqueryies.hql
hive> source /path/to/file/withqueries.hql; 在 CLI 中 執行 文件中的 Hive 語句 ;
$hive -e "LOAD DATA LOCAL INPATH '/tmp/myfile' INTO TALBE src";
2.7.5 hiverc 文件
$hive -i '/tmp/myfile' 允許用戶指定一個文件,當 CLI 啟動時會在提示符出現之前先執行這個文件。也可以在 Hive 的 HOME 目錄下尋找
.hiverc 的文件,而且會自動執行這個文件中的命令;
對於用戶需要和和頻繁執行的命令,可以使用此文件,如設置系統屬性和變量等;例如:
ADD JAR /path/to/costom_hive_extensions.jar 向分布式內存中半圓一個 jar 文件
set hive.cli.print.current.db=true; 顯示CLI提示符前顯示當前所在的工作數據庫
set hive.exec.mode.local.auto=true; 鼓勵 Hive 如果可以使用本地模式執行的話就在本地執行,這樣可以加快小數據集的數據查詢速度
注意:每行后面的 ; 一定要記得加上
2.7.6 更多的 Hive CLI 介紹
1)自動補全功能:在輸入命令過程中 按 Tab 制表鍵,CLI 會自動 補全可能的關鍵字;
2)查看操作命令歷史:可以用上下箭頭來查看之前 的命令,它被記錄在 $HOME_HIVE/.hivehistory 中,能保存 10000條
2.7.8 執行 shell 命令
用戶不需要退出 Hive CLI就可以執行簡單的 bash shell 命令,只要在命令前加上 !並且以 ; 結尾就可以
hive> ! /bin/echo "what up dog";
hive>! pwd;
注意:不能使用 shell 的管道功能 和文件名稱自動實例功能;
2.7.9 在 Hive 內使用 Hadoop 的dfs 命令[在hvie中使用 hadoop命令比在 bash shell 中使用要快因為它會在hive的同一個進程中執行這些命令]
hive> dfs -sl /; 只要將 hadoop 命令中的 hadoop 關鍵字去掉,並且以分號結尾即可
hive> dfs -help ; 查盾 dfs 所提供的所有功能選項列表
2.7.10 Hive 腳本中的注釋
在保存 HiveQuery 的文件里可以以--來注釋 語句,但不能在 CLI 中這樣注釋;
在保存 HiveQuery 的文件里可以以--來注釋 語句,但不能在 CLI 中這樣注釋;
2.7.11 顯示字段名稱
set hive.cli.print.header=true; 來顯示字段名稱