附錄C 編譯安裝Hive
如果需要直接安裝Hive,可以跳過編譯步驟,從Hive的官網(wǎng)下載編譯好的安裝包,下載地址為http://hive.apache.org/downloads.html 。
在Hive的官網(wǎng)下載頁面上下載,為加快下載速度選擇中國境內(nèi)的鏡像,并下載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
改名并移動(dòng)到/app/compile目錄下:
$mv apache-hive-1.2.1-src /app/compile/hive-1.2.1-src
$ll /app/compile/
編譯Hive源代碼的時(shí)候,需要從網(wǎng)上下載依賴包,所以整個(gè)編譯過程機(jī)器必須保證在聯(lián)網(wǎng)狀態(tài)。編譯執(zhí)行如下腳本:
$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
在編譯過程中可能出現(xiàn)速度慢或者中斷,可以再次啟動(dòng)編譯,編譯程序會(huì)在上次的編譯中斷處繼續(xù)進(jìn)行編譯,整個(gè)編譯過程耗時(shí)與網(wǎng)速緊密相關(guān),網(wǎng)速較快的情況需要1個(gè)小時(shí)左右(下圖的時(shí)間是重復(fù)多次下載依賴包,然后編譯成功的界面),最終編譯打包的文件為$HIVE_HOME/packaging /target/apache-hive-1.2.1-bin.tar.gz。
圖 附錄C?1 編譯Hive成功界面
通過如下命令查看最終編譯完成整個(gè)目錄大小,可以看到大小為350M左右:
$du -s /app/compile/hive-1.2.1-src
使用上一步驟編譯好的Hive編譯包移動(dòng)到安裝目錄上,用如下命令解壓縮hive安裝文件:
$cd /app/compile/hive-1.2.1-src/packaging/target/
$mv apache-hive-1.2.1-bin.tar.gz /home/spark/work/
$cd /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移動(dòng)到/app/soft目錄下
C.2.2 下載MySql驅(qū)動(dòng)并放到Hive的lib目錄下
到mysql官網(wǎng)進(jìn)入下載頁面http://dev.mysql.com/downloads/connector/j/,默認(rèn)情況下是Windows安裝包,這里需要選擇Platform Independent版本下載zip格式的文件
圖 附錄C?3 MySql驅(qū)動(dòng)下載界面
把下載的hive安裝包和mysql驅(qū)動(dòng)包,使用如下命令放到Hive的lib目錄下:
$cd /home/spark/work
$mv mysql-connector-java-5.1.34-bin.jar /app/soft/hive-1.2.1/lib
C.2.3 配置/etc/profile環(huán)境變量
使用如下命令打開/etc/profile文件,設(shè)置如下參數(shù):
export HIVE_HOME=/app/soft/hive-1.2.1
export PATH=$PATH:$HIVE_HOME/bin
export CLASSPATH=$CLASSPATH:$HIVE_HOME/bin
配置完畢后,需要編譯該配置文件或重新登錄以生效該配置:
$source /etc/profile
進(jìn)入hive-1.2.1/conf目錄,復(fù)制hive-env.sh.templaete為hive-env.sh并進(jìn)行配置:
$cd /app/soft/hive-1.2.1/conf
$cp hive-env.sh.template hive-env.sh
$sudo vi hive-env.sh
分別設(shè)置HADOOP_HOME和HIVE_CONF_DIR兩個(gè)值:
# 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
C.2.5 設(shè)置hive-site.xml配置文件
創(chuàng)建hive-site.xml配置文件,在該配置文件中加入配置內(nèi)容
$touch hive-site.xml
$sudo vi hive-site.xml
hive默認(rèn)為derby數(shù)據(jù)庫,derby數(shù)據(jù)只運(yùn)行單個(gè)用戶進(jìn)行連接,這里需要調(diào)整為mysql數(shù)據(jù)庫,以下為修改配置內(nèi)容:
<?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>
<property>
<name>javax.jdo.option.ConnectionDriverName</name>
<value>com.mysql.jdbc.Driver</value>
</property>
<property>
<name>javax.jdo.option.ConnectionUserName</name>
<value>hive</value>
</property>
<property>
<name>javax.jdo.option.ConnectionPassword</name>
<value>hive</value>
</property>
<property>
<name>datanucleus.readOnlyDatastore</name>
<value>false</value>
</property>
<property>
<name>datanucleus.fixedDatastore</name>
<value>false</value>
</property>
<property>
<name>datanucleus.autoCreateSchema</name>
<value>true</value>
</property>
<property>
<name>datanucleus.autoCreateTables</name>
<value>true</value>
</property>
<property>
<name>datanucleus.autoCreateColumns</name>
<value>true</value>
</property>
</configuration>
實(shí)際使用時(shí),一般通過后臺(tái)啟動(dòng)metastore和hiveserver實(shí)現(xiàn)服務(wù),命令如下:
$hive --service metastore &
$hive --service hiveserver2 &
圖 附錄C?4 Hive啟動(dòng)后臺(tái)服務(wù)
啟動(dòng)用通過jps命令可以看到兩個(gè)進(jìn)行運(yùn)行在后臺(tái)
登錄hive,在hive創(chuàng)建表并查看該表,命令如下:
$hive
hive> create table test(a string, b int);
hive> show tables;
hive> desc test;
圖 附錄C?5 Hive中創(chuàng)建測(cè)試表
登錄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元數(shù)據(jù)表查詢到創(chuàng)建表
交易數(shù)據(jù)存放在該系列配套資源的/saledata目錄下,把這些數(shù)據(jù)文件上傳到master節(jié)點(diǎn)的/home/spark/word目錄下。
第二步 啟動(dòng)Hive并胡藏劍數(shù)據(jù)庫
啟動(dòng)HDFS、YARN和Hive,啟動(dòng)完畢后創(chuàng)建Hive數(shù)據(jù)庫
$hive --service metastore &
$hive
hive> create database hive;
hive> show databases;
hive> use hive;
啟動(dòng)Hadoop集群,進(jìn)入Hive命令行操作界面,使用如下命令創(chuàng)建三張數(shù)據(jù)表:
l tbDate定義了日期的分類,將每天分別賦予所屬的月份、星期、季度等屬性,字段分別為日期、年月、年、月、日、周幾、第幾周、季度、旬、半月;
l tbStock定義了訂單表頭,字段分別為訂單號(hào)、交易位置、交易日期;
l tbStockDetail文件定義了訂單明細(xì),該表和tbStock以交易號(hào)進(jìn)行關(guān)聯(lián),字段分別為訂單號(hào)、行號(hào)、貨品、數(shù)量、金額:
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
hive> show tables;
OK
tbdate
tbstock
tbstockdetail
Time taken: 0.089 seconds, Fetched: 3 row(s)
從本地操作系統(tǒng)分別加載日期、交易信息和交易詳細(xì)信息表數(shù)據(jù)
hive> LOAD DATA LOCAL INPATH '/home/spark/work/saledata/tbDate.txt' INTO TABLE tbDate;
Loading data to table hive.tbdate
OK
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
OK
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
OK
Time taken: 1.44 seconds
查看HDFS中相關(guān)SALEDATA數(shù)據(jù)庫中增加了三個(gè)文件夾,分別對(duì)應(yīng)三個(gè)表:
[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
要計(jì)算所有訂單每年的總金額,首先需要獲取所有訂單的訂單號(hào)、訂單日期和訂單金信息,然后把這些信息和日期表進(jìn)行關(guān)聯(lián),獲取年份信息,最后根據(jù)這四個(gè)列按年份歸組統(tǒng)計(jì)獲取所有訂單每年的總金額。
hive> use hive;
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;
運(yùn)行過程中創(chuàng)建兩個(gè)Job,分別為application_1460617800545_0001和application_1460617800545_000,在YARN的資源管理器界面中(默認(rèn)http://master:8088/),可以看到如下界面:
圖 附錄C?7 在YARN監(jiān)控界面作業(yè)運(yùn)行狀態(tài)
整個(gè)計(jì)算過程使用了175.25秒,結(jié)果如下:
圖 附錄C?8 計(jì)算所有訂單每年的總金額結(jié)果
該算法分為兩步:
1. 按照日期和訂單號(hào)進(jìn)行歸組計(jì)算,獲取所有訂單每天的銷售數(shù)據(jù);
2. 把第一步獲取的數(shù)據(jù)和日期表進(jìn)行關(guān)聯(lián)獲取的年份信息,然后按照年份進(jìn)行歸組,使用Max函數(shù),獲取所有訂單每年最大金額訂單的銷售額。
//第一步:按照日期和訂單號(hào)進(jìn)行歸組計(jì)算,獲取所有訂單每天的銷售數(shù)據(jù)
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;
//第二步: 按照年份進(jìn)行歸組,使用Max函數(shù),獲取所有訂單每年最大金額訂單的銷售額
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;
運(yùn)行過程中創(chuàng)建兩個(gè)Job,分別為job_1437659442092_0004和job_1437659442092_0005,在YARN的監(jiān)控界面中可以看到如下界面:
圖 附錄C?9在YARN監(jiān)控界面作業(yè)運(yùn)行狀態(tài)
整個(gè)計(jì)算過程使用了171.41秒,結(jié)果如下:
圖 附錄C?10 查看所有訂單每年最大金額訂單的銷售額結(jié)果
//所有訂單中季度銷售額前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位結(jié)果
//列出銷售金額在100000以上的單據(jù)
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以上的單據(jù)













浙公網(wǎng)安備 33010602011771號(hào)