Hadoop完全分散式安裝Hive
編譯安裝 Hive
如果需要直接安裝 Hive,可以跳過編譯步驟,從 Hive 的官網下載編譯好的安裝包,下載地址為http://hive.apache.org/downloads.html。
Hive的環境配置需要MySQL的支援,所以首先需要安裝MySQL,沒有安裝MySQL的先看上一篇:安裝MySQL
C.1 編譯Hive
C.1.1 下載 Hive 原始碼包
在 Hive 的官網下載頁面上下載,為加快下載速度選擇中國境內的映象 ,並下載apache-hive-1.2.1-
C.1.2 編譯 Hive
編譯 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=trueclean package
在編譯過程中可能出現速度慢或者中斷,可以再次啟動編譯,編譯程式會在上次的編譯中斷處繼續進行編譯,整個編譯過程耗時與網速緊密相關,網速較快的情況需要 1h 左右(圖附錄C-1 的時間是重複多次下載依賴包,然後編譯成功的介面),最終編打包的檔案為$HIVE_HOME/packaging/target/apache-hive-1.2.1-bin.tar.gz。
通過如下命令檢視最終編譯完成整個目錄大小,可以看到大小為 350MB 左右:
$du -s /app/compile/hive-1.2.1-src
C.2 安裝 Hive
C.2.1 解壓縮並遷移
使用上一步驟編譯好的 Hive 編譯包移動到安裝目錄上,用如下命令解壓縮 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
改名並遷移到/usr/local目錄下:
$cd /usr/local
$mv apache-hive-1.2.1-bin /usr/local/hive-1.2.1
$ll /usr/local
登入 Mysql 官網進入下載頁面 http://dev.mysql.com/downloads/connector/j/,預設情況下是Windows 安裝包,這裡需要選擇Platform Independent 版本下載 zip 格式的檔案, 如圖附錄 C-3所示。
把下載的 hive 安裝包和 mysql 驅動包,使用如下命令放到 Hive 的 lib 目錄下:
$cd /home/spark/work
$mv mysql-connector-java-5.1.34-bin.jar /usr/local/hive-1.2.1/lib
C.2.3 配置/etc/profile 環境變數
使用如下命令開啟/etc/profile 檔案,設定如下引數:
export HIVE_HOME=/usr/local/hive-1.2.1
export PATH=$PATH:$HIVE_HOME/bin
export CLASSPATH=$CLASSPATH:$HIVE_HOME/bin
配置完畢後,需要編譯該配置檔案或重新登入以生效該配置:
$source /etc/profile
C.2.4 設定 hive-env.sh 配置檔案
進入 hive-1.2.1/conf 目錄,複製 hive-env.sh.templaete 為 hive-env.sh 並進行配置:
$cd /usr/local/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
exportHADOOP_HOME=/usr/local/hadoop-2.7.2
# Hive Configuration Directory can be controlled by:
export HIVE_CONF_DIR=/usr/local/hive-1.2.1/conf
C.2.5 設定 hive-site.xml 配置檔案
建立 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;chara
cterEncoding=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>
C.3 啟動 Hive 並驗證
C.3.1 啟動 Hive
實際使用時,一般通過後臺啟動 metastore 和 hiveserver 實現服務,命令如下:
$hive --service metastore &
$hive --service hiveserver2&
啟動用通過 jps 命令可以看到兩個服務在後臺執行, 如圖附錄 C-4 所示。
C.3.2 驗證安裝
登入 hive,在 hive 建立表並檢視該表,如圖附錄 C-5 所示,命令如下:
$hive
hive> create table test(a string, b int);
hive> show tables;
hive> desc test;
登入 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.4 Hive 例項演示
C.4.1 準備資料
1. 上傳資料
交易資料存放在該系列配套資源的/saledata 目錄下,把這些資料檔案上傳到 master 節點的/home/spark/word 目錄下。
2. 啟動 Hive 並建立資料庫
啟動 HDFS、 YARN 和 Hive,啟動完畢後建立 Hive 資料庫:
$hive --service metastore &
$hive
hive> create database hive;
hive> show databases;
hive> use hive;
3. 在 Hive 建立表
啟動 Hadoop 叢集,進入 Hive 命令列操作介面,使用如下命令建立 3 張資料表。
- tbDate:定義了日期的分類,將每天分別賦予所屬的月份、星期、季度等屬性,欄位
- 分別為日期、年月、年、月、日、周幾、第幾周、季度、旬、半月。
- tbStock:定義了訂單表頭,欄位分別為訂單號、交易位置、交易日期。
- 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
hive> show tables;
OK
tbdate
tbstock
tbstockdetail
Time taken: 0.089 seconds, Fetched: 3 row(s)
4. 匯入資料
從本地作業系統分別載入日期、交易資訊和交易詳細資訊表資料:
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 中相關 SALEDATA 資料庫中增加了 3 個資料夾,分別對應 3 張表:
[[email protected] ~]$ hadoop fs -ls /user/hive/warehouse/hive.db
Found 3 items
drwxr-xr-x- spark 2016-04-1415:18 /user/hive/warehouse/hive.db/ tbdate
drwxr-xr-x- spark 2016-04-1415:18 /user/hive/warehouse/ hive.db/ tbstock
drwxr-xr-x- spark 2016-04-14 15:18 /user/hive/warehouse/hive.db/ tbstockdetail
C.4.2 計算所有訂單每年的總金額
1. 演算法分析
要計算所有訂單每年的總金額,首先需要獲取所有訂單的訂單號、訂單日期和訂單金資訊,
然後把這些資訊和日期表進行關聯,獲取年份資訊,最後根據這 4 個列按年份歸組統計獲取所
有訂單每年的總金額。
2. 執行 HSQL 語句
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;
運 行 過 程 中 創 建 兩 個 Job , 分 別 為 application_1460617800545_0001 和 application_1460617800545_000,在 YARN 的資源管理器介面中(預設 http://master:8088/),可以看到如圖附錄 C-7 所示的介面。
3. 檢視結果
整個計算過程使用了 175.25s,結果如圖附錄 C-8 所示。
C.4.3 計算所有訂單每年最大金額訂單的銷售額
1. 演算法分析
該演算法分為兩步:
(1)按照日期和訂單號進行歸組計算,獲取所有訂單每天的銷售資料。
(2)把第一步獲取的資料和日期表進行關聯獲取的年份資訊,然後按照年份進行歸組,使用 Max 函式,獲取所有訂單每年最大金額訂單的銷售額。
2. 執行 HSQL 語句
//第一步:按照日期和訂單號進行歸組計算,獲取所有訂單每天的銷售資料
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 所示的介面。
3. 檢視結果
整個計算過程使用了 171.41s,結果如圖附錄 C-10 所示。