一、hive概述

Hive是基於 Hadoop 的一個【數據倉庫工具】,可以將結構化的數據文件映射為一張數據庫表,並提供簡單的 sql 查詢功能,可以將 sql 語句轉換為 MapReduce 任務進行運行。使用SQL來快速實現簡單的MapReduce 統計,不必開發專門的MapReduce 應用,學習成本低,十分適合數據倉庫的統計分析。
【數據倉庫】英文名稱為 Data Warehouse,可簡寫為 DW 或 DWH。數據倉庫,是為企業所有級別的決策制定過程,提供所有類型數據支持的戰略集合。它是單個數據存儲,出於分析性報告和決策支持目的而創建。為需要業務智能的企業,提供指導業務流程改進、監視時間、成本、質量以及控制。一句話概括: 數據倉庫是用來做 查詢分析的數據庫, 基本不用來做插入,修改,刪除操作。
1、數據處理分類
(1)聯機事務處理 OLTP(on-linetransaction processing)
OLTP是傳統的關系型數據庫的主要應用,主要是基本的、日常的事務處理,例如銀行交易。OLTP系統強調數據庫內存效率,強調內存各種指標的命令率,強調綁定變量,強調並發操作;
(2)聯機分析處理P OLAP(On-Line AnalyticalProcessing)
OLAP是數據倉庫系統的主要應用,支持復雜的分析操作,側重決策支持,並且提供直觀易懂的查詢結果。OLAP系統則強調數據分析,強調SQL執行市場,強調磁盤I/O,強調分區等。
---類比表

2.hive架構原理
用戶接口主要有三個:CLI命令行,Client 和 WUI。

(1)最常用的是 CLI 命令行,Cli啟動的時候,會同時啟動一個Hive副本; Client是Hive的客戶端,用戶連接至Hive Server。
在啟動Client模式的時候,需要指出Hive Server所在節點,並且在該節點啟動Hive Server。 WUI是通過瀏覽器訪問Hive。
(2)Hive將 元數據存儲在數據庫中,如mysql、 derby 。 Hive中的元數據包括表的名字,表的列和分區及其屬性,表的屬性(是否為外
部表等),表的數據所在目錄等。
(3)解釋器、編譯器、優化器完成HQL查詢語句從詞法分析、語法分析、編譯、優化以及查詢計划的生成。生成的查詢計划存儲在HDFS中,
並在隨后有MapReduce調用執行。
(4)Hive的數據存儲在HDFS中,大部分的查詢、計算由MapReduce完成(包含*的查詢,比如select * from tbl不會生成MapRedcue任務)
二、hive搭建及三種模式
1.hive的搭建
1.1、安裝 Hive安裝環境以及前提說明:首先,Hive 是依賴於 hadoop 系統的,因此在運行 Hive 之前需要保證已經搭建好 hadoop 集群環境。
---安裝一個關系型數據 mysql

1.2、配置環境變量:(類似於下面這樣,跟之前hadoop1 /2.x 配置一樣)
– HADOOP_HOME=/**/*
– HIVE_HOME=$*/**/*
1.3、替換和添加相關 jar 包--修改 HADOOP_HOME\share/hadoop/yarn/lib 目錄下的 jline-*.jar將其替換成 HIVE_HOME\lib 下的 jline-2.12.jar。
--將 hive 連接 mysql 的 jar 包:mysql-connector-java-5.1.32-bin.jar拷貝到 hive 解壓目錄的 lib 目錄下
1.4、修改配置文件(選擇 3 種模式里哪一種)見三種安裝模式
1.5、啟動 hive:bin/hive
2.三種模式: (內嵌模式/本地模式/遠程模式)
2.1 內嵌模式
這種安裝模式的元數據是內嵌在Derby數據庫中的,只能允許一個會話連接,數據會存放到HDFS上。
這種方式是最簡單的存儲方式,只需要hive-site.xml做如下配置便可(注:使用 derby 存儲方式時,運行 hive 會在當
前目錄生成一個 derby 文件和一個 metastore_db)
<?xml version="1.0"?> <?xml-stylesheet type="text/xsl" href="configuration.xsl"?> <configuration> <property> <name>javax.jdo.option.ConnectionURL</name> <value>jdbc:derby:;databaseName=metastore_db;creat e=true</value> </property> <property> <name>javax.jdo.option.ConnectionDriverName</name> <value>org.apache.derby.jdbc.EmbeddedDriver</value> </property> <property> <name>hive.metastore.local</name> <value>true</value> </property> <property> <name>hive.metastore.warehouse.dir</name> <value>/user/hive/warehouse</value> </property> </configuration>
2.2 本地模式
這種安裝方式和嵌入式的區別在於,不再使用內嵌的 Derby 作為元數據的存儲介質,而是使用其他數據庫比如 MySQL 來存儲元數據且是一個多用戶的模式,
運行多個用戶 client 連接到一個數據庫中。這種方式一般作為公司內部同時使用 Hive。這里有一個前提,每一個用戶必須要有對 MySQL 的訪問權利,即每
一個客戶端使用者需要知道 MySQL 的用戶名和密碼才行。這種存儲方式需要在本地運行一個 mysql 服務器,並作如下配置(下面兩種使用 mysql 的方式,
需要將 mysql 的 jar 包拷貝到$HIVE_HOME/lib 目錄下)。
注: mysql-connector-java-5.1.32-bin.jar拷貝到 hive 解壓目錄的 lib 目錄下
(jar包 鏈接:https://pan.baidu.com/s/17LzbGrLpLAcs-guXz2ttLg 密碼:4k6w)
vim hive-site-xml 配置如下:
<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
<property>
<!--數據倉庫的位置,默認是/user/hive/warehouse-->
<name>hive.metastore.warehouse.dir</name>
<value>/user/hive_rlocal/warehouse</value>
</property>
<property>
<!--控制hive是否連接一個遠程metastore服務器還是開啟一個本地客戶端jvm-->
<name>hive.metastore.local</name>
<value>true</value>
</property>
<property>
<!--JDBC連接字符串,默認jdbc:derby:;databaseName=metastore_db;create=true-->
<name>javax.jdo.option.ConnectionURL</name>
<value>jdbc:mysql://node03/hive_remote?createDatabaseIfNotExist=t
rue</value>
</property>
<property>
<!--JDBC的driver,默認org.apache.derby.jdbc.EmbeddedDriver-->
<name>javax.jdo.option.ConnectionDriverName</name>
<value>com.mysql.jdbc.Driver</value>
</property>
<property>
<!--username,默認APP-->
<name>javax.jdo.option.ConnectionUserName</name>
<value>root</value>
</property>
<property>
<name>javax.jdo.option.ConnectionPassword</name>
<value>123456</value>
</property>
啟動:
①開啟集群(hive需要依賴集群); service iptables stop zkServer.sh start start-all.sh
②開啟mysql服務器:先在mysql中鏈接到客戶端,本機創建的數據庫名為hive

再到客戶端:service mysqld start -----> mysql -u root -p (用戶名/密碼)

③啟動hive: 執行hive

小試牛刀:
創建一個數據庫:zhangsan hive> show databases; OK default wuxiong Time taken: 0.051 seconds, Fetched: 2 row(s) hive> create database zhangsan; OK Time taken: 0.113 seconds hive> show databases; OK default wuxiong zhangsan Time taken: 0.046 seconds, Fetched: 3 row(s) hive>
是否生效:①查看集群對應的目錄 : hive-site-xml配置文件中已定義了目錄的存放位置:/user/hive/warehouse ------>打開node02節點(active)

②本地mysql數據庫hive中查看:hive_remote ----->dbs----->會發現:

ok,數據庫創建完畢!存放位置也能找到!
接上述'zhangsan'數據庫繼續創建一張表:
use zhangsan;

查找:①mysql--->hive----->hive_remote------>TBLS

②集群中:

2.3 遠程模式
remote:這種存儲方式需要在遠端服務器運行一個 mysql 服務器,並且需要在 Hive 服務器啟動 meta服務。本機配置了
三個節點:node01、node02、node03,node01上已配置了mysql,現在以node02為服務端,node03為客戶端依次配置系統文件
hive-site.xml
node02配置如下:
<?xml version="1.0"?> <?xml-stylesheet type="text/xsl" href="configuration.xsl"?> <configuration> <property> <name>hive.metastore.warehouse.dir</name> <value>/user/hive/warehouse</value> </property> <property> <name>javax.jdo.option.ConnectionURL</name> <value>jdbc:mysql://node01:3306/hive2?createDatabaseIfNotExist=true</value> </property> <property> <name>javax.jdo.option.ConnectionDriverName</name> <value>com.mysql.jdbc.Driver</value> </property> <property> <name>javax.jdo.option.ConnectionUserName</name> <value>root</value> </property> <property> <name>javax.jdo.option.ConnectionPassword</name> <value>123456</value> </property> </configuration>
node03配置如下:
<?xml version="1.0"?> <?xml-stylesheet type="text/xsl" href="configuration.xsl"?> <configuration> <property> <name>hive.metastore.warehouse.dir</name> <value>/user/hive/warehouse</value> </property> <property> <name>hive.metastore.local</name> <value>false</value> </property> <property> <name>hive.metastore.uris</name> <value>thrift://node01:9083</value> </property> </configuration>
啟動:
node02 (服務端): hive --server metastore
node03(客戶端):啟動 hive
