一、初識Hive
1、Hive簡介
??? (1) 什么是Hive?
Hive是基于Hadoop的一個數據倉庫
可以將結構化的數據文件映射為一張數據表,并提供類SQL查詢功能,Hive底層是將SQL語句轉換為MapReduce任務運行
??? (2)為什么使用Hive?
- 直接使用Hadoop的問題
(1)人員學習成本高,寫MapReduce程序時,就得要求學習人員對java有一定的了解,這就多增加了一門課程的學習難度。
(2)項目周期要求太短,一般來說,項目不是有太多的時間讓你去現學然后再來做,所以這就增加了初學者的難度。
(3)MapReduce 實現復雜查詢邏輯開發難度太大
- Hive的優勢
(1)操作接口采用類 SQL 的語法,提供快速開發的能力
(2)避免寫 MapReduce,減少開發人員的學習成本
(3)功能擴展很方便
2、Hive架構
對架構的解釋
1、用戶接口
CLI:Shell 終端命令行,最常用(學習、調試、生產)
JDBC/ODBC:是 Hive 的 Java 實現,與傳統數據庫 JDBC 類似, 用戶(開發員、運維人員) 通過這連接至 Hive Server
Web UI:通過瀏覽器訪問 Hive,方式是ip:9999/hwi?
2、Thrift Server(跨語言服務)
3、Metastore(元數據存儲)
1、什么是元數據?
通俗的講,就是存儲在 Hive 中的數據的描述信息。
2、Hive 的元數據包括什么?
表的名字、表的列和分區及其屬性,表的屬性(是否為外部表等),表的數據所在目錄等。
3、默認存在哪里?
MetaStore 默認存在自帶的 Derby 數據庫中
缺點:不適合多用戶操作,數據存儲目錄不固定。數據庫跟著 Hive 走(也就是說在哪啟動hive,derby數據庫就在哪),極度不方便管理。
解決方案:通常將其存在我們自己創建的 MySQL 庫中(本地 或 遠程)
4、解析器(驅動Driver)Hive的核心
組成結構:
??? 編譯器(Compiler)
??? 優化器(Optimizer)
??? 執行器(Executor)
Driver 組件完成 HQL 查詢語句從詞法分析、語法分析、編譯、優化以及邏輯執行計劃的生成。生成的邏輯執行計劃存儲在 HDFS 中,并隨后由 MapReduce 調用執行 。
執行流程:
???輸入一條 HQL 查詢語句(select * from table)
???解析器對這條 HQL 語句進行語法分析
???編譯器對這條 HQL 語句生成 HQL 的執行計劃
???優化器生成最佳的 HQL 的執行計劃
???執行器執行這條最佳 HQL 語句
HiveQL 通過命令行或者客戶端提交,經過 Compiler 編譯器,運用 MetaStore 中的元數據進行類型檢測和語法分析,生成一個邏輯方案(logical plan),然后通過優化處理,產生一個 MapReduce 任務。
3、Hive 與 Hadoop 的關系
Hive的運行流程
Hive 依賴 HDFS 存儲數據
利用 MapReduce 查詢數據
所以說 Hive 是基于 Hadoop 的一個數據倉庫工具,實質就是一款基于 HDFS 的 MapReduce 計算框架。
4、Hive 和 RDBMS 的對比
總結:Hive 具有 SQL 數據庫的外表,但應用場景完全不同, Hive 適合用來做批量海量數據統計分析,也就是數據倉庫。
5、Hive 的數據存儲
數據存儲位置:HDFS
數據格式:沒有定義專門的數據存儲格式,數據格式可由用戶指定,只需要在創建表的時候指定三個屬性:
?列分隔符
:空格、"\t"等
?行分隔符
:"\n"
?讀取文件數據的方法(默認為 TextFile)
??TextFile
為默認格式,存儲方式為行存儲。
??SequenceFile
二進制文件,以<key,value>的形式序列化到文件中,存儲方式為行存儲。
??RCFile
存儲方式為按行分塊,每塊按照列存儲。
數據模型
?db
:數據庫
???在 HDFS 中表現為 ${hive.metastore.warehouse.dir} 目錄下一個文件夾(默認值為/user/hive/warehouse)
?table
:普通表(內部表)
???在 HDFS 中表現所屬 db 目錄下一個文件夾
?external table
:外部表
???與 table 類似,不過其數據存放位置可以在任意指定路徑
?partition
:分區
???在 HDFS 中表現為 table 目錄下的子目錄
?bucket
:分桶
???在 HDFS 中表現為同一個表目錄下根據 hash 散列之后的多個文件,會根據不同的文件把數據放到不同的文件中
二、Hive 環境搭建
1、Hive 三種運行模式
1、內嵌模式
??元數據保存在本地內嵌的 Derby 數據庫,這是使用 Hive 最簡單的方式。
這種方式缺點也比較明顯,因為一個內嵌的 Derby 數據庫每次只能訪問一個數據文件,這也就意味著它不支持多會話連接。并且數據存儲目錄不固定,數據庫跟著 Hive 走,極度不方便管理。
2、本地模式這種方式一般作為公司內部同時使用 Hive
??元數據保存在本地獨立的數據庫中(一般是 MySQL)
??多用戶的模式,允許多個用戶連接到一個數據庫
前提:每個用戶必須要有對 MySQL 的訪問權利,即用戶需要知道 MySQL 的用戶名和密碼。
3、遠程模式
??此模式應用于 Hive 客戶端較多的情況
??把 MySQL 數據庫獨立出來,將元數據保存在遠程獨立的數據庫中(一般是 MySQL)避免了在每個客戶端都安裝 MySQL 服務從而造成冗余浪費的情況
??多用戶的模式
好處:無需知道 MySQL 的用戶名和密碼
2、Hive的安裝
?? (1)前期準備
1)保證 Hadoop 集群搭建成功并啟動
Hadoop集群的搭建參考:http://www.lxweimin.com/p/f9aaeabc4ad4
2)下載 Hive 安裝包并上傳至 Linux 服務器
下載地址:https://mirrors.tuna.tsinghua.edu.cn/apache/hive/
官網:https://hive.apache.org/
或者在網盤下載:https://pan.baidu.com/s/1oJGOVtpKx1MaUFIe2w8SyA
使用命令上傳下載的文件apache-hive-1.2.1-bin.tar
到Linux
我在桌面上建立了一個software目錄,hadoop安裝的時候也放在這里了。這里也將hive上傳并安裝到此目錄。
[cj@hadoop-01 software]$ rz
3)解壓 Hive 安裝包
[cj@hadoop-01 software]$ tar -zxvf apache-hive-1.2.1-bin.tar.gz
解壓后hive包的名字很長,為了方便使用,我先改個名字,改成
hive-1.2.1
[cj@hadoop-01 software]$ mv apache-hive-1.2.1-bin hive-1.2.1
4)配置環境變量
要配置環境變量,需要知道hive的家目錄(即解壓在哪里了),可以通過以下方式獲得,進入解壓hive的目錄,再進入hive,然后使用pwd得到的值就是我們配置環境變量時需要的結果
注意:每個人的路徑不一樣,需要根據自己的Hive的實際解壓路徑來確定,我的是/home/cj/Desktop/software/hive-1.2.1
[cj@hadoop-01 software]$ cd hive-1.2.1/
[cj@hadoop-01 hive-1.2.1]$ pwd
/home/cj/Desktop/software/hive-1.2.1
把自己pwd得到的這個路徑/home/cj/Desktop/software/hive-1.2.1
復制下來,以便配置環境變量對的時候使用
編輯配置文件,使用命令:
vim ~/.bash_profile
將將以下內容添加到配置文件的底部
export HIVE_HOME=/home/cj/Desktop/software/hive-1.2.1
export PATH=$PATH:$HIVE_HOME/bin
讓配置文件立即生效:
source ~/.bash_profile
驗證 Hive,Hive 沒有提供 hive –version 這種方式查看版本,所以使用如下命令:
hive --help
到此hive的基礎配置完成,接下來是三種模式的搭建
??(2)三種運行模式
??1、內嵌模式安裝
(1)切換到 HIVE_HOME/conf 目錄下,修改 hive-env.sh 配置文件:
[cj@hadoop-01 ~]$ cd Desktop/software/hive-1.2.1/conf/
會發現里邊是沒有hive-env.sh
,只有一個hive-env.sh.template
,使用cp命令復制一份并命名成hive-env.sh
[cj@hadoop-01 conf]$ cp hive-env.sh.template hive-env.sh
(2)在 hive-env.sh 中添加 Hadoop 安裝目錄:
這個是根據自己的hadoop的安裝目錄來確定的,我的是/home/cj/Desktop/software/hadoop-2.6.5
如果不記得hadoop的安裝路徑,可以通過下邊的命令來查
[cj@hadoop-01 conf]$ echo $HADOOP_HOME
/home/cj/Desktop/software/hadoop-2.6.5
或者直接查看~/.bash_profile
文件,里邊的HADOOP_HOME=
后邊的值就是hadoop的安裝路徑,把這個路徑復制下來。方便配置hive-env.sh
的時候使用
把hadoop的安裝目錄添加到hive-env.sh
中
[cj@hadoop-01 conf]$ vim hive-env.sh
替換 Hadoop 安裝包中的 jline
?? Hadoop(%HADOOP_HOME%/share/hadoop/yarn/lib)集群的 jline-0.9.94.jar 包版本過低,替換成 %HIVE_HOME%/lib 中的 jline-2.12.jar 包即可。
注意:所有的節點都得替換,不是只有安裝 Hive 的節點
使用如下命令來復制hive中jline到hadoop中
[cj@hadoop-01 lib]$ cd ~/Desktop/software/hive-1.2.1/lib/
[cj@hadoop-01 lib]$ cp jline-2.12.jar ~/Desktop/software/hadoop-2.6.5/share/hadoop/yarn/lib/
然后刪除hadoop中的jline-0.9.94.jar
,hadoop集群中的所有機器上都需要刪除jline-0.9.94.jar
,并替換成jline-2.12.jar
[cj@hadoop-01 lib]$ cd ~/Desktop/software/hadoop-2.6.5/share/hadoop/yarn/lib/
[cj@hadoop-01 lib]$ rm -rf jline-0.9.94.jar
刪除另外兩個節點上的jline-0.9.94.jar
[cj@hadoop-02 ~]$ cd ~/Desktop/software/hadoop-2.6.5/share/hadoop/yarn/lib/
[cj@hadoop-02 lib]$ rm -rf jline-0.9.94.jar
[cj@hadoop-03 ~]$ cd ~/Desktop/software/hadoop-2.6.5/share/hadoop/yarn/lib/
[cj@hadoop-03 lib]$ rm -rf jline-0.9.94.jar
然后再把hive中的jline拷貝到另外兩個節點的~/Desktop/software/hadoop-2.6.5/share/hadoop/yarn/lib/
目錄下
[cj@hadoop-01 lib]$ scp -r jline-2.12.jar cj@hadoop-02:$PWD
[cj@hadoop-01 lib]$ scp -r jline-2.12.jar cj@hadoop-03:$PWD
這里直接使用主機名的前提是配置了hosts文件,如果沒有,就直接用主機的ip。
使用 Hive 的三種連接方式之一:CLI 啟動 Hive
[cj@hadoop-01 ~]$ hive
看到 如圖情況,說明啟動成功使用quit退出hive
hive> quit;
在當前目錄生成一個 derby 文件和一個 metastore_db 目錄,這種存儲方式的弊端是在同一個目錄下同時只能有一個 Hive 客戶端能使用數據庫,否則會提示如下錯誤(這是一個很常見的錯誤):這樣,內嵌模式就算是搭建完成了。
??2、本地模式安裝
??(1)安裝 MySQL
檢查以前是否安裝過 MySQL,若有則卸載:
查找:rpm -qa | grep -i mysql
[cj@hadoop-01 ~]$ rpm -qa | grep -i mysql
mysql-libs-5.1.73-7.el6.x86_64
卸載:rpm -e --nodeps mysql-libs-5.1.73-7.el6.x86_64
如果直接用普通用戶權限卸載是會出如下錯誤的。
[cj@hadoop-01 ~]$ rpm -e --nodeps mysql-libs-5.1.73-7.el6.x86_64
error: can't create transaction lock on /var/lib/rpm/.rpm.lock (Permission denied)
用su命令提升為root權限,然后再卸載
[root@hadoop-01 cj]# rpm -e --nodeps mysql-libs-5.1.73-7.el6.x86_64
刪除老版本 MySQL 的開發頭文件和庫:
??注意:卸載后 /var/lib/mysql(數據庫文件的存放目錄) 中的數據及 /etc/my.cnf(配置文件) 不會刪除, 確定沒用后就手工刪除。
[cj@hadoop-01 ~]$ rm -rf /usr/lib/mysql
[cj@hadoop-01 ~]$ rm -rf /usr/include/mysql
[cj@hadoop-01 ~]$ rm -f /etc/my.cnf
[cj@hadoop-01 ~]$ rm -rf /var/lib/mysql
準備安裝包,上傳至Linux服務器并解壓:
安裝包的下載地址:https://pan.baidu.com/s/1g6cW73kWlfMZBilPTL8tNg
下載好之后就上傳到Linnux,這里還是傳到我的~/Desktop/software里邊的
解壓文件
[cj@hadoop-01 software]$ tar -xvf MySQL-5.6.26-1.linux_glibc2.5.x86_64.rpm-bundle.tar
安裝服務端Server:
安裝的時候得切到root用戶
[root@hadoop-01 software]# rpm -ivh MySQL-server-5.6.26-1.linux_glibc2.5.x86_64.rpm
完成之后會在打印的信息中有這么一段,里邊指明了初始密碼的所在路徑,記住這個路徑,后邊用密碼的時候去里邊找
安裝客戶端client:
[root@hadoop-01 software]# rpm -ivh MySQL-client-5.6.26-1.linux_glibc2.5.x86_64.rpm
開啟MySQL服務:
root
權限
[root@hadoop-01 software]# service mysql start
Starting MySQL.. SUCCESS!
登錄MySQL,初始密碼在
/root/.mysql_secret
這個文件里:
查看密碼,結合密碼登錄數據庫,使用命令:mysql -u<用戶名> -p<密碼>
[root@hadoop-01 mysql]# cat /root/.mysql_secret
# The random password set for the root user at Thu Nov 15 19:25:39 2018 (local time): I6ZR7ypIGxvmHmhr
[root@hadoop-01 mysql]# mysql -uroot -pI6ZR7ypIGxvmHmhr
修改登錄密碼,使用命令:
set PASSWORD=PASSWORD('密碼');
,命令不區分大小寫。
修改完成,退出MySQL,重新登錄驗證密碼是否修改成功
mysql> set password=password('123456');
增加遠程登錄權限(主要是允許xx用戶在Hive安裝主機上進行遠程登陸),執行以下三個命令:
mysql> grant all privileges on *.* to 'root'@'%' identified by '123456' with grant option;
mysql> grant all privileges on *.* to 'root'@'hadoop-01' identified by '123456' with grant option;
mysql> flush privileges;
命令釋義:
grant 權限1,權限2,…權限n on 數據庫名稱 . 表名稱 to 用戶名@用戶地址 identified by '密碼';
當權限1,權限2,…權限n 被 all privileges 或者 all 代替,表示賦予用戶全部權限。select, insert, update, delete, create, drop, index, alter, grant,references, reload, shutdown, process, file 等 14 個權限。
數據庫名稱 . 表名稱
:被*.*
代替時,表示賦予用戶操作服務器上所有數據庫所有表的權限。
用戶名@用戶地址 :用戶地址可以是 localhost,也可以是 ip 地址、主機名、域名。也可以用%
(任何主機)地址連接。'root'@'hadoop01'含義就是允許 root 用戶在 hadoop-01(Hive 安裝主機) 進行遠程登陸,并設置 root 用戶的密碼為 123456。
with grant option:用于對象授權。使用 with grant option,被授權用戶可將所獲得的權限再次授予其它用戶或角色。
flush privileges:告訴服務器重新加載授權表。
(2)修改 Hive 配置(切回普通用戶)
1)修改 Hive 配置文件(路徑
/home/cj/Desktop/software/hive-1.2.1/conf
),每個人的路徑不一樣,根據實際路徑來,使用命令:
[cj@hadoop-01 conf]$ vim hive-site.xml
在里邊加入如下的內容
<configuration>
<property>
<name>javax.jdo.option.ConnectionURL</name>
<value>jdbc:mysql://hadoop-01:3306/hivedb?createDatabaseIfNotExist=true</value>
<description>JDBC connect string for a JDBC metastore</description>
</property>
<property>
<name>javax.jdo.option.ConnectionDriverName</name>
<value>com.mysql.jdbc.Driver</value>
<description>Driver class name for a JDBC metastore</description>
</property>
<property>
<name>javax.jdo.option.ConnectionUserName</name>
<value>root</value>
<description>username to use against metastore database</description>
</property>
<property>
<name>javax.jdo.option.ConnectionPassword</name>
<value>123456</value>
<description>password to use against metastore database</description>
</property>
</configuration>
對各字段的解釋:
javax.jdo.option.ConnectionURL:JDBC連接字符串
javax.jdo.option.ConnectionDriverName:JDBC的driver
javax.jdo.option.ConnectionUserName:登錄數據庫的用戶名
javax.jdo.option.ConnectionPassword:登錄數據庫的密碼
修改hive-env.sh文件,在里邊把48行的注釋取消,然后把值改成hadoop的安裝目錄,如圖:
- 將 MySQL 的驅動包(mysql-connector-java-5.1.40-bin.jar)放到 %HIVE_HOME%/lib 目錄下,我的是
/home/cj/Desktop/software/hive-1.2.1/lib
,作用是方便遠程連接mysql。
下載地址:https://pan.baidu.com/s/1hGGhb6ehf27TflcE5vsg9Q
準備好jar包后,直接進入這個目錄,用rz命令上傳即可。
[cj@hadoop-01 lib]$ rz
啟動mysql服務
[cj@hadoop-01 ~]$ service mysql start
啟動hive
[cj@hadoop-01 ~]$ hive
看到這樣說明啟動成功3、遠程模式安裝
(1)簡介
這種模式需要使用 HIVE_HOME/bin 目錄下提供的 beeline+hiveserver2 配合使用才可以。
其原理就是將 metadata 作為一個單獨的服務進行啟動。各種客戶端通過 beeline 來連接,連接之前無需知道數據庫的用戶名和密碼。
(2)安裝步驟:
首先把hadoop-01上的hive的安裝包拷貝到hadoop-03的相同目錄上,我的所有服務器上都在桌面上建了相同的目錄
~/Desktop/software
,所以就拷貝到這個目錄下,使用如下命令:
[cj@hadoop-01 software]$ scp -r hive-1.2.1/ cj@hadoop-03:$PWD
等待復制完成,然后可以在hadoop-03上看到hive的目錄
hive-1.2.1
(1) 因其連接之前無需知道數據庫的用戶名和密碼,所以在
/home/cj/Desktop/software/hive-1.2.1/conf
下的配置文件 hive-site.xml 中只需要配置以下兩項即可,其他步驟和本地模式一樣:
這里需要注意的是因為我們把hive和mysql都裝在了同一臺服務器上,所謂遠程連接,我們需要把mysql拷貝一份到其他的服務器,這里是以hadoop-03作為遠程連接的機器。
<configuration>
<property>
<name>javax.jdo.option.ConnectionURL</name>
<value>jdbc:mysql://hadoop-01:3306/hivedb?createDatabaseIfNotExist=true</value>
<description>JDBC connect string for a JDBC metastore</description>
</property>
<property>
<name>javax.jdo.option.ConnectionDriverName</name>
<value>com.mysql.jdbc.Driver</value>
<description>Driver class name for a JDBC metastore</description>
</property>
</configuration>
(2)配置環境變量
~/.bash_profile
,把hive的安裝目錄添加進去,使用pwd獲得全路徑。
[cj@hadoop-03 conf]$ pwd
/home/cj/Desktop/software/hive-1.2.1/conf
[cj@hadoop-03 conf]$ vim ~/.bash_profile
把以下兩個添加到.bash_profile的后邊
export HIVE_HOME=/home/cj/Desktop/software/hive-1.2.1
export PATH=$PATH:$HIVE_HOME/bin
如圖:讓配置文件立即生效
[cj@hadoop-03 conf]$ source ~/.bash_profile
Hive 啟動 hive thrift 服務端,使用命令:
[cj@hadoop-01 hive-1.2.1]$ hiveserver2
如圖:這里標明了操作狀態
啟動后命令行會一直監聽不退出,然后我們再創建一個hadoop-01的連接,使用進程查看命令
netstat -natp
查看,我們可以看到它監聽了10000端口:
然后在hadoop-03中執行 beeline 命令(在哪個路徑下執行都可以):
[cj@hadoop-03 conf]$ beeline
執行beeline后的結果如圖:默認端口為 10000,可通過 hive.server2.thrift.port 參數調整,
beeline> !connect jdbc:hive2://hadoop-01:10000
,這條命令之中,hadoop-01:mysql所在的節點,我的是把mysql裝在了hadoop-01上,還有,在這里使用hadoop-01的前提是配置了/etc/hosts里邊配置了地址映射(每臺機器都需要)
看到這樣的結果就說明遠程模式搭建可以了。
3、 Hive 的三種連接方式
1、CLI
2、HiveServer2/beeline
3、Web UI這種方式相對前兩種來說,用得比較少,所以這里不做詳細介紹。這個還需要額外的配置。