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

網易雲發表於2018-05-10

本文由  網易雲 釋出。

作者:唐雕龍

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

 

 

面向新手的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/

相關文章