Hive 的偽分布部署(搭建平臺為Kali Linux)
??時間很快,學校的Hive課程講解完也有幾周了,終于抽出時間來做相關內容的總結,在學習和安裝hive之前,個人認為有必要簡單的介紹下,什么是Hive呢?
??簡介:
??Hive是基于Hadoop構建的一套資料倉庫分析系統,它提供了豐富的SQL查詢方式來分析存盤在Hadoop分布式檔案系統中的資料:可以將結構化的資料檔案映射為一張資料庫表,并提供完整的SQL查詢功能;可以將SQL陳述句轉換為MapReduce任務運行,通過自己的SQL查詢分析需要的內容,這套SQL簡稱Hive SQL,使不熟悉mapreduce的用戶可以很方便地利用SQL語言查詢、匯總和分析資料,而mapreduce開發人員可以把自己寫的mapper和reducer作為插件來支持hive做更復雜的資料分析,
??對hive有了一個簡單初步的認識后,我們就開始干活吧,哈哈哈,
??首先,需要明確任務項:
?? ① 已正確無誤的搭建好Haoop平臺
?? ② 安裝好Hive可儲存原資料的資料庫,如MysqL,derby等資料庫系統,
?? (在這里,我們選用mysql資料庫)
??③ Hive的偽分布部署
?? 好了,在確定了任務點之后,就開始逐一解決吧,
??先看看我的搭建和運行環境:

??并且我是均是在root賬號下搭建的,
??一、Kali Linux中Hadoop的偽分布搭建
??相信,你已經閱覽了博主的其他博文,kali中如何搭建hadoop,博主在另一篇博文中寫了詳細的教程,可愛漂亮小姐姐和聰明帥氣小哥哥們,你們可以移步這里學習哦:?Kali Linux 如何搭建 Hadoop平臺,Hadoop 偽分布安裝與使用?博主就不在此篇做累贅了,哈哈哈,見諒,如果,你已經搭建好了,那么博主恭喜你!!
??● Kali 終端檢驗hadoop的偽分布是否搭建成功:
C:\root> start-dfs.sh
Starting namenodes on [localhost]
Starting datanodes
Starting secondary namenodes [kali]
C:\root> start-all.sh
Starting namenodes on [localhost]
Starting datanodes
Starting secondary namenodes [kali]
Starting resourcemanager
Starting nodemanagers

??● Web界面管理HDFS:
??在hadoop 2.x的版本是在kali自帶的火狐中輸入:localhost:50070來打開;
而在hadoop 3.x中則是:localhost:9870

??也或許,有朋友在瀏覽器中是打不開web管理界面的,這可能是缺少了對yarn的埠配置,修改hadoop中hdfs-site.xml組態檔,添加埠的配置,否則有些電腦上會打不開web頁面管理,如果你的 hadoop是2.x版本寫50070 ,如果 hadoop是3.x的版本則寫成9870的埠,
hadoop2.x:
<property>
<name>dfs.http.address</name>
<value>0.0.0.0:50070</value>
</property>
hadoop3.x:
<property>
<name>dfs.http.address</name>
<value>0.0.0.0:9870</value>
</property>
??二、安裝和配置MySQL服務
??在 kali上默認是自帶了mysql 的,所以,我們只需要啟動mysql并配置MySQL允許Hive接入,就能支持Hive的正常使用了,
??但更多時候,kali原帶mysql資料庫并不友善,會遇到挺多的問題,不管遇到哪些問題,博主都建議您重裝mysql,這樣一般是比查找資料解決問題所花費時間少且效率高的,


??以上是博主曾遇到的問題,詢問過諸多朋友和百度查詢了大量資料后仍舊無效,最后,博主果斷的選擇了重裝,
??需要特別強調的是,一定要完全徹底的卸載MySQL,否則會影響到MySQL正常安裝或使用!
??好在樂于助人的博主,已幫你整理好了徹底卸載并重裝mysql的方法:
① 卸載mysql和其相關應用:
apt-get remove mysql*

② 查看卸載殘留并清理:
dpkg --list|grep mysql
(執行該命令查看mysql卸載殘留,還剩什么就卸載什么,一定要都卸載掉,)

③ 最后清理殘留資料:
dpkg -l | grep ^rc | awk '{print $2}' | sudo xargs dpkg -P
??選擇“是”,


為保險起見再執行如下命令:
apt-get remove mariadb-client
apt-get autoremove mariadb-client
apt-get remove mariadb-server
apt-get autoremove mariadb-server
??Kali重裝MySQL:
??因為在kali中是沒有mysql的包的,所以,我們選擇安裝Mariadb來使用mysql:
apt-get install mariadb-client
apt-get install mariadb-server
??安裝好mysql后配置mysql
vim /etc/mysql/my.cnf
??增添如下內容:
[client-server]
port=3306
socket=/tmp/mysql.sock
[mysql]
#default-character-set=utf8
[mysqld]
basedir=/usr/local/mysql/
datadir=/usr/local/mysql/data/mysql
character-set-server=utf8
tmpdir=/tmp

允許開機自啟動:
systemctl enable mysql
啟動mysql服務:
service mysql start
??檢驗MySQL服務是否已開啟:
??博主在這里簡單的介紹兩種檢驗方式:
systemctl status mysql
或者
netstat -tap | grep mysql

??此外,可通過如下命令關倍訓重啟MySQL服務器:
service mysql stop # 關閉MySQL服務器
service mysql restart # 重啟MySQL服務器
??進入 MySQL Shell :
mysql -u root -p
??“-u”表示登陸的用戶名,“-p”表示登陸用戶密碼,登陸密碼是安裝程序中設定的,輸入后登陸MySQL Shell,
??如果覺得安全性不夠高,可以通過如下方法,修改MySQL的密碼:
ALTER USER 'root'@'localhost' identified by 'newpasswd';
# newpasswd是你要修改的新密碼,
??如果修改是報錯,大多情況下是沒有重繪權限關系導致的,重繪后再修改密碼:
flush privileges; # 重繪權限關系,
ALTER USER 'root'@'localhost' identified by 'newpasswd';
??也或者可以通過如下命令來修改:
mysqladmin -u用戶名 -p舊密碼 password 新密碼
# 此處僅介紹兩種修改方法


??三、Hive的偽分布式部署
??hive是基于hadoop的資料倉庫工具,將一定格式的檔案映射為一張張表,因此hive版本和hadoop版本有對應關系,所以,一定要檢查自己安裝的hadoop和hive版本是否兼容!!
??弱弱的說句題外話,由于博主在搭建的時候,沒考慮版本兼容的問題,吃了不少的虧,在查詢了大量資料和咨詢已作業的工程師后才搞明白,原來是版本不兼容導致的,
??如果你也像博主一樣,因為版本不兼容導致Hive無法啟動或正常使用,別擔心,博主也會在隨后為你提供解答方案,
??1. Hadoop與Hive的版本兼容性查詢:
????Hadoop與Hive的版本兼容查詢
??2. Hive下載:
???? ① Hive官網下載:http://archive.apache.org/dist/hive/
???? ② 當然,樂于助人的博主也提供了自己下載好的兩版本:Hive1.2和Hive3.1版本
???? ? 提取碼:nlpa
????? (我知道聰明的你一定知道,可以通過kali自帶的火狐瀏覽器直接下載在虛擬機中,或者是使用vmtools通過共享檔案夾)
?? 3. Hive的安裝和配置:
??? ① 解壓安裝:
mkdir /home/Hive # 創建hive的檔案夾
sudo tar zxvf apache-hive-3.1.2-bin.tar.gz -C /home/Hive
# 可以安裝到你所指定的路徑下,博主習慣把軟體安裝在home下,
sudo mv /home/Hive/apache-hive-3.1.2-bin /home/Hive/hive
# 更改檔案名,僅為方便,
sudo chomd -R root /home/Hive/hive # 對hive授權
??? ② 配置環境變數:
??為使用方便,我們把hive命令加入環境變數:
vim ~/.bashrc
??添加以下內容:
# Hive
export HIVE_HOME=/home/Hive/hive
export PATH=$PATH:$HIVE_HOME/bin

??執行生效命令:
source ~/.bashrc
??? ③ Hive 的配置:
??? 修改hive-site.xml檔案:
vim /home/Hive/hive/conf/hive-site.xml
# hive-site.xml中的設定優先級高于hive-default.xml
??? hive-site.xml檔案的添加配置資訊如下:
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
<property>
<name>javax.jdo.option.ConnectionURL</name>
<value>jdbc:mysql://localhost:3306/hive?createDatabaseIfNotExist=true</value>
<description>JDBC connect string for a JDBC metastore</description>
</property>
<property>
<name>javax.jdo.option.ConnectionDriverName</name>
<value>com.mysql.cj.jdbc.Driver</value>
<description>Driver class name for a JDBC metastore</description>
</property>
<property>
<name>javax.jdo.option.ConnectionUserName</name>
<value>hive</value>
<description>username to use against metastore database</description>
</property>
<property>
<name>javax.jdo.option.ConnectionPassword</name>
<value>hive</value>
<description>password to use against metastore database</description>
</property>
</configuration>
??看描述內容,設定了mysql地址,driver,資料庫user,資料庫passwd,可以根據情況自行修改,必須與后面mysql中創建的一致,否則連接不上
??4.下載并安裝MySQL JDBC驅動:
??JDBC(java DataBase Connectivity,Java 資料庫連接)是一種用于執行SQL陳述句的java API,可為多種關系資料庫提供統一訪問,一組由用Java語言撰寫的類和介面組成,JDBC與Microsoft的ODBC一樣,都用于訪問關系資料庫的編程介面,為了讓Hive連接到MySQL資料庫,需要下載JDBC驅動包,
?? ● 解壓縮安裝(方法 1):
????(1) MySQL JDBC官網下載
????(1)當然,帥氣熱心的博主也提供了自己網盤:
https://pan.baidu.com/s/1lyQ7b8IALlLp6p1qXA9lWQ
???? 提取碼:99ja
????解壓并將jar包復制到Hive安裝路徑的lib目錄下:
tar zxvf mysql-connector-java-5.1.49.tar.gz
cp mysql-connector-java-5.1.49/mysql-connector-java-5.1.49-bin.jar /home/Hive/hive/lib
????如果,使用 低于mysql-connector-java-5.1.46-bin.jar,會影響Hive表的洗掉操作, 也可直接上網下載mysql-connector-java-bin.jar,同樣是移動到/hive/lib下,
?? ● 下載MySQL JDBC的deb包安裝(方法 2):
?? ? 官網MySQL JDBC下載
?? ? 由于Kali是屬于Debian系列的,所以,我們選擇下載該版本,如圖:

?? ?注意下載的是deb格式的,也可以使用cpkg命令安裝,
cd ~/下載 # 切換到你的檔案所在目錄下
?? ?對于deb包,我們可以使用apt/apt-get包安裝,也可以采用deb包的專業管理命令哈,
?? ?安裝方法 1:
sudo apt install ./mysql-connector-java_8.0.22-1debian10_all.deb
?? ?安裝方法 2:
sudo dpkg -i mysql-connector-java_8.0.22-1debian10_all.deb
?? ?同樣是將mysql-connector-java.jar包拷貝到/hive/lib目錄下
cp /usr/share/java/mysql-connector-java-8.0.22.jar /home/Hive/hive/lib
?? ? jar包是在/usr/share/java/路徑下
?? ?(驗證路徑的方法:打開deb檔案,提取檔案,看到.tar.xz檔案,用xz -d 解壓,tar -xvf 解包,出來的檔案目錄路徑就是在系統中的路徑)
??注意:jdbc 8.0.22 driver class name 更改:com.mysql.cj.jdbc.Driver,其他教程中是com.mysql.jdbc.Driver,如果錯了會提示,(沒問題情況下,可直接忽視這句,)
??5.在MySQL中為Hive新建資料庫:
?? 為保存Hive的原資料(包括表的名稱,屬性,列和磁區,資料所在目錄等) ,需要建立一個“hive”的MySQL資料庫,這個資料庫名稱與/hive/hive-site.xml組態檔中如下內容相對應:
<property>
<name>javax.jdo.option.ConnectionUserName</name>
<value>hive</value>
# 當然,你也可自己命令哦
<description>username to use against metastore database</description>
</property>
??在“mysql>”提示下建立資料庫:
mysql> create database hive;
?? 由于博主已經建過hive資料庫了,所以,就不在此處上圖了,見諒,哈哈哈,
??6. 配置MySQL 允許Hive接入:
mysql > grant all on *.* to hive@localhost identified by 'hive';
mysql> flush privileges;
??grant陳述句的作用是將所有資料庫的所有表的所有權限賦值給本地機的Hive用戶(Hive@localhost),“*.*”代表所有資料庫所有表;“by”之后的“hive”是組態檔hive-site.xml時的元資料連接密碼,這個密碼來自/hive/conf/hive-site.xml組態檔中以下配置內容:
<property>
<name>javax.jdo.option.ConnectionPassword</name>
<value>hive</value>
# 當然,你可以寫自己想要的密碼,注意和上面權限驗證時的密碼一致就好,
<description>password to use against metastore database</description>
</property>

??7. 啟動Hive !
?? Hive是基于Hadoop的資料倉庫,會把用戶的查詢陳述句自動轉換MapReduce任務,并把結果回傳用戶,因此,啟動Hive之前需啟動Hadoop集群,命令如下:
start-dfs.sh # 我相信你已經搭建好hadoop平臺了
cd /home/Hive/hive
./bin/hive
# 因為,我們已在環境變數中配置好了,所以可以直接使用hive命令啟動!

??注意:如果啟動hive時如果出現Hive metastore database is not initialized的錯誤,則使用命令初始化:
schematool -dbType mysql -initSchema
??如果能執行到這里,幸運的話,祝賀你已經完成了Hive的偽分布部署!!
??當然,也有像博主一樣悲催的,hive始終不能正常運行,原因就是hadoop的版本和hive的版本不兼容,費了一定的勁才得以解決,
??主要報錯資訊:
??java.lang.NoSuchMethodError:
com.google.common.base.Preconditions.checkArgument(ZLjava/lang/String;Ljava/lang/Object;)V
C:\root> hive
SLF4J: Class path contains multiple SLF4J bindings.
SLF4J: Found binding in [jar:file:/home/Hive/hive/lib/log4j-slf4j-impl-2.10.0.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in [jar:file:/home/Hadoop/hadoop-3.3.0/share/hadoop/common/lib/slf4j-log4j12-1.7.25.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation.
SLF4J: Actual binding is of type [org.apache.logging.slf4j.Log4jLoggerFactory]
Exception in thread "main" java.lang.NoSuchMethodError: com.google.common.base.Preconditions.checkArgument(ZLjava/lang/String;Ljava/lang/Object;)V
at org.apache.hadoop.conf.Configuration.set(Configuration.java:1380)
at org.apache.hadoop.conf.Configuration.set(Configuration.java:1361)
at org.apache.hadoop.mapred.JobConf.setJar(JobConf.java:536)
at org.apache.hadoop.mapred.JobConf.setJarByClass(JobConf.java:554)
at org.apache.hadoop.mapred.JobConf.<init>(JobConf.java:448)
at org.apache.hadoop.hive.conf.HiveConf.initialize(HiveConf.java:5141)
at org.apache.hadoop.hive.conf.HiveConf.<init>(HiveConf.java:5099)
at org.apache.hadoop.hive.common.LogUtils.initHiveLog4jCommon(LogUtils.java:97)
at org.apache.hadoop.hive.common.LogUtils.initHiveLog4j(LogUtils.java:81)
at org.apache.hadoop.hive.cli.CliDriver.run(CliDriver.java:699)
at org.apache.hadoop.hive.cli.CliDriver.main(CliDriver.java:683)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.apache.hadoop.util.RunJar.run(RunJar.java:323)
at org.apache.hadoop.util.RunJar.main(RunJar.java:236)

??從報錯資訊來看:
?? 一,java.lang.NoSuchMethodError:
???原因:
????? 1. 系統找不到相關jar包
????? 2. 同一型別的 jar 包有不同版本存在,系統無法決定使用哪一個
?? 二,com.google.common.base.Preconditions.checkArgument:
????? 通過上網查詢,我們可知,該類是在guava.jar中的,
??所以,此時我們就清楚的知道,是hive中guava.jar包和hadoop中的guava.jar包版本相差過大,導致檔案在加載和使用的時候產生沖突,一般情況下是優先的把hive中低版本的一個的guava.jar包給優先加載了,而低版本明顯是支持不了較新的hadoop的,
?? 解決方法:
?? 查詢guava.jar包的位置:
C:\root> find / -type f -name guava*.jar
/home/pycharm/pycharm-community-2019.3.3/lib/guava-27.1-jre.jar
/home/IntelliJ-IDEA/idea-IC-193.6494.35/plugins/maven/lib/maven3/lib/guava-25.1-android.jar
/home/IntelliJ-IDEA/idea-IC-193.6494.35/lib/guava-27.1-jre.jar
/home/Eclipse/plugins/org.eclipse.m2e.maven.runtime_1.9.0.20180606-2035/jars/guava-20.0.jar
/home/Hadoop/hadoop-3.3.0/share/hadoop/hdfs/lib/guava-27.0-jre.jar
/home/Hadoop/hadoop-3.3.0/share/hadoop/yarn/csi/lib/guava-20.0.jar
/home/Hadoop/hadoop-3.3.0/share/hadoop/common/lib/guava-27.0-jre.jar
/home/Hive/hive/lib/guava-19.0.jar
/home/HBase/hbase-2.3.2/lib/guava-11.0.2.jar
/mnt/hgfs/kali vmware tool sharing/guava-27.1-jre.jar
/usr/share/maltego/maltego-core-platform/modules/ext/guava-27.1-jre.jar
/usr/share/jadx/lib/guava-27.1-jre.jar
/usr/share/java/guava.jar
/root/.cache/vmware/drag_and_drop/TNc3uG/guava-27.1-jre.jar
?? 經過測驗,我們最終確定了是位于hive/lib中的中guava-19.0.jar版本低于hadoop中share/hadoop/common/lib/路徑下的guava-27.0-jre.jar版本,所以,我們只需修改該包即可:
rm /home/Hive/hive/lib/guava-19.0.jar
# 洗掉低版的jar包
cp /home/Hadoop/hadoop-3.3.0/share/hadoop/common/lib/guava-27.0-jre.jar /home/Hive/hive/lib
# 將hadoop的jar包復制替換到hive中,此處的hadoop是3.3.0的版本,hive是3.1.2版本,其他不兼容版本如果報這個錯,修改方法也是一樣的,
# reboot
??待重啟之后,和之前一樣開啟hadoop再運行hive就完成了hive的偽分布部署了,hive頭疼的不兼容問題也得以解決,
??附錄:



?? 到此,Hive在Kali Linux上的偽分布部署就告一段落了,希望對你有幫助哈!!
?? 最后打一波小廣告,本人大三大資料小菜雞,有愿意交流討論問題的小可愛可以加QQ群:965234078一起交流和學習呀,謝謝!
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/237207.html
標籤:其他
