Hive
第一章 Hive的基礎知識
第二章 Hive安裝
第三章 DDL(Data Definition Language)數據定義
第四章 DML(Data Manipulation Language)數據操作
第五章 Hive查詢
第六章 Hive的基礎知識
第七章 Hive函數
第八章 分區表和分桶表
第九章 文件格式和壓縮
第十章 企業級調優
附錄:常見錯誤及解決方案
Hive安裝
- Hive
- Hive安裝地址
- 1)Hive官網地址
- 2)文檔查看地址
- 3)下載地址
- 4)github地址
- Hive安裝部署
- 安裝Hive
- 啟動并使用Hive
- MySQL安裝
- 配置Hive元數據存儲到MySQL
- 配置元數據到MySQL
- 驗證元數據是否配置成功
- 查看MySQL中的元數據
- Hive服務部署
- hiveserver2服務
- 用戶說明
- hiveserver2部署
- Hadoop端配置
- Hive端配置
- 測試
- metastore服務
- metastore運行模式
- metastore部署
- 測試
- Hive使用技巧
- Hive參數配置方式
- Hive常見屬性配置
- Hive客戶端顯示當前庫和表頭
- Hive運行日志路徑配置
- 關閉Hadoop虛擬內存檢查
Hive安裝地址
1)Hive官網地址
Hive官網地址
2)文檔查看地址
文檔查看地址
3)下載地址
下載地址
4)github地址
github地址
Hive安裝部署
安裝Hive
1)把apache-hive-3.1.3-bin.tar.gz上傳到Linux的/opt/software目錄下
2)解壓apache-hive-3.1.3-bin.tar.gz到/opt/module/目錄下面
tar -zxvf /opt/software/apache-hive-3.1.3-bin.tar.gz -C /opt/module
3)修改apache-hive-3.1.3-bin.tar.gz的名稱為hive
mv /opt/module/apache-hive-3.1.3-bin/ /opt/module/hive
4)修改/etc/profile.d/my_env.sh,添加環境變量
sudo vim /etc/profile.d/my_env.sh
(1)添加內容
#HIVE_HOME
export HIVE_HOME=/opt/module/hive
export PATH=$PATH:$HIVE_HOME/bin
(2)source一下
source /etc/profile.d/my_env.sh
5)初始化元數據庫(默認是derby數據庫)
bin/schematool -dbType derby -initSchema
啟動并使用Hive
1)啟動Hive
在Hive目錄下
bin/hive
2)使用Hive
hive> show databases;
hive> show tables;
hive> create table stu(id int, name string);
hive> insert into stu values(1,"ss");
hive> select * from stu;
觀察HDFS的路徑/user/hive/warehouse/stu,體會Hive與Hadoop之間的關系
Hive中的表在Hadoop中是目錄;Hive中的數據在Hadoop中是文件。
3)在Xshell窗口中開啟另一個窗口開啟Hive,在/tmp/atguigu目錄下監控hive.log文件
tail -f hive.log
Caused by: ERROR XSDB6: Another instance of Derby may have already booted the database /opt/module/hive/metastore_db.at org.apache.derby.iapi.error.StandardException.newException(Unknown Source)at org.apache.derby.iapi.error.StandardException.newException(Unknown Source)at org.apache.derby.impl.store.raw.data.BaseDataFileFactory.privGetJBMSLockOnDB(Unknown Source)at org.apache.derby.impl.store.raw.data.BaseDataFileFactory.run(Unknown Source)
...
原因在于Hive默認使用的元數據庫為derby。derby數據庫的特點是同一時間只允許一個客戶端訪問。如果多個Hive客戶端同時訪問,就會報錯。由于在企業開發中,都是多人協作開發,需要多客戶端同時訪問Hive,怎么解決呢?我們可以將Hive的元數據改為用MySQL存儲,MySQL支持多客戶端同時訪問。
4)首先退出hive客戶端。然后在Hive的安裝目錄下將derby.log和metastore_db刪除,順便將HDFS上目錄刪除
--退出hive客戶端
hive> quit;
--將derby.log和metastore_db刪除rm -rf derby.log metastore_dbhadoop fs -rm -r /user
5)刪除HDFS中/user/hive/warehouse/stu中數據
MySQL安裝
基于docker安裝MySQL8.x
Linux安裝MySQL5.x
配置Hive元數據存儲到MySQL
配置元數據到MySQL
1)新建Hive元數據庫
create database metastore;
2)將MySQL的JDBC驅動拷貝到Hive的lib目錄下。
cp mysql-connector-java-5.1.37.jar $HIVE_HOME/lib
3)在$HIVE_HOME/conf目錄下新建hive-site.xml文件
vim $HIVE_HOME/conf/hive-site.xml
添加如下內容:
<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?><configuration><!-- jdbc連接的URL --><property><name>javax.jdo.option.ConnectionURL</name><value>jdbc:mysql://MySQL地址:3306/metastore?useSSL=false</value></property><!-- jdbc連接的Driver--><property><name>javax.jdo.option.ConnectionDriverName</name><value>com.mysql.jdbc.Driver</value></property><!-- jdbc連接的username--><property><name>javax.jdo.option.ConnectionUserName</name><value>MySQL賬號</value></property><!-- jdbc連接的password --><property><name>javax.jdo.option.ConnectionPassword</name><value>MySQL密碼</value></property><!-- Hive默認在HDFS的工作目錄 --><property><name>hive.metastore.warehouse.dir</name><value>/user/hive/warehouse</value></property>
</configuration>
5)初始化Hive元數據庫(修改為采用MySQL存儲元數據)
bin/schematool -dbType mysql -initSchema -verbose
驗證元數據是否配置成功
1)再次啟動Hive
bin/hive
2)使用Hive
hive> show databases;
hive> show tables;
hive> create table stu(id int, name string);
hive> insert into stu values(1,"ss");
hive> select * from stu;
3)在Xshell窗口中開啟另一個窗口開啟Hive(兩個窗口都可以操作Hive,沒有出現異常)
hive> show databases;
hive> show tables;
hive> select * from stu;
查看MySQL中的元數據
查看元數據庫metastore
mysql> show databases;
mysql> use metastore;
mysql> show tables;
(1)查看元數據庫中存儲的庫信息
mysql> select * from DBS;
+-------+-----------------------+-------------------------------------------+---------+------------+------------+-----------+
| DB_ID | DESC | DB_LOCATION_URI | NAME | OWNER_NAME | OWNER_TYPE | CTLG_NAME |
+-------+-----------------------+-------------------------------------------+---------+------------+------------+-----------+
| 1 | Default Hive database | hdfs://hadoop102:8020/user/hive/warehouse | default | public | ROLE | hive |
+-------+-----------------------+-------------------------------------------+---------+------------+------------+-----------+
(2)查看元數據庫中存儲的表信息
mysql> select * from TBLS;
+--------+-------------+-------+------------------+---------+------------+-----------+-------+----------+---------------+
| TBL_ID | CREATE_TIME | DB_ID | LAST_ACCESS_TIME | OWNER | OWNER_TYPE | RETENTION | SD_ID | TBL_NAME | TBL_TYPE |
+--------+-------------+-------+------------------+---------+------------+-----------+-------+----------+---------------+
| 1 | 1656318303 | 1 | 0 | atguigu | USER | 0 | 1 | stu | MANAGED_TABLE |
+--------+-------------+-------+------------------+---------+------------+-----------+-------+----------+---------------+
(3)查看元數據庫中存儲的表中列相關信息
mysql> select * from COLUMNS_V2;
+-------+----------+---------+------------+-------------+-------------+--------+
| CS_ID | CAT_NAME | DB_NAME | TABLE_NAME | COLUMN_NAME | COLUMN_TYPE | TBL_ID |
+-------+----------+---------+------------+-------------+-------------+--------+
| 1 | hive | default | stu | id | int | 1 |
| 2 | hive | default | stu | name | string | 1 |
+-------+----------+---------+------------+-------------+-------------+--------+
Hive服務部署
hiveserver2服務
Hive的hiveserver2服務的作用是提供jdbc/odbc接口,為用戶提供遠程訪問Hive數據的功能,例如用戶期望在個人電腦中訪問遠程服務中的Hive數據,就需要用到Hiveserver2。
用戶說明
在遠程訪問Hive數據時,客戶端并未直接訪問Hadoop集群,而是由Hivesever2代理訪問。由于Hadoop集群中的數據具備訪問權限控制,所以此時需考慮一個問題:那就是訪問Hadoop集群的用戶身份是誰?是Hiveserver2的啟動用戶?還是客戶端的登錄用戶?
答案是都有可能,具體是誰,由Hiveserver2的hive.server2.enable.doAs參數決定,該參數的含義是是否啟用Hiveserver2用戶模擬的功能。若啟用,則Hiveserver2會模擬成客戶端的登錄用戶去訪問Hadoop集群的數據,不啟用,則Hivesever2會直接使用啟動用戶訪問Hadoop集群數據。模擬用戶的功能,默認是開啟的。
具體邏輯如下:
未開啟用戶模擬功能:
開啟用戶模擬功能:
生產環境,推薦開啟用戶模擬功能,因為開啟后才能保證各用戶之間的權限隔離。
hiveserver2部署
Hadoop端配置
hivesever2的模擬用戶功能,依賴于Hadoop提供的proxy user(代理用戶功能),只有Hadoop中的代理用戶才能模擬其他用戶的身份訪問Hadoop集群。因此,需要將hiveserver2的啟動用戶設置為Hadoop的代理用戶,配置方式如下:
修改配置文件core-site.xml,然后記得分發三臺機器
cd $HADOOP_HOME/etc/hadoop
vim core-site.xml
增加如下配置:
<!--配置所有節點的Hadoop的代理用戶都可作為代理用戶-->
<property><name>hadoop.proxyuser.Hadoop的代理用戶.hosts</name><value>*</value>
</property><!--配置Hadoop的代理用戶能夠代理的用戶組為任意組-->
<property><name>hadoop.proxyuser.Hadoop的代理用戶.groups</name><value>*</value>
</property><!--配置atguigu用戶能夠代理的用戶為任意用戶-->
<property><name>hadoop.proxyuser.Hadoop的代理用戶.users</name><value>*</value>
</property>
Hive端配置
在hive-site.xml文件中添加如下配置信息
<!-- 指定hiveserver2連接的host -->
<property><name>hive.server2.thrift.bind.host</name><value>hiveserver2連接的hos</value>
</property><!-- 指定hiveserver2連接的端口號 -->
<property><name>hive.server2.thrift.port</name><value>10000</value>
</property>
測試
(1)啟動hiveserver2
bin/hive --service hiveserver2
(2)使用命令行客戶端beeline進行遠程訪問
啟動beeline客戶端
bin/beeline -u jdbc:hive2://hadoop102:10000 -n atguigu
看到如下界面
Connecting to jdbc:hive2://hadoop102:10000
Connected to: Apache Hive (version 3.1.3)
Driver: Hive JDBC (version 3.1.3)
Transaction isolation: TRANSACTION_REPEATABLE_READ
Beeline version 3.1.3 by Apache Hive
0: jdbc:hive2://hadoop102:10000>
(3)使用圖形化客戶端進行遠程訪問
4)配置DataGrip連接
(1)創建連接
(2)配置連接屬性
所有屬性配置,和Hive的beeline客戶端配置一致即可。初次使用,配置過程會提示缺少JDBC驅動,按照提示下載即可。
(3)界面介紹
(4)測試sql執行
(5)修改數據庫
metastore服務
Hive的metastore服務的作用是為Hive CLI或者Hiveserver2提供元數據訪問接口。
metastore運行模式
metastore有兩種運行模式,分別為嵌入式模式和獨立服務模式。下面分別對兩種模式進行說明:
(1)嵌入式模式
(2)獨立服務模式
生產環境中,不推薦使用嵌入式模式。因為其存在以下兩個問題:
(1)嵌入式模式下,每個Hive CLI都需要直接連接元數據庫,當Hive CLI較多時,數據庫壓力會比較大。
(2)每個客戶端都需要用戶元數據庫的讀寫權限,元數據庫的安全得不到很好的保證。
metastore部署
(1)嵌入式模式
嵌入式模式下,只需保證Hiveserver2和每個Hive CLI的配置文件hive-site.xml中包含連接元數據庫所需要的以下參數即可:
<!-- jdbc連接的URL --><property><name>javax.jdo.option.ConnectionURL</name><value>jdbc:mysql://URL:3306/metastore?useSSL=false</value></property><!-- jdbc連接的Driver--><property><name>javax.jdo.option.ConnectionDriverName</name><value>com.mysql.jdbc.Driver</value></property><!-- jdbc連接的username--><property><name>javax.jdo.option.ConnectionUserName</name><value>jdbc連接的username</value></property><!-- jdbc連接的password --><property><name>javax.jdo.option.ConnectionPassword</name><value>jdbc連接的password</value></property>
(2)獨立服務模式
獨立服務模式需做以下配置:
首先,保證metastore服務的配置文件hive-site.xml中包含連接元數據庫所需的以下參數:
<!-- jdbc連接的URL --><property><name>javax.jdo.option.ConnectionURL</name><value>jdbc:mysql://jdbc連接的URL:3306/metastore?useSSL=false</value></property><!-- jdbc連接的Driver--><property><name>javax.jdo.option.ConnectionDriverName</name><value>com.mysql.jdbc.Driver</value></property><!-- jdbc連接的username--><property><name>javax.jdo.option.ConnectionUserName</name><value>jdbc連接的username</value></property><!-- jdbc連接的password --><property><name>javax.jdo.option.ConnectionPassword</name><value>jdbc連接的password</value></property>
其次,保證Hiveserver2和每個Hive CLI的配置文件hive-site.xml中包含訪問metastore服務所需的以下參數:
<!-- 指定metastore服務的地址 -->
<property><name>hive.metastore.uris</name><value>thrift://metastore服務的地址:9083</value>
</property>
注意:主機名需要改為metastore服務所在節點,端口號無需修改,metastore服務的默認端口就是9083。
測試
此時啟動Hive CLI,執行shou databases語句,會出現一下錯誤提示信息:
hive (default)> show databases;
FAILED: HiveException java.lang.RuntimeException: Unable to instantiate org.apache.hadoop.hive.ql.metadata.SessionHiveMetaStoreClient
這是因為我們在Hive CLI的配置文件中配置了hive.metastore.uris參數,此時Hive CLI會去請求我們執行的metastore服務地址,所以必須啟動metastore服務才能正常使用。
metastore服務的啟動命令如下:
--前端啟動
hive --service metastore
注意:啟動后該窗口不能再操作,需打開一個新的Xshell窗口來對Hive操作。
重新啟動 Hive CLI,并執行shou databases語句,就能正常訪問了
bin/hive
Hive使用技巧
Hive參數配置方式
1)查看當前所有的配置信息
hive>set;
2)參數的配置三種方式
(1)配置文件方式
默認配置文件:hive-default.xml
?用戶自定義配置文件:hive-site.xml
注意:用戶自定義配置會覆蓋默認配置。另外,Hive也會讀入Hadoop的配置,因為Hive是作為Hadoop的客戶端啟動的,Hive的配置會覆蓋Hadoop的配置。配置文件的設定對本機啟動的所有Hive進程都有效。
(2)命令行參數方式
①啟動Hive時,可以在命令行添加-hiveconf param=value來設定參數。例如:
bin/hive -hiveconf mapreduce.job.reduces=10;
注意:僅對本次Hive啟動有效。
②查看參數設置
set mapreduce.job.reduces;set mapreduce.job.reduces;
(3)參數聲明方式
可以在HQL中使用SET關鍵字設定參數,例如:
hive(default)> set mapreduce.job.reduces=10;
注意:僅對本次Hive啟動有效。
查看參數設置:
set mapreduce.job.reduces;
上述三種設定方式的優先級依次遞增。即配置文件 < 命令行參數 < 參數聲明。注意某些系統級的參數,例如log4j相關的設定,必須用前兩種方式設定,因為那些參數的讀取在會話建立以前已經完成了。
Hive常見屬性配置
Hive客戶端顯示當前庫和表頭
(1)在hive-site.xml中加入如下兩個配置:
<property><name>hive.cli.print.header</name><value>true</value><description>Whether to print the names of the columns in query output.</description>
</property>
<property><name>hive.cli.print.current.db</name><value>true</value><description>Whether to include the current database in the Hive prompt.</description>
</property>
(2)hive客戶端在運行時可以顯示當前使用的庫和表頭信息
[yj@hadoop102 conf]$ hivehive (default)> select * from stu;
OK
stu.id stu.name
1 ss
Time taken: 1.874 seconds, Fetched: 1 row(s)
hive (default)>
Hive運行日志路徑配置
修改Hive的log存放日志到/opt/module/hive/logs
(1)修改$HIVE_HOME/conf/hive-log4j2.properties.template文件名稱為
hive-log4j2.properties
mv hive-log4j2.properties.template hive-log4j2.properties
(2)在hive-log4j2.properties文件中修改log存放位置
修改配置如下
property.hive.log.dir=/opt/module/hive/logs
關閉Hadoop虛擬內存檢查
在yarn-site.xml中關閉虛擬內存檢查(虛擬內存校驗,如果已經關閉了,就不需要配了)。
(1)修改前記得先停Hadoop
(2)在yarn-site.xml添加如下配置
<property><name>yarn.nodemanager.vmem-check-enabled</name><value>false</value>
</property>
(3)修改完后記得分發yarn-site.xml,并重啟yarn。