1 Hive基本概念
Hive是一個構建在Hadoop上的數據倉庫框架。最初,Hive是由Facebook開發,后來移交由Apache軟件基金會開發,并作為一個Apache開源項目。
Hive是基于Hadoop的一個數據倉庫工具,可以將結構化的數據文件映射為一張數據庫表,并提供類SQL查詢功能。
其本質是將SQL轉換為MapReduce的任務進行運算,底層由HDFS來提供數據的存儲,說白了hive可以理解為一個將SQL轉換為MapReduce的任務的工具,甚至更進一步可以說hive就是一個MapReduce的客戶端。
2 Hive的特點與架構圖
- Hive最大的特點是通過類SQL來分析大數據,而避免了寫MapReduce程序來分析數據,這樣使得分析數據更容易。
- 數據是存儲在HDFS上的,Hive本身并不提供數據的存儲功能,它可以使已經存儲的數據結構化。
- Hive是將數據映射成數據庫和一張張的表,庫和表的元數據信息一般存在關系型數據庫上(比如MySQL)。
- 數據存儲方面:它能夠存儲很大的數據集,可以直接訪問存儲在Apache HDFS或其他數據存儲系統(如Apache HBase)中的文件。
- 數據處理方面:因為Hive語句最終會生成MapReduce任務去計算,所以不適用于實時計算的場景,它適用于離線分析。
- Hive除了支持MapReduce計算引擎,還支持Spark和Tez這兩種分布式計算引擎;
- 數據的存儲格式有多種,比如數據源是二進制格式,普通文本格式等等;
- hive具有sql數據庫的外表,但應用場景完全不同,hive只適合用來做批量數據統計分析
3Hive的安裝方式
hive的安裝一共有三種方式:內嵌模式、本地模式、遠程模式
元數據服務(metastore)作用是:客戶端連接metastore服務,metastore再去連接MySQL數據庫來存取元數據。有了metastore服務,就可以有多個客戶端同時連接,而且這些客戶端不需要知道MySQL數據庫的用戶名和密碼,只需要連接metastore 服務即可。
(1) 內嵌模式
內嵌模式使用的是內嵌的Derby數據庫來存儲元數據,也不需要額外起Metastore服務。數據庫和Metastore服務都嵌入在主Hive Server進程中。這個是默認的,配置簡單,但是一次只能一個客戶端連接,適用于用來實驗,不適用于生產環境。解壓hive安裝包 bin/hive 啟動即可使用
缺點:不同路徑啟動hive,每一個hive擁有一套自己的元數據,無法共享。
(2)本地模式
本地模式采用外部數據庫來存儲元數據,目前支持的數據庫有:MySQL、Postgres、Oracle、MS SQL Server.在這里我們使用MySQL。本地模式不需要單獨起metastore服務,用的是跟hive在同一個進程里的metastore服務。也就是說當你啟動一個hive 服務,里面默認會幫我們啟動一個metastore服務。hive根據hive.metastore.uris 參數值來判斷,如果為空,則為本地模式。
缺點:每啟動一次hive服務,都內置啟動了一個metastore。
(3)遠程模式
遠程模式下,需要單獨起metastore服務,然后每個客戶端都在配置文件里配置連接到該metastore服務。遠程模式的metastore服務和hive運行在不同的進程里。在生產環境中,建議用遠程模式來配置Hive Metastore。在這種情況下,其他依賴hive的軟件都可以通過Metastore訪問hive。
遠程模式下需要配置hive.metastore.uris 參數來指定metastore服務運行的機器ip和端口,并且需要單獨手動啟動metastore服務。hiveserver2是Hive啟動了一個server,客戶端可以使用JDBC協議,通過IP+ Port的方式對其進行訪問,達到并發訪問的目的。
4 Hive的安裝
之前文章介紹過按照Hadoop,繼Hadoop后按照Hive。在此處選擇第三臺機器node3作為我們hive的安裝機器,安裝方式使用遠程方式。
準備工作:① 必須按照有Hadoop(可以是單節點也可以是高可用)和MySQL數據庫??蓞⒄瘴移渌麅善恼隆?/p>
② 在Node3主機上創建目錄(已創建有可以忽略):
mkdir -p /export/server/
mkdir -p /export/data/
mkdir -p /export/software/
準備一個Hive的包,可以去官網下載
http://archive.apache.org/dist/hive/hive-3.1.2/apache-hive-3.1.2-bin.tar.gz
(1)上傳壓縮包到/export/software目錄里,并解壓安裝包
# 上傳壓縮包到/export/software目錄里,并解壓安裝包
cd /export/software/
tar -zxvf apache-hive-3.1.2-bin.tar.gz -C /export/server
cd /export/server
mv apache-hive-3.1.2-bin hive-3.1.2
(2)解決hadoop、hive之間guava版本差異
#解決hadoop、hive之間guava版本差異
cd /export/server/hive-3.1.2
rm -rf lib/guava-19.0.jar
cp /export/server/hadoop-3.1.4/share/hadoop/common/lib/guava-27.0-jre.jar ./lib/
(3) 配置一個MySQL的連接包。這步必須配置,Mysql5.X和Mysql8.X的連接包可能不同,具體可以去官網下載,附上腳本之家的下載教程(
https://www.jb51.NET/article/190860.htm)
#上傳這個包到此目錄下/export/server/hive-3.1.2/lib
mysql-connector-JAVA-5.1.41-bin.jar
(5)修改hive環境變量文件 添加Hadoop_HOME
#修改hive環境變量文件 添加Hadoop_HOME
cd /export/server/hive-3.1.2/conf/
mv hive-env.sh.template hive-env.sh
vim hive-env.sh
#---將以下的配置放到配置文件中,以hadoop-3.1.4和hive-3.1.2為例
HADOOP_HOME=/export/server/hadoop-3.1.4
export HIVE_CONF_DIR=/export/server/hive-3.1.2/conf
export HIVE_AUX_JARS_PATH=/export/server/hive-3.1.2/lib
(6)配置mysql等相關信息,新增hive-site.xml
#--打開配置文件
vim hive-site.xml
#--將以下配置內容寫入配置文件中,具體的連接端口以自己本機為準,附上備注
<configuration>
<!-- 存儲元數據mysql相關配置 -->
<property>
<name>javax.jdo.option.ConnectionURL</name>
<value> jdbc:mysql://node3:3306/hive?createDatabaseIfNotExist=true&useSSL=false&useUnicode=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>root</value>
</property>
<property>
<name>javax.jdo.option.ConnectionPassword</name>
<value>123456</value>
</property>
<!-- H2S運行綁定host -->
<property>
<name>hive.server2.thrift.bind.host</name>
<value>node3</value>
</property>
<!-- 遠程模式部署metastore 服務地址 -->
<property>
<name>hive.metastore.uris</name>
<value>thrift://node3:9083</value>
</property>
<!-- 關閉元數據存儲授權 -->
<property>
<name>hive.metastore.event.db.notification.api.auth</name>
<value>false</value>
</property>
<!-- 關閉元數據存儲版本的驗證 -->
<property>
<name>hive.metastore.schema.verification</name>
<value>false</value>
</property>
</configuration>折疊
(7)初始化metadata(只需要在配置完Hive之后進行一次操作)
cd /export/server/hive-3.1.2
#初始化成功會在mysql中創建74張表
bin/schematool -initSchema -dbType mysql -verbos
(8)系統環境變量配置
#添加環境變量
vim /etc/profile
#將以下環境變量新增到/etc/profile文件中
export HIVE_HOME=/export/server/hive-3.1.2
export PATH=:$HIVE_HOME/bin:$PATH
#刷新,讓環境變量生效
source /etc/profile
(9)通過后臺運行啟動metastore和hiveserver2 啟動前需要查看下Hadoop是否啟動,Hadoop未啟動會報錯:連接失敗
#查看Hadoop是否啟動
jps
#Hadoop未啟動:沒有DataNode和NodeManage節點代表Hadoop未啟動
#一鍵啟動Hadoop(已啟動則忽略)
start-add.sh
#-----------------Metastore 和 Hiveserver2啟動----
nohup /export/server/hive-3.1.2/bin/hive --service metastore 2>&1 &
nohup /export/server/hive-3.1.2/bin/hive --service hiveserver2 2>&1 &
#啟動成功會生成日志,進入可以查看是否有問題
vim nohup.out
(10)驗證是否安裝成功
#在linux中輸入,hive直接回車,
hive
#出現一個終端,在該終端中可以輸入sql命令:
show databases;
5Hive的交互方式
Hive交互方式有多種,這里以遠程模式的hiveserver2交互為例。需要對Hadoop配置文件進行更新。
#第一步:在NameNode節點上的主機上關閉Hadoop(我的是Node1主機)
stop-all.sh
#第二步:Node1主機上進入到Hadoop配置文件的路徑,然后編輯 core-site.xml文件
cd /export/server/hadoop-3.1.4/etc/hadoop/
vim core-site.xml
#第三步:在文件末尾<configuration>內追加配置
<property>
<name>hadoop.proxyuser.root.hosts</name>
<value>*</value>
</property>
<property>
<name>hadoop.proxyuser.root.groups</name>
<value>*</value>
</property>
#第四步:將修改好的core-site.xml文件分發到node2和node3
scp core-site.xml node2:$PWD
scp core-site.xml node3:$PWD
#第五步:然后重啟Hadoop(stop-all.sh start-all.sh)
start-all.sh折疊
在hive運行的服務器上,確保已經啟動metastore服務和hiveserver2服務,如果沒有啟動,則執行以下語句
nohup /export/server/hive-3.1.2/bin/hive --service metastore 2>&1 &
nohup /export/server/hive-3.1.2/bin/hive --service hiveserver2 2>&1 &
為了方便快捷,直接通過制作腳本進行登錄Hive
#Hive一鍵登錄腳本,安裝expect
yum -y install expect
#新建一個腳本文件夾,并寫一個腳本
mkdir -p /export/server/script
cd /export/server/script
vim beenline.exp
#腳本的內容如下:
#!/bin/expect
spawn beeline
set timeout 5
expect "beeline>"
send "!connect jdbc:hive2://node3:10000r"
expect "Enter username for jdbc:hive2://node3:10000:"
send "rootr"
expect "Enter password for jdbc:hive2://node3:10000:"
send "123456r"
interact
#:wq保存腳本后,需要修改腳本權限
chmod 777 beenline.exp
#最后可以實現一鍵腳本登錄Hive
expect beenline.exp折疊
6 使用IDEA連接hive
使用IntelliJ IDEA 連接
打開node1:9870 看到hadoop中生成了hive的數據表所在位置
具體的hive語法操作自行百度,最后。引用網友的hive架構圖