Hive教程(1)


1. 介紹

Apache Hive可以使用SQL來讀,寫,管理分布式存儲的大數據集,結構可以投射到已經存儲的數據上,命令行工具和JDBC驅動可以讓用戶連接到Hive。

2. 安裝和配置

你可以下載Hive的穩定版本或者下載源碼,自己編譯Hive

必要:

  • Java1.7(Hive 1.2需要java1.7,Hive 0.14到1.1版本可以與java1.6工作,強烈建議用戶用java1.8)
  • 最好使用Hadoop2.0。hadoop1.x並不會Hive2.0.0以后的版本

從穩定的版本安裝Hive

tar -xzvf hive-x.y.z.tar.gz
cd hive-x.y.z
export HIVE_HOME={{pwd}}
export PATH=$HIVE_HOME/bin:$PATH

運行Hive

Hive使用Hadoop,所以你必須執行該命令

export HADOOP_HOME=<hadoop-install-dir>

在創建表之前,執行HDFS命令創建/tmp和/user/hive/warehouse(hive.metastore.warehouse.dir),設置目錄的權限為g+w。

$HADOOP_HOME/bin/hadoop dfs -mkdir /tmp
$HADOOP_HOME/bin/hadoop dfs -mkdir /user/hive/warehouse
$HADOOP_HOME/bin/hadoop dfs -chmod g+w /tmp
$HADOOP_HOME/bin/hadoop dfs -chmod g+w /user/hive/warehouse

最好設置HIVE_HOME變量

export HIVE_HOME=<hive-install-dir>

運行Hive CLI,為了使用Hive CLI

$HIVE_HOME/bin/hive

運行HiveServer2和Beeline

從Hive2.1開始,我們需要運行schematool命令是為了初始化安裝,例如,我們使用derby作為數據庫類型

$HIVE_HOME/bin/schematool -dbType <db type> -initSchema

HiveServer2是從Hive0.11開始,有它自己的CLI,叫做Beeline。HiveCLI目前已經過了。HiveCLI缺少多用戶,安全性,以及HiveServer2所具有的能力,為了運行HiveServer2和Beeline,執行以下命令

$HIVE_HOME/bin/hiveserver2
$HIVE_HOME/bin/beeline -u jdbc:hive2://$HS2_HOST:$HS2_PORT

Beeline需要HiveServer2的JDBC URL,默認它是(localhost:10000),地址將會是jdbc:hive2://localhost:10000

運行HCatalog

為了運行HCatalog服務(Hive 0.11.0版本以后)

$HIVE_HOME/hcatalog/sbin/hcat_server.sh

為了使用Hcatalog CLI(Hive 0.11.0版本以后)

$HIVE_HOME/hcatalog/bin/hcat

運行WebHCat(Hive 0.11.0版本以后)

$HIVE_HOME/hcatalog/sbin/webhat_server.sh

配置管理簡介

  • Hive默認從<install-dir>/conf/hive-default.xml中得到配置
  • Hive的配置目錄可以通過HIVE_CONF_DIR環境變量改變
  • 配置變量可以改變,通過在<install-dir>/conf/hive-site.xml中重新定義他們
  • Log4j配置是在<install-dir>/conf/hive-log4j.properties
  • Hive配置會覆蓋Hadoop的配置,默認Hive繼承Hadoop的配置
  • Hive配置可以通過下面的方式配置
  1. 編輯hive-site.xml文件,定義期望的變量(包括Hadoop變量)
  2. 使用set命令
  3. 調用Hive,Beeline或者HiveServer2
$ bin/hive --hiveconf x1=y1 --hiveconf x2=y2 //設置變量x1和x2
$ bin/hiveserver2 --hiveconf x1=y1 --hiveconf x2=y2 //設置服務端的變量x1和x2
$ bin/beeline --hiveconf x1=y1 --hiveconf x2=y2 //設置客戶端的變量x1和x2
  • 設置HIVE_OPTS環境變量和"--hiveconf x1=y1 --hiveconf x2=y2"一樣的

運行時配置

Hive查詢是使用map-reduce查詢,因此這種查詢被Hadoop配置變量控制

HiveCLI和Beeline中的SET命令可以設置Hadoop或者Hive的配置變量,例如

beeline> SET mapred.job.tracker=myhost.mycompany.com:50030;
beeline> SET -v;

 

 后面的命令會顯示現在所有的設置,如果不帶-v,僅僅顯示不同於Hadoop基本配置的變量

Hive, Map-Reduce和Local-Mode

Hive編譯器會為查詢行為很多map-reduce jobs,這些jobs會被提交到Map-Reduce集群。Map-Reduce集群被變量mapred.job.tracker控制。

這通常會指向伴隨很多個節點的map-reduce集群,Hadoop也提供一個選項可以在本地運行map-reduce jobs,對於小數據量來說是非常有用的,在這種情況下,本地模式執行通常比提交job到大集群更快。反過來,本地模式僅僅運行一個reducer,所以處理大數據量會很慢。

從Hive0.7版本開始,Hive支持本地模式,為了開啟本地模式,用戶可以執行下面的命令

hive> SET mapreduce.framework.name=local

 

除此之后,還需要配置mapred.local.dir指向本地的一個有效路徑(例如:/tmp/<username>/mapred/local),否則,用戶將會得到一個異常

從Hive0.7版本開始,Hive也支持自動運行jobs在本地模式,相關的選項是hive.exec.mode.local.auto,hive.exec.mode.local.auto.inputbytes.max,hive.exec.mode.local.auto.tasks.max

hive> SET hive.exec.mode.local.auto=false

 

 這個特性默認是關閉狀態,如果開啟的話,Hive分析每個map-reduce job的大小,如果滿足下面的條件,會在本地執行jobs

  • job的輸入大小小於:hive.exec.mode.local.auto.inputbytes.max(默認128MB)
  • map任務的數量小於:hive.exec.mode.local.auto.tasks.max(默認4)
  • reduce任務的數量必須是0或者1

Hive Logging

Hive使用log4j記錄日志,默認logs並不會打印到CLI的控制台上。從Hive0.13.0開始,默認的log級別是INFO

 

----------------------------------------------------------------------------

DDL Operations

Hive DDL operations的文檔:https://cwiki.apache.org/confluence/display/Hive/LanguageManual+DDL

創建Hive表

hive> create table pokes(foo int, bar string)

 

創建一個名叫pokes的表,包含兩列。第一列是integer,第二列是string

create table invites(foo int, bar string) partitioned by (ds string);

 

創建一個名叫invites的表,包含兩列和一個分區列ds,分區列是一個虛擬列,它並不是數據本身。

默認,tables是一個文本格式,分隔符是^A(ctrl-a)

瀏覽表

hive> show tables;

 

顯示所有的表

hive> show tables '.*s';

 

顯示以s結尾的表,支持java的正則表達式

hive> describe 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也可以從table結構中刪除列。

hive> alter table invites replace columns(foo int comment 'only keep the first column');

 

刪除表

hive> drop table pokes;

 

Metadata Store

Metadata是存儲在內嵌的Derby數據庫,磁盤存儲位置由Hive的配置變量javax.jdo.option.ConnectionURL決定,默認是位置是./metastore_db(看conf/hive-default.xml)

在默認的配置中,metadata只能同時被一個用戶看

Metastore可以存儲在任何支持JPOX的數據庫。數據庫的位置和類型可以由javax.jdo.option.ConnectionURL和javax.jdo.option.ConnectionDriverName決定。數據庫schema定義在src/contrib/hive/metastore/src/model中

將來,metastore會是一個獨立的服務

如果你想要metastore作為網絡服務,以至於它可以被多個節點訪問,你可以看:https://cwiki.apache.org/confluence/display/Hive/HiveDerbyServerMode

DML Operation

Hive DML操作文檔在:https://cwiki.apache.org/confluence/display/Hive/LanguageManual+DML

從文件中加載數據到Hive

hive> LOAD DATA LOCAL INPATH './examples/files/kv1.txt' OVERWRITE INTO TABLE pokes;

 

加載文件,這個文件包含被ctrl-a分割的兩列,LOCAL標識輸入文件是本地文件系統,如果LOCAL被忽略,將會尋找HDFS上的文件

OVERWRITE標識將會刪除表里存在的數據,如果OVERWRITE忽略的話,數據將會追加到現在的數據集

注意:

  • load命令並沒有做任何的數據驗證
  • 如果文件在hdfs上,那么文件會移動hive管控的文件系統
  • Hive目錄由hive.metastore.warehouse.dir(hive-default.xml)配置。建議用戶在創建表之前,先創建好這個目錄
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');

 

兩個load將會加載數據到表invites不同的分區,表invites創建必須定義ds分區字段。

hive> LOAD DATA INPATH '/user/myname/kv2.txt' OVERWRITE INTO TABLE invites PARTITION (ds='2008-08-15');

 

上面的命令會加載hdfs的文件到表里

從HDFS中加載數據會引起移動文件或者目錄,因此,操作幾乎是瞬間的。

SQL Operations

Hive query操作的文檔在:https://cwiki.apache.org/confluence/display/Hive/LanguageManual+Select

hive> SELECT a.foo FROM invites a WHERE a.ds='2008-08-15';

 

從invites表的ds=2008-08-15的分區中查詢foo列。這個結果並不會存儲,僅僅顯示在控制台上。

hive> INSERT OVERWRITE DIRECTORY '/tmp/hdfs_out' SELECT a.* FROM invites a WHERE a.ds='2008-08-15';

 

將表invites中的分區ds='2008-08-15'的數據放到HDFS目錄中,結果是存在那個目錄下的。

分區表在where條件中必須有一個partition選擇

hive> INSERT OVERWRITE LOCAL DIRECTORY '/tmp/local_out' SELECT a.* FROM pokes a;

 

從pokes表中選擇所有的行到本地目錄

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;

 

你必須使用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;

 

你必須使用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;

 

 

 

https://cwiki.apache.org/confluence/display/Hive/GettingStarted

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM