如果需要直接安裝Hive,可以跳過編譯步驟,從Hive的官網下載下傳編譯好的安裝包,下載下傳位址為http://hive.apache.org/downloads.html 。
在Hive的官網下載下傳頁面上下載下傳,為加快下載下傳速度選擇中國境内的鏡像,并下載下傳apache-hive-1.2.1-src.tar.gz源代碼包。下載下傳後把安裝包方放在目錄/home/spark/work目錄下,用如下指令解壓縮hive安裝檔案:
$cd /home/spark/work/
$tar -zxf apache-hive-1.2.1-src.tar.gz
改名并移動到/app/compile目錄下:
$mv apache-hive-1.2.1-src /app/compile/hive-1.2.1-src
$ll /app/compile/
編譯Hive源代碼的時候,需要從網上下載下傳依賴包,是以整個編譯過程機器必須保證在聯網狀态。編譯執行如下腳本:
$cd /app/compile/hive-1.2.1-src
$export MAVEN_OPTS="-Xmx2g -XX:MaxPermSize=512M -XX:ReservedCodeCacheSize=512m"
$mvn -Phadoop-2 -Pdist -DskipTests -Dmaven.javadoc.skip=true clean package
在編譯過程中可能出現速度慢或者中斷,可以再次啟動編譯,編譯程式會在上次的編譯中斷處繼續進行編譯,整個編譯過程耗時與網速緊密相關,網速較快的情況需要1個小時左右(下圖的時間是重複多次下載下傳依賴包,然後編譯成功的界面),最終編譯打包的檔案為$HIVE_HOME/packaging /target/apache-hive-1.2.1-bin.tar.gz。

圖 附錄C‑1 編譯Hive成功界面
通過如下指令檢視最終編譯完成整個目錄大小,可以看到大小為350M左右:
$du -s /app/compile/hive-1.2.1-src
使用上一步驟編譯好的Hive編譯包移動到安裝目錄上,用如下指令解壓縮hive安裝檔案:
$cd /app/compile/hive-1.2.1-src/packaging/target/
$mv apache-hive-1.2.1-bin.tar.gz /home/spark/work/
$tar -zxf hive-1.2.1-bin.tar.gz
改名并遷移到/app/soft目錄下:
$cd /app/spark
$mv apache-hive-1.2.1-bin /app/spark/hive-1.2.1
$ll /app/soft
圖 附錄C‑2 Hive移動到/app/soft目錄下
到mysql官網進入下載下傳頁面http://dev.mysql.com/downloads/connector/j/,預設情況下是Windows安裝包,這裡需要選擇Platform Independent版本下載下傳zip格式的檔案
圖 附錄C‑3 MySql驅動下載下傳界面
把下載下傳的hive安裝包和mysql驅動包,使用如下指令放到Hive的lib目錄下:
$cd /home/spark/work
$mv mysql-connector-java-5.1.34-bin.jar /app/soft/hive-1.2.1/lib
使用如下指令打開/etc/profile檔案,設定如下參數:
export HIVE_HOME=/app/soft/hive-1.2.1
export PATH=$PATH:$HIVE_HOME/bin
export CLASSPATH=$CLASSPATH:$HIVE_HOME/bin
配置完畢後,需要編譯該配置檔案或重新登入以生效該配置:
$source /etc/profile
進入hive-1.2.1/conf目錄,複制hive-env.sh.templaete為hive-env.sh并進行配置:
$cd /app/soft/hive-1.2.1/conf
$cp hive-env.sh.template hive-env.sh
$sudo vi hive-env.sh
分别設定HADOOP_HOME和HIVE_CONF_DIR兩個值:
# Set HADOOP_HOME to point to a specific hadoop install directory
export HADOOP_HOME=/app/spark/hadoop-2.7.2
# Hive Configuration Directory can be controlled by:
export HIVE_CONF_DIR=/app/soft/hive-1.2.1/conf
建立hive-site.xml配置檔案,在該配置檔案中加入配置内容
$touch hive-site.xml
$sudo vi hive-site.xml
hive預設為derby資料庫,derby資料隻運作單個使用者進行連接配接,這裡需要調整為mysql資料庫,以下為修改配置内容:
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
<property>
<name>javax.jdo.option.ConnectionURL</name>
<value>jdbc:mysql://master:3306/hive?createDatabaseIfNotExsit=true; characterEncoding=UTF-8</value>
</property>
<name>javax.jdo.option.ConnectionDriverName</name>
<value>com.mysql.jdbc.Driver</value>
<name>javax.jdo.option.ConnectionUserName</name>
<value>hive</value>
<name>javax.jdo.option.ConnectionPassword</name>
<name>datanucleus.readOnlyDatastore</name>
<value>false</value>
<name>datanucleus.fixedDatastore</name>
<name>datanucleus.autoCreateSchema</name>
<value>true</value>
<name>datanucleus.autoCreateTables</name>
<name>datanucleus.autoCreateColumns</name>
</configuration>
實際使用時,一般通過背景啟動metastore和hiveserver實作服務,指令如下:
$hive --service metastore &
$hive --service hiveserver2 &
圖 附錄C‑4 Hive啟動背景服務
啟動用通過jps指令可以看到兩個進行運作在背景
登入hive,在hive建立表并檢視該表,指令如下:
$hive
hive> create table test(a string, b int);
hive> show tables;
hive> desc test;
圖 附錄C‑5 Hive中建立測試表
登入mysql,在TBLS表中檢視新增test表:
$mysql -uhive -phive
mysql> use hive;
mysql> select TBL_ID, CREATE_TIME, DB_ID, OWNER, TBL_NAME,TBL_TYPE from TBLS;
圖 附錄C‑6 在Hive中繼資料表查詢到建立表
交易資料存放在該系列配套資源的/saledata目錄下,把這些資料檔案上傳到master節點的/home/spark/word目錄下。
第二步 啟動Hive并胡藏劍資料庫
啟動HDFS、YARN和Hive,啟動完畢後建立Hive資料庫
hive> create database hive;
hive> show databases;
hive> use hive;
啟動Hadoop叢集,進入Hive指令行操作界面,使用如下指令建立三張資料表:
l tbDate定義了日期的分類,将每天分别賦予所屬的月份、星期、季度等屬性,字段分别為日期、年月、年、月、日、周幾、第幾周、季度、旬、半月;
l tbStock定義了訂單表頭,字段分别為訂單号、交易位置、交易日期;
l tbStockDetail檔案定義了訂單明細,該表和tbStock以交易号進行關聯,字段分别為訂單号、行号、貨品、數量、金額:
hive> CREATE TABLE tbDate(dateID string,theyearmonth string,theyear string,themonth string,thedate string,theweek string,theweeks string,thequot string,thetenday string,thehalfmonth string) ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' LINES TERMINATED BY '\n' ;
Time taken: 1.121 seconds
hive> CREATE TABLE tbStock(ordernumber STRING,locationid string,dateID string) ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' LINES TERMINATED BY '\n' ;
Time taken: 0.166 seconds
hive> CREATE TABLE tbStockDetail(ordernumber STRING,rownum int,itemid string,qty int,price int ,amount int) ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' LINES TERMINATED BY '\n' ;
Time taken: 0.267 seconds
OK
tbdate
tbstock
tbstockdetail
Time taken: 0.089 seconds, Fetched: 3 row(s)
從本地作業系統分别加載日期、交易資訊和交易詳細資訊表資料
hive> LOAD DATA LOCAL INPATH '/home/spark/work/saledata/tbDate.txt' INTO TABLE tbDate;
Loading data to table hive.tbdate
Time taken: 2.784 seconds
hive> LOAD DATA LOCAL INPATH '/home/spark/work/saledata/tbStock.txt' INTO TABLE tbStock;
Loading data to table hive.tbstock
Time taken: 0.648 seconds
hive> LOAD DATA LOCAL INPATH '/home/spark/work/saledata/tbStockDetail.txt' INTO TABLE tbStockDetail;
Loading data to table hive.tbstockdetail
Time taken: 1.44 seconds
檢視HDFS中相關SALEDATA資料庫中增加了三個檔案夾,分别對應三個表:
[spark@master ~]$ hadoop fs -ls /user/hive/warehouse/hive.db
Found 3 items
drwxr-xr-x - spark supergroup 0 2016-04-14 15:18 /user/hive/warehouse/hive.db/tbdate
drwxr-xr-x - spark supergroup 0 2016-04-14 15:18 /user/hive/warehouse/hive.db/tbstock
drwxr-xr-x - spark supergroup 0 2016-04-14 15:18 /user/hive/warehouse/hive.db/tbstockdetail
要計算所有訂單每年的總金額,首先需要擷取所有訂單的訂單号、訂單日期和訂單金資訊,然後把這些資訊和日期表進行關聯,擷取年份資訊,最後根據這四個列按年份歸組統計擷取所有訂單每年的總金額。
hive> select c.theyear, sum(b.amount) from tbStock a,tbStockDetail b,tbDate c where a.ordernumber=b.ordernumber and a.dateid=c.dateid group by c.theyear order by c.theyear;
運作過程中建立兩個Job,分别為application_1460617800545_0001和application_1460617800545_000,在YARN的資料總管界面中(預設http://master:8088/),可以看到如下界面:
圖 附錄C‑7 在YARN監控界面作業運作狀态
整個計算過程使用了175.25秒,結果如下:
圖 附錄C‑8 計算所有訂單每年的總金額結果
該算法分為兩步:
1. 按照日期和訂單号進行歸組計算,擷取所有訂單每天的銷售資料;
2. 把第一步擷取的資料和日期表進行關聯擷取的年份資訊,然後按照年份進行歸組,使用Max函數,擷取所有訂單每年最大金額訂單的銷售額。
//第一步:按照日期和訂單号進行歸組計算,擷取所有訂單每天的銷售資料
hive> select a.dateid,a.ordernumber,sum(b.amount) as sumofamount from tbStock a,tbStockDetail b where a.ordernumber=b.ordernumber group by a.dateid,a.ordernumber;
//第二步: 按照年份進行歸組,使用Max函數,擷取所有訂單每年最大金額訂單的銷售額
hive> select c.theyear,max(d.sumofamount) from tbDate c,(select a.dateid,a.ordernumber,sum(b.amount) as sumofamount from tbStock a,tbStockDetail b where a.ordernumber=b.ordernumber group by a.dateid,a.ordernumber) d where c.dateid=d.dateid group by c.theyear sort by c.theyear;
運作過程中建立兩個Job,分别為job_1437659442092_0004和job_1437659442092_0005,在YARN的監控界面中可以看到如下界面:
圖 附錄C‑9在YARN監控界面作業運作狀态
整個計算過程使用了171.41秒,結果如下:
圖 附錄C‑10 檢視所有訂單每年最大金額訂單的銷售額結果
//所有訂單中季度銷售額前10位
hive> select c.theyear,c.thequot,sum(b.amount) as sumofamount from tbStock a,tbStockDetail b,tbDate c where a.ordernumber=b.ordernumber and a.dateid=c.dateid group by c.theyear,c.thequot order by sumofamount desc limit 10;
2008 1 5252819
2007 4 4613093
2007 1 4446088
2006 1 3916638
2008 2 3886470
2007 3 3870558
2007 2 3782235
2006 4 3691314
2005 1 3592007
2005 3 3304243
圖 附錄C‑11所有訂單中季度銷售額前10位結果
//列出銷售金額在100000以上的單據
hive> select a.ordernumber,sum(b.amount) as sumofamount from tbStock a,tbStockDetail b where a.ordernumber=b.ordernumber group by a.ordernumber having sumofamount>100000;
HMJSL00009024 119058
HMJSL00009958 159126
圖 附錄C‑12 列出銷售金額在100000以上的單據
本文轉自shishanyuan部落格園部落格,原文連結: http://www.cnblogs.com/shishanyuan/p/6195863.html ,如需轉載請自行聯系原作者