手把手教你搭建hadoop+hive測試環境(新手向)


本文由  網易雲 發布。

作者:唐雕龍

本篇文章僅限內部分享,如需轉載,請聯系網易獲取授權。

 

 

面向新手的hadoop+hive學習環境搭建,加對我走過的坑總結,避免大家踩坑。

對於hive相關docker,並沒有官方的docker,第三方維護經過測試各種不靠譜,所以才想到自己搭建一套,然后后期在整理成docker上傳~~~

 

基礎環境:

 

1. 公司雲主機debain8.8 (不像docker,所以對系統內核無要求)

 

1. 前置安裝:

 

1.1 jdk8(hive要求jdk7以上,千萬不要jdk9!!!!!詳情見末尾作死一)1.2 hadoop 2.7.X以上1.3 mysql或者postgresql(作為hive metastore的數據庫)

 

2. 安裝hadoop:

 

 

1.安裝metastore所用到數據庫。

對於mysql或者postgresql就偷懶直接docker pull 然后docker run了一個出來。畢竟僅僅作為hive元信息儲存角色。

docker pull mysql:5.7

docker run --name some-mysql -e MYSQL_ROOT_PASSWORD=XXX -d mysql:5.7

 

2.jdk版本升級。

官方下載jdk8的二進制包,使用whichjava查看系統自帶java目錄下載好的二進制包直接解壓后編輯etc/profile文件設置java相關的環境變量.

export JAVA_HOME=/xx/xx/jdk8 

export PATH=$JAVA_HOME/bin:$PATH

export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar

 

編輯完后記得source /etc/profile,接着運行java -version確認是否成功

 

3.增加hadoop安裝用戶

官方建議增加hadoop用戶組以及hadoop用戶,我也建議這樣做,但是公司雲主機的話我就直接用我們有數的公共賬號。

 

4.安裝ssh服務器

hadoop使用到了ssh,所以需要

apt-get install openssh-server

 

然后測試

ssh localhost #會生成.ssh文件夾

 

並且配置ssh無密碼登陸

cd /home/XXXX/.ssh/ #XX為你的用戶名,比如有數賬號是youdata,XXX就是youdata 

ssh-keygen -t rsa# 一路按回車就可以

cat ./id_rsa.pub >> ./authorized_keys # 加入授權

 

在執行一下ssh localhost 確保配置成功。

 

5.hadoop服務安裝

直接找到官方下載url,wget下來我用的是:

wget heep://mirror.bit.edu.cn/apache/hadoop/common/hadoop-2.7.4/hadoop-2.7.4.tar.gz

 

順便也把hive下載下來吧

wget http://mirror.bit.edu.cn/apache/hive/hive-2.1.1/apache-hive-2.1.1-bin.tar.gz

 

下載過后解壓即可,最好選擇掛載的比較大雲硬盤上。然后記得對你的安裝用戶給權限。

sudo chown -R hadoop ./hadoop#hadoop為用戶,第二個為解壓后的文件夾名

 

然后進入hadoop目錄下,執行

./bin/hadoop version

 

如果成功就說明下載的hadoop是可用的。 接下來修改hadoop配置達到單機偽分布式啟動.所謂偽分布式就是在單機上以分離的java進程運行,節點同時扮演NameNode和DataNode,讀取的是HDFS中的文件。

 

6.hadoop偽分布式配置

Hadoop 的配置文件位於 /usr/local/hadoop/etc/hadoop/中,偽分布式需要修改2個配置文件 core-site.xml 和 hdfs-

site.xml 。Hadoop的配置文件是 xml 格式,每個配置以聲明 property 的 name 和 value 的方式來實現。

 

6.1. core-site.xml修改:

<configuration>

<property>

       <name>hadoop.tmp.dir</name>

       <value>file:/usr/local/hadoop/tmp</value>

</property>

<property>

       <name>fs.defaultFS</name>

      <value>hdfs://localhost:9000</value>

</property>

</configuration>

 

其中目錄同樣推薦放在空間較大的盤上。並且確保用戶有權限,所以最好用當前用戶建一個~~

 

6.2. hdfs-site.xml修改:

<configuration>

<property>

       <name>dfs.replication</name>

       <value>1</value>

</property>

<property>

       <name>dfs.namenode.name.dir</name>

       <value>file:/usr/local/hadoop/tmp/dfs/name</value>

</property>

<property>

       <name>dfs.datanode.data.dir</name>

       <value>file:/usr/local/hadoop/tmp/dfs/data</value>

</property>

</configuration>

 

同樣的,這兩個文件目錄最好自己指定並且用當前用戶建,指定的好處是避免誤刪導致hadoop需要重新format.

 

7.初始化hadoop節點

配置完后在hadoop目錄下執行

./bin/hdfs namenode -format

 

成功后可以看到Exitting with status 0

坑一: 啟動時候提示:ssh: Could not resolve hostname xxx,設置hadoop環境變量即可解決

export HADOOP_HOME=/usr/local/hadoop

export HADOOP_COMMON_LIB_NATIVE_DIR=$HADOOP_HOME/lib/native


啟動日志信息是記錄在 /usr/local/hadoop/logs/hadoop-hadoop-namenode-DBLab-XMU.log 中,所以應該查看這個后綴為 .log 的文件;

 

8.hadoop服務啟動

啟動hadoop執行:

./sbin/start-dfs.sh

 

啟動成功后執行jps,可以看到

youdata@hzadg-youdata-test:/srv/nbs/0/hadoop$ jps 

35664 SecondaryNameNode

52310 Jps

35320 NameNode

35485 DataNode

 

會出現 “NameNode”、”DataNode” 和 “SecondaryNameNode” 要關閉hadoop執行

./sbin/stop-dfs.sh

 

額外的啟動Yarn:YARN 是從 MapReduce 中分離出來的,負責資源管理與任務調度。YARN 運行於 MapReduce 之上,提供了高可用性、高擴展性 上述通過 ./sbin/start-dfs.sh 啟動 Hadoop,僅僅是啟動了 MapReduce 環境,我們可以啟動YARN ,讓 YARN 來負責資源管理與任務調度。 編輯/etc/hadoop/mapred-site.xml

<configuration>

<property>

       <name>mapreduce.framework.name</name>

       <value>yarn</value>

</property>

</configuration>

 

接着修改yarn-site.xml

<configuration>

<property>

       <name>yarn.nodemanager.aux-services</name>

       <value>mapreduce_shuffle</value>

</property>

</configuration>

 

然后啟動mapreduce即上面的

./sbin/start-dfs.sh # 啟動MapReduce

./sbin/start-yarn.sh # 啟動YARN

./sbin/mr-jobhistory-daemon.sh start historyserver #開啟歷史服務器,才能在Web中查看任務運行情況

 

YARN 有個好處是可以通過 Web 界面查看任務的運行情況:http://localhost:8088/cluster 至此hadoop安裝完畢,接下來安裝hive.

 

3. 安裝hive:

1.對hive基本介紹

metadata: 即元數據。元數據包含用Hive創建的database、table等的元信息。元數據存儲在關系型數據庫中。如Derby、MySQL等。 Metastore:客戶端連接metastore服務,metastore再去連接MySQL數據庫來存取元數據。有了metastore服務,就可以有多個客戶端同時連接,而且這些客戶端不需要知道MySQL數據庫的用戶名和密碼,只需要連接metastore 服務即 可 。然 后 對 於 metastore 有 三 種 配 置 方 式 : 

1.內嵌模式使用的是內嵌的Derby數據庫來存儲元數據,也不需要額外起Metastore服務。這個是默認的,配置簡單,但是一次只能一個客戶端連接                                                                                                                                                     

2.本地元存儲和遠程元存儲都采用外部數據庫來存儲元數據,目前支持的數據庫有:MySQL、Postgres、Oracle、MS SQL Server.在這里我們使用MySQL。                                                                                                                                     

3.本地元存儲和遠程元存儲的區別是:本地元存儲不需要單獨起metastore服務,用的是跟hive在同一個進程里的metastore服務。遠程元存儲需要單獨起metastore服務,然后每個客戶端都在配置文件里配置連接到該metastore服務。

 

2.hive配置

hive配置文件位於解壓目錄下的conf里 1.修改hive-env.sh 

export JAVA_HOME=/opt/java ##Java路徑

export HADOOP_HOME=/opt/hadoop ##Hadoop安裝路徑

export HIVE_HOME=/opt/hive ##Hive安裝路徑

export HIVE_CONF_DIR=/opt/hive/conf ##Hive配置文件路徑

 

2.創建hdfs目錄並賦予權限

hdfs dfs -mkdir -p /user/hive/warehouse 

hdfs dfs -mkdir -p /user/hive/tmp

hdfs dfs -mkdir -p /user/hive/log

hdfs dfs -chmod g+w /user/hive/warehouse 

hdfs dfs -chmod g+w /usr/hive/tmp

hdfs dfs -chmod g+w /usr/hive/log

 

3.修改hive-site.xml 將 hive-site.xml 文件中以下幾個配置項的值設置成上一步中創建的幾個路徑,同樣建議放於空間較大的盤上

<configuration>

<property>

       <name>hive.exec.scratchdir</name>

       <value>/user/hive/tmp</value>

</property>

<property>

       <name>hive.metastore.warehouse.dir</name>

       <value>/user/hive/warehouse</value>

</property>

<property>

       <name>hive.querylog.location</name>

       <value>/user/hive/log</value>

</property>

</configuration>

 

4.增加metastore使用到的數據庫相關連接信息的配置,修改hive-site.xml

<configuration>

<property>

       <name>javax.jdo.option.ConnectionURL</name>

       <value>jdbc:mysql://localhost:3306/hive?createDatabaseIfNotExist=true&characterEncodig=UTF-8&useSSL=

</property>

<property>

       <name>javax.jdo.option.ConnectionDriverName</name>

       <value>com.mysql.jdbc.Driver</value>

</property>

<property>

       <name>javax.jdo.option.ConnectionUserName</name>

       <value>hive</value>

</property>

<property>

       <name>javax.jdo.option.ConnectionPassword</name>

       <value>hive</value>

</property>

</configuration>


 

運行Hive 在命令行運行 hive 命令時必須保證以下兩點: HDFS 已經啟動。可以使用 start-dfs.sh 腳本來啟動 HDFS。MySQL jdbc jar包添加到 $HIVE_HOME/lib 目錄下。 然后在hive目錄下,執行

./bin/schematool-dbtype mysql-initSchema

 

執行成功后就可以執行hive看成功了嗎

./bin/hive

 

啟動hive服務則是

./bin hive --service hiveserver2 &

 

測試用beeline連接,如果出現類似

org.apache.hive.service.cli.HiveSQLException: Failed to open new session: java.lang.RuntimeException: org.apache

 

就是你這個用戶不允許偽裝為 anonymous(hive的默認用戶,默認配置可以查看)。 修改hadoop的core-site.xml文件增加

<configuration>

<property>

       <name>hadoop.proxyuser.XXX.hosts</name>

       <value>*</value>

</property>

<property>

       <name>hadoop.proxyuser.XXX.groups</name>

      <value>*</value>

</property>

</configuration>

 


即可,XXX是你的用戶名,然后重啟hadoop. 至此,hadoop+hive測試環境就已經搭建完成。 額外的:

 

作死一:好奇使用jdk9

因為jdk9還不成熟,並且我直觀上對之前老版本編譯出的jar包有些不兼容,比如

Exception in thread "main" java.lang.ClassCastException: java.base/jdk.internal.loader.ClassLoaders$AppClassLoa

 

這個還能搜到原因,是因為jdk9的 將URLClassLoader 作為系統的ClassLoaders的superclass導致,所以之前用到他兩轉化的都會出錯需要重寫代碼。 又或者:

java.lang.Integer (jdbc-type="", sql-type="") cant be mapped for this datastore. No mapping is available.

 

在使用mysql作為metastore時候報錯,使用到的mysqljdbc為:mysql-connector-java-5.1.42.jar 這個錯誤完全搜不到原因,不過看報錯是java類型到sql映射出錯。所以猜測仍然是jdk9對之前版本的某些jar或者之前jdk的某些用法不支持。 后來更換mysqljdbc版本到6.06仍然這個錯誤。后來更換jdk版本就不再出錯。。。。。所以,現在先別作死生產環境用java9......

 

網易有數:企業級大數據可視化分析平台。面向業務人員的自助式敏捷分析平台,采用PPT模式的報告制作,更加易學易用,具備強大的探索分析功能,真正幫助用戶洞察數據發現價值。可點擊這里免費試用

 

了解 網易雲 :
網易雲官網:https://www.163yun.com/
新用戶大禮包:https://www.163yun.com/gift
網易雲社區:https://sq.163yun.com/


免責聲明!

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



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