1 Hive基本概念 Hive是一個構建在Hadoop上的數據倉庫框架。最初,Hive是由Facebook開發,後來移交由Apache軟體基金會開發,並作為一個Apache開源項目。 Hive是基於Hadoop的一個數據倉庫工具,可以將結構化的數據文件映射為一張資料庫表,並提供類SQL查詢功能。 其 ...
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只適合用來做批量數據統計分析
3 Hive的安裝方式
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資料庫。可參照我其他兩篇文章。
② 在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;
5 Hive的交互方式
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:10000\r"
expect "Enter username for jdbc:hive2://node3:10000:"
send "root\r"
expect "Enter password for jdbc:hive2://node3:10000:"
send "123456\r"
interact
#:wq保存腳本後,需要修改腳本許可權
chmod 777 beenline.exp
#最後可以實現一鍵腳本登錄Hive
expect beenline.exp
6 使用IDEA連接hive
使用IntelliJ IDEA 連接
打開node1:9870 看到hadoop中生成了hive的數據表所在位置
具體的hive語法操作自行百度,最後。引用網友的hive架構圖