docker安裝Hive


首先,Hive是基於Hadoop中HDFS和MapReduce的,所以需要先安裝Hadoop,按照Hadoop的教程見:Mac基於Docker搭建Hadoop集群

一、下載Hive

  1. 訪問Apache官網:https://dlcdn.apache.org/hive/hive-3.1.2/,選擇對應的版本,注意,Hive版本要和Hadoop版本相對應,參考:https://hive.apache.org/downloads.html

            

  如上圖,可以看到,Hive 3.1.2版本支持 Hadoop 3.x.y版本,而我的Hadoop版本是 3.2.2的,所以選擇Hive版本為 3.1.2 。

  

二、安裝Hive

  1. 拷貝剛剛下載的Hive到docker容器中:
# 拷貝Hive安裝包進 h01容器
docker cp /Users/luochao7/Downloads/apache-hive-3.1.2-bin.tar.gz 5fa8d538d8ae:/usr/local
# 進入容器 docker exec
-it 5fa8d538d8ae bash cd /usr/local/
# 解壓安裝包 tar xvf apache-hive-3.1.2-bin.tar.gz
#文件夾更名 root@h01:
/usr/local# mv apache-hive-3.1.2-bin hive
#拷貝Mysql jdbc驅動到hive安裝包 lib目錄下(我的Mysql是8.
0.26的) docker cp /Users/luochao7/.m2/repository/mysql/mysql-connector-java/8.0.26/mysql-connector-java-8.0.26.jar 5fa8d538d8ae:/usr/local/hive/lib

  

三、配置Hive

  1.修改Hadoop中的 core-site.xml,並且 Hadoop集群同步配置文件,重啟生效

<property>
    <name>hadoop.proxyuser.root.hosts</name>
    <value>*</value>
</property>
<property>
    <name>hadoop.proxyuser.root.groups</name>
    <value>*</value>
</property>

  因為Hive需要把數據存儲在 HDFS上,並且通過 MapReduce作為執行引擎處理數據

  2.修改配置文件

#slf4j這個包hadoop及hive兩邊只能有一個,這里刪掉hive這邊
root@Master:/usr/local/hive/lib# rm log4j-slf4j-impl-2.10.0.jar

#guava這個包hadoop及hive兩邊只刪掉版本低的那個,把版本高的復制過去,這里刪掉hive,復制hadoop的過去(注意看路徑)
root@h01:/usr/local/hadoop/share/hadoop/common/lib# cp guava-27.0-jre.jar /usr/local/hive/lib/
root@h01:/usr/local/hive/lib# rm -rf guava-19.0.jar

#修改hive環境變量文件 添加Hadoop_HOME
root@h01:/usr/local/hive/conf# mv hive-env.sh.template hive-env.sh
root@h01:/usr/local/hive/conf# vim hive-env.sh

#在最后一行添加
export HADOOP_HOME=/usr/local/hadoop
export HIVE_CONF_DIR=/usr/local/hive/conf
export HIVE_AUX_JARS_PATH=/usr/local/hive/lib

#新增hive-site.xml 配置mysql等相關信息
root@h01:/usr/local/hive/conf# vim hive-site.xml

#粘貼配置
<configuration>
    <!-- 存儲元數據mysql相關配置 -->
    <property>
        <name>javax.jdo.option.ConnectionURL</name>
        <value> jdbc:mysql://172.17.0.2:3306/hive?createDatabaseIfNotExist=true&amp;useSSL=false&amp;useUnicode=true&amp;characterEncoding=UTF-8</value>
    </property>
    <property>
        <name>javax.jdo.option.ConnectionDriverName</name>
        <value>com.mysql.jdbc.Driver</value>
    </property>
    <!--mysql用戶名-->
    <property>
        <name>javax.jdo.option.ConnectionUserName</name>
        <value>root</value>
    </property>
    <!--mysql密碼-->
    <property>
        <name>javax.jdo.option.ConnectionPassword</name>
        <value>123456</value>
    </property>
    <!-- H2S運行綁定host -->
    <property>
        <name>hive.server2.thrift.bind.host</name>
        <value>h01</value>
    </property>
    <!-- 遠程模式部署metastore 服務地址 -->
    <property>
        <name>hive.metastore.uris</name>
        <value>thrift://h01: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> 

  3. 初始化元數據(先啟動 mysql)

root@h01:/usr/local/hive# bin/schematool -initSchema -dbType mysql -verbos

  初始化元數據,此時會在 mysql中,創建一個 hive數據庫,因為之前不存在 hive數據庫,所以會新建,在 mysql中使用: show databases 查看。

  常見問題:如果在執行如上語句的時候,出現如下圖:

            

  因為我的 mysql是安裝在另外一個 docker 容器中的,導致兩個 docker 不連通,解決辦法:docker中兩個容器ping不通的情況

  解決之后,重新修改 hive/conf/hive-site.xml,將地址修改為:jdbc:mysql://172.18.0.3:3306,重新執行初始化元數據命令,即可。

 

四、啟動Hive:第一代客戶端(deprecated 不推薦使用)

  1. 前台啟動Metastore服務(不推薦):
root@h01:/usr/local/hive# bin/hive --service metastore

  啟動后,窗口一直處於等待的狀態:

            

  這個時候,這個窗口就不能干別的,使用 control + c 結束,所以,不推薦這種方式。 

  2.后台啟動Metastore服務(推薦):

#輸入命令回車執行 再次回車 進程將掛起后台
root@h01:/usr/local/hive# nohup bin/hive --service metastore &

  注意末尾有一個 &符號,啟動后,這個進程在后台運行:

            

   使用 jps 查看進程:

            

  可見,有一個 RunJar 在后台運行。

  3.啟動 hive(先啟動Hadoop集群)

root@h01:/usr/local/hive# bin/hive

  啟動成功后,如下圖所示,輸入 show databases 可以查看hive的數據庫:

            

 

 五、啟動Hive:第二代客戶端(推薦使用)

  Hive經過發展,推出了第二代客戶端 beeline,但是 beeline客戶端不是直接訪問 metastore服務的,而是需要單獨啟動 hiveserver2服務。在Hive安裝的服務器上,首先啟動metastore服務,然后啟動 hiveserver2服務.

  如下圖所示:

            

  1. 后台啟動Metastore服務(先啟動Hadoop ,如果電腦資源比較小,可以只啟動Master):

#輸入命令回車執行 再次回車 進程將掛起后台
root@h01:/usr/local/hive# nohup bin/hive --service metastore &

  2. 后台啟動 hiverserver2 服務:

root@h01:/usr/local/hive# nohup bin/hive --service hiveserver2 &

  注意啟動 hiverserver2 服務之后,要等一會兒(等半分鍾吧)再往下啟動 beeline客戶端,不然會報錯:Could not open connection to the HS2 server

  3. 啟動 beeline客戶端:

root@h01:/usr/local/hive# bin/beeline

  4. 連接 hiverserver2 服務

beeline> ! connect jdbc:hive2://h01:10000
#輸入密碼,一般都是root訪問,直接輸入 root,密碼不用輸,直接回車
Enter username for jdbc:hive2://h01:10000: root
Enter password for jdbc:hive2://h01:10000:
Connected to: Apache Hive (version 3.1.2)

   截圖如下:

            

   否則,不連接 hiveserver2 的話,直接 show databases 會顯示:No current connection.

  5.測試是否能和Hadoop相連:(如果之前沒有創建 itcast 數據庫)

INFO  : Compiling command(queryId=root_20220324095900_739f115e-5f84-43f8-9eed-e07e95a84db4): create database itcast
INFO  : Compiling command(queryId=root_20220324095924_3e08b7ab-605f-4951-9c90-f002288f0b63): use itcast
INFO  : Compiling command(queryId=root_20220324095930_85fb6058-0d15-4d99-8cc3-8d6ae761f0b0): show tables
0: jdbc:hive2://h01:10000> create table t_user(id int, name varchar(255), age int);
0: jdbc:hive2://h01:10000> insert into table t_user values(1,"zhangsan",20);

  如果能插入成功,就表示能正常連接到Hadoop,因為Hive的數據都是存在 HDFS上的,只是這個過程很慢,如下圖:

            

   執行這一條 insert 語句,竟然花了 69秒,插入成功的話,使用:select * from t_user,顯示如下:

            

六、常見問題

  •   因為我的Hadoop、Mysql、Hive,都是部署在Docker容器服務中的,所以在啟動Hadoop 、Hive、Mysql的時候,運行 hive程序的時候,Mysql的容器就會掛掉,導致遠程連接錯誤,且Hive程序運行很慢。具體描述、解決方案,見:https://www.cnblogs.com/luo-c/p/15992665.html

  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM