##安裝和配置html
首先從Apache下載鏡像下載最新的發佈包(見Hive版本) 接下來解壓縮tar包。這將會建立一個名字爲hive-x.y.z的子目錄java
$ tar -xzvf hive-x.y.z.tar.gz
配置環境變量HIVE_HOME 指向安裝的目錄:python
$ cd hive-x.y.z $ export HIVE_HOME={{pwd}}
最後,添加$HIVE_HOME/bin 到PATH:web
$ export PATH=$HIVE_HOME/bin:$PATH
###從源碼建立Hive Hive SVN地址:http://svn.apache.org/repos/asf/hive/trunk正則表達式
$ svn co http://svn.apache.org/repos/asf/hive/trunk hive $ cd hive $ ant clean package $ cd build/dist $ ls README.txt bin/ (all the shell scripts) lib/ (required jar files) conf/ (configuration files) examples/ (sample input and query files)
接下來咱們會交替使用build/dist和<install-dir>. ###使用hadoop0.23.3編譯Hiveshell
$ svn co http://svn.apache.org/repos/asf/hive/trunk hive $ cd hive $ ant clean package -Dhadoop.version=0.23.3 -Dhadoop-0.23.version=0.23.3 -Dhadoop.mr.rev=23 $ ant clean package -Dhadoop.version=2.0.0-alpha -Dhadoop-0.23.version=2.0.0-alpha -Dhadoop.mr.rev=23
###運行Hive Hive使用了Hadoop,所以:數據庫
另外,你在Hive中建立表前必須在HDFS上建立/tmp和/user/hive/warehouse(見hive.metastore.warehouse.dir)目錄,而且設置權限爲 chmod g+w 完成這個步驟的命令:apache
$ $HADOOP_HOME/bin/hadoop fs -mkdir /tmp $ $HADOOP_HOME/bin/hadoop fs -mkdir /user/hive/warehouse $ $HADOOP_HOME/bin/hadoop fs -chmod g+w /tmp $ $HADOOP_HOME/bin/hadoop fs -chmod g+w /user/hive/warehouse
設置HIVE_HOME,雖然不是必須的,可是頗有用api
$ export HIVE_HOME=<hive-install-dir>
從shell使用Hive命令行工具(CLI)安全
$ $HIVE_HOME/bin/hive
###運行HCatalog
從shell運行HCatalog,Hive0.11.0及之後版本:
$ $HIVE_HOME/hcatalog/sbin/hcat_server.sh
使用HCatalog命令行工具(CLI),Hive0.11.0及之後版本: $ $HIVE_HOME/hcatalog/bin/hcat 更多信息,見HCatalog手冊中的從TAR包安裝HCatalog和HCatalog CLI ###運行WebHCat 從shell運行WebCat server,Hive0.11.0及之後版本: $ $HIVE_HOME/hcatalog/sbin/webhcat_server.sh 更多信息 見WebHCat手冊的安裝WebHCat
###配置管理概述
###運行時配置
Hive查詢是執行map-reduce查詢,所以這些查詢能夠經過Hadoop配置變量來控制
CLI命令'SET'能夠設置任意Hadoop(或者Hive)配置變量,如:
hive> SET mapred.job.tracker=myhost.mycompany.com:50030; hive> SET -v;
後者顯示當前全部配置,不使用-v參數則顯示與Hadoop不一樣的配置。
Hive編譯器將大多數查詢生成爲map-reduce的jobs。這些jobs提交到由變量指定的Map-Reduce集羣 mapred.job.tracker 這一般指向多節點的map-reduce集羣,Hadoop也提供了一個選項在本地用戶機器上運行map-reduce jobs.在小數據集上運行查詢時會很是有用-在這種狀況下,local mode執行一般會比提交到大集羣明顯加快。能夠從HDFS透明訪問數據,相反,local mode只運行一個reducer,在大數據集是將會很是慢。
從0.7版本開始,Hive完美提供了local mode運行。用戶經過配置以下參數來生效
hive> SET mapred.job.tracker=local;
另外,mapred.local.dir指向本地機器的有效路徑(如:/tmp/<username>/mapred/local).(不然用戶將會收到分配本地磁盤空間的異常) 從0.7版本開始,Hive也提供了自動使用local mode來運行map-reduce jobs。相關選項爲hive.exec.mode.local.auto,hive.exec.mode.local.auto.imputbytes.max和hive.exec.mode.local.auto.tasks.max:
hive> SET hive.exec.mode.local.auto=false;
該特性默認是失效的.若是生效,Hive分析查詢中各個map-reduce job的大小,當知足下述全部條件時運行本地模式:
所以在小數據集上查詢,或者查詢在多個map-reduce jobs可是jobs大致上很小,做業會運行在本地模式。
因爲可能Hadoop服務器節點和Hive客戶端機器的運行環境不一樣(由於不一樣的jvm版本或者不一樣的軟件庫)。在本地模式運行時,會產生意想不到的行爲或錯誤。一樣本地模式是在一個獨立的子jvm(Hive的客戶端)運行,若是用戶指望,子jvm所能使用的最大內存量,能夠經過hive.mapred.local.mem選項來控制,默認值爲0,在此狀況下Hive讓Hadoop決定子jvm的默認內存限制。
###錯誤日誌
Hive使用log4j來記錄日誌,默認CLI不會輸出日誌到控制檯。默認日誌級別爲WARN在Hive0.13.0版本以前。從Hive0.13.0版本開始,默認日誌級別爲INFO。日誌存放文件夾:
若是用戶但願-日誌能夠輸出到控制檯,經過添加以下參數: bin/hive -hiveconf hive.root.logger=INFO,console 另外,用戶能夠修改日誌級別: bin/hive -hiveconf hive.root.logger=INFO,DRFA
注意在hive初始化後經過‘set'命令來修改hive.root.logger不會修改日誌屬性。
一樣Hive會爲每一個session保存查詢日誌在/tmp/<user.name>/,可是能夠經過配置hive-site.xml中的hive.querylog.location屬性。
Hive在一個hadoop集羣上運行過程當中的日誌是由Hadoop的配置所決定的。一般Hadoop會對每一個map和reduce task產生一個日誌文件,並保存在運行任務的集羣機器上。經過Hadoop JobTracker WEB界面的任務明細頁面來獲取日誌文件。
使用本地模式時(使用mapred.job.tracker=local),Hadoop/Hive會將執行日誌放在本機上,從0.6版本開始,Hive使用 hive-exec-log4j.properties(不存在則使用hive-log4j.properties ) 來定義默認日誌定義。默認配置文件爲每一個查詢生成單獨日誌文件在本地模式下並存放在/tmp/<user.name>。提供單獨的配置文件是爲了容許管理員在須要的時候集中運行日誌(如:放在NFS文件系統上).執行日誌對調試運行錯誤頗有用。
WebHCat的錯誤和日誌,見 Error Codes and Responses 和 Log Files 在 WebHCat manual.
錯誤日誌對調試問題很是有用,請提交它們和bugs到hive-dev@hadoop.apache.org.
###審計日誌
審計日誌記錄來自於Hive metastore服務器的每一個metastore API調用。
審計日誌記錄了函數和相關的函數參數在metastore日誌文件中。日誌的記錄級別爲log4j的INFO。所以你必須肯定INFO級別的日誌是啓用的(見HIVE-3505).日誌的入口名稱爲」HiveMetaStore.audit".
審計日誌在Hive0.7版本添加,用於安全的客戶端鏈接(HIVE-1948)和Hive0.10版本的非安全鏈接 (HIVE-3277; 也見 HIVE-2797).
##DDL操做
Hive DDL操做文檔:Hive Data Definition Language.
###建立Hive表
hive> CREATE TABLE pokes (foo INT, bar STRING);
建立有2個字段的pokes表,第一個字段類型爲integer另外一個爲string。
hive> CREATE TABLE invites (foo INT, bar STRING) PARTITIONED BY (ds STRING);
建立一個名爲invites的表,有2個字段和一個名爲ds的分區字段,分區字段是一個虛擬字段。它不是數據自己的一部分。可是來源於特定數據集裝入的分區。 默認,表假定輸入格式爲純文本和分隔符爲^A(ctrl-a).
###瀏覽表
hive> SHOW TABLES;
列出全部表
hive> SHOW TABLES '.*s';
列出全部以's'結尾的表。模式匹配使用Java的正則表達式。文檔參見:http://java.sun.com/javase/6/docs/api/java/util/regex/Pattern.html.
hive> DESCRIBE invites;
顯示錶invites的字段。
###變動和刪除表
hive> ALTER TABLE events RENAME TO 3koobecaf; hive> ALTER TABLE pokes ADD COLUMNS (new_col INT); hive> ALTER TABLE invites ADD COLUMNS (new_col2 INT COMMENT 'a comment'); hive> ALTER TABLE invites REPLACE COLUMNS (foo INT, bar STRING, baz INT COMMENT 'baz replaces new_col2');
注意:REPLACE COLUMNS 替換全部存在的字段和只修改表定義.不修改數據。表必須使用native SerDe.(注:不清楚這裏指什麼).REPLACE COLUMNS也可用於從表定義中刪除字段。
hive> ALTER TABLE invites REPLACE COLUMNS (foo INT COMMENT 'only keep the first column');
刪除表:
hive> DROP TABLE pokes;
###元數據存儲
元數據存儲在內嵌的Derby數據庫,其磁盤存放路徑由Hive配置變量javax.jdo.option.ConnectionURL定義.默認路徑爲./metastore_db(見conf/hive-default.xml).
如今,在默認配置中,該元數據每次只能被一個用戶訪問。
元數據能存放在任意支持JPOX的數據庫中,數據庫路徑和類型由參數javax.jdo.option.ConnectionURL和javax.jdo.option.ConnectionDriverName控制。見JDO(或JPOX)文檔瞭解支持的數據庫。數據庫表定義定義在 src/contrib/hive/metastore/src/model目錄下的JDO元數據文件package.jdo。
在未來,元數據自己將會成爲一個單獨的服務。
若是你想將元數據運行爲網絡服務,從而可以被多個節點訪問,見 Hive Using Derby in Server Mode.
###DML操做
Hive DML操做見文檔Hive Data Manipulation Language. 從文件導入數據到Hive
hive> LOAD DATA LOCAL INPATH './examples/files/kv1.txt' OVERWRITE INTO TABLE pokes;
裝載由ctrl-a分隔包括2個字段的文件到pokes表。'LOCAL'指示輸入文件在本地文件系統,若是省略'LOCAL'將會在HDFS上尋找文件。
關鍵字'OVERWRITE'指示刪除表中已經存在的數據。若是省略'OVERWRITE',數據文件將會追加到存在的數據集中。 注意:
load命令不會校驗數據與表定義是否一致。
若是文件在hdfs上,將會移動到Hive管理的文件系統空間。 Hive的根目錄由文件hive-default.xml中的選項 option hive.metastore.warehouse.dir定義。咱們建議用戶在Hive中建立表前先創建這個目錄。
hive> LOAD DATA LOCAL INPATH './examples/files/kv2.txt' OVERWRITE INTO TABLE invites PARTITION (ds='2008-08-15'); hive> LOAD DATA LOCAL INPATH './examples/files/kv3.txt' OVERWRITE INTO TABLE invites PARTITION (ds='2008-08-08');
上面的這2個LOAD語句裝載數據到表invites的2個不一樣的分區。表invites必須先建立一樣的ds鍵的分區來成功運行語句。 hive> LOAD DATA INPATH '/user/myname/kv2.txt' OVERWRITE INTO TABLE invites PARTITION (ds='2008-08-15');
上述命令將從HDFS文件目錄裝載數據到表。 注意從HDFS裝載數據將會移動文件/目錄。該操做幾乎是同時的。
##SQL操做 Hive查詢操做見文檔Select.
###查詢示例
下面展現一些查詢例子,它們也在build/dist/examples/queries. 更多的在Hive源代碼ql/src/test/queries/positive.
####SELECTS and FILTERS
hive> SELECT a.foo FROM invites a WHERE a.ds='2008-08-15';
查詢invites表ds=2008-08-15分區上的'foo'字段的全部記錄。結果將會直接顯示在控制檯上。
在下面的全部例子中,INSERT(到Hive表,本地目錄或者HDFS目錄)是可選的。
hive> INSERT OVERWRITE DIRECTORY '/tmp/hdfs_out' SELECT a.* FROM invites a WHERE a.ds='2008-08-15';
查詢invites表ds=2008-08-15分區的全部記錄結果導出到HDFS的目錄。查詢結果數據在那個目錄下的多個文件(依賴於mappers的個數)。
注意:若是任何查詢使用*,分區字段也會顯示在查詢結果中。
分區表必須在查詢的WHERE子句中指定。
hive> INSERT OVERWRITE LOCAL DIRECTORY '/tmp/local_out' SELECT a.* FROM pokes a;
查詢pokes表的全部記錄處處到本地目錄/tmp/local_out
hive> INSERT OVERWRITE TABLE events SELECT a.* FROM profiles a; hive> INSERT OVERWRITE TABLE events SELECT a.* FROM profiles a WHERE a.key < 100; hive> INSERT OVERWRITE LOCAL DIRECTORY '/tmp/reg_3' SELECT a.* FROM events a; hive> INSERT OVERWRITE DIRECTORY '/tmp/reg_4' select a.invites, a.pokes FROM profiles a; hive> INSERT OVERWRITE DIRECTORY '/tmp/reg_5' SELECT COUNT(*) FROM invites a WHERE a.ds='2008-08-15'; hive> INSERT OVERWRITE DIRECTORY '/tmp/reg_5' SELECT a.foo, a.bar FROM invites a; hive> INSERT OVERWRITE LOCAL DIRECTORY '/tmp/sum' SELECT SUM(a.pc) FROM pc1 a;
查詢字段的SUM,或者使用avg、min或者max。注意不包含在HIVE-287的Hive的版本,你須要使用COUNT(1)來替換COUNT(*).
####GROUP BY
hive> FROM invites a INSERT OVERWRITE TABLE events SELECT a.bar, count(*) WHERE a.foo > 0 GROUP BY a.bar; hive> INSERT OVERWRITE TABLE events SELECT a.bar, count(*) FROM invites a WHERE a.foo > 0 GROUP BY a.bar;
注意不包含在HIVE-287的Hive的版本,你須要使用COUNT(1)來替換COUNT(*).
####JOIN
hive> FROM pokes t1 JOIN invites t2 ON (t1.bar = t2.bar) INSERT OVERWRITE TABLE events SELECT t1.bar, t1.foo, t2.foo;
####MULTITABLE INSERT
FROM src INSERT OVERWRITE TABLE dest1 SELECT src.* WHERE src.key < 100 INSERT OVERWRITE TABLE dest2 SELECT src.key, src.value WHERE src.key >= 100 and src.key < 200 INSERT OVERWRITE TABLE dest3 PARTITION(ds='2008-04-08', hr='12') SELECT src.key WHERE src.key >= 200 and src.key < 300 INSERT OVERWRITE LOCAL DIRECTORY '/tmp/dest4.out' SELECT src.value WHERE src.key >= 300;
####STREAMING
hive> FROM invites a INSERT OVERWRITE TABLE events SELECT TRANSFORM(a.foo, a.bar) AS (oof, rab) USING '/bin/cat' WHERE a.ds > '2008-08-09';
在map階段的數據流經過腳本 /bin/cat (like Hadoop streaming). 一樣的,在reduce也可使用數據流(例子見Hive Tutorial )
##場景例子
###電影評級
首先,創建一張tab鍵分隔的文本格式的表
CREATE TABLE u_data ( userid INT, movieid INT, rating INT, unixtime STRING) ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t' STORED AS TEXTFILE;
接下來下載和提取數據文件
wget http://www.grouplens.org/sites/www.grouplens.org/external_files/data/ml-data.tar.gz tar xvzf ml-data.tar.gz
裝載數據到表 LOAD DATA LOCAL INPATH 'ml-data/u.data' OVERWRITE INTO TABLE u_data;
統計表u_data的記錄數
SELECT COUNT(*) FROM u_data;
注意:不包含在 HIVE-287中的Hive版本須要使用COUNT(1)而不是COUNT(*) 如今咱們在表u_data上來作一些複雜的數據分析 建立weekday_mapper.py:
import sys import datetime for line in sys.stdin: line = line.strip() userid, movieid, rating, unixtime = line.split('\t') weekday = datetime.datetime.fromtimestamp(float(unixtime)).isoweekday() print '\t'.join([userid, movieid, rating, str(weekday)])
使用mapper腳本:
CREATE TABLE u_data_new ( userid INT, movieid INT, rating INT, weekday INT) ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t'; add FILE weekday_mapper.py; INSERT OVERWRITE TABLE u_data_new SELECT TRANSFORM (userid, movieid, rating, unixtime) USING 'python weekday_mapper.py' AS (userid, movieid, rating, weekday) FROM u_data; SELECT weekday, COUNT(*) FROM u_data_new GROUP BY weekday;
注意若是你使用Hive0.5.0或更早版本,你須要使用COUNT(1)而不是COUNT(*).
###Apache Weblog Data Apache weblog的格式是可定製的,大多數web管理員使用默認配置。 默認Apache weblog,咱們建立表使用下面的命令
關於!RegexSerDe的信息見HIVE-662 and HIVE-1719.
CREATE TABLE apachelog ( host STRING, identity STRING, user STRING, time STRING, request STRING, status STRING, size STRING, referer STRING, agent STRING) ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.RegexSerDe' WITH SERDEPROPERTIES ( "input.regex" = "([^]*) ([^]*) ([^]*) (-|\\[^\\]*\\]) ([^ \"]*|\"[^\"]*\") (-|[0-9]*) (-|[0-9]*)(?: ([^ \"]*|\".*\") ([^ \"]*|\".*\"))?" ) STORED AS TEXTFILE;
參考: https://cwiki.apache.org/confluence/display/Hive/GettingStarted