Hadoop入門(一)之Hadoop偽分散式環境搭建

PeTu發表於2018-09-04

原文地址:pengtuo.tech/2018/09/04/…

以這篇文章開啟大資料開發系列教程更新,本人也是努力學習中

1. 環境要求

首先 Java 版本不低於 Hadoop 相應版本要求,一般的,Hadoop 大版本號在 2.6 以前的支援 Java 6,Hadoop 大版本號 在 2.7 ~ 3.0 之間的支援 Java 7,Hadoop 版本在 3.0 之後的支援 Java 8

詳細可見官網 Hadoop Java Versions

本文所用的 Hadoop 版本為 hadoop-2.6.0-cdh5.7.0,這個版本很穩定,屬於大多企業使用的 Hadoop 版本,Java 版本使用的是 java version "1.7.0_80"

在 Linux 中下載,執行以下命令:

  • 下載 Java 8
wget --no-check-certificate -c --header "Cookie: oraclelicense=accept-securebackup-cookie" http://download.oracle.com/otn-pub/java/jdk/8u161-b12/2f38c3b165be4555a1fa6e98c45e0808/jdk-8u161-linux-x64.tar.gz
複製程式碼
  • 下載 Java 7
wget --no-check-certificate -c --header "Cookie: oraclelicense=accept-securebackup-cookie" http://download.oracle.com/otn/java/jdk/7u80-b15/jdk-7u80-linux-x64.tar.gz?AuthParam=1523684058_82b7921ee0def49bd2a0930187900e60
複製程式碼
  • 下載 hadoop-2.6.0-cdh5.7.0
wget --no-check-certificate -c --header "Cookie: oraclelicense=accept-securebackup-cookie" http://archive.cloudera.com/cdh5/cdh/5/hadoop-2.6.0-cdh5.7.0.tar.gz
複製程式碼

本人的建議檔案管理方式,將這些下載都儲存到 ~/downloads/ 資料夾裡,然後解壓到 ~/app/ 檔案裡

2. 環境配置

2.1 配置 Java

執行解壓命令

tar -zxvf jdk-8u161-linux-x64.tar.gz -C ~/app/
複製程式碼

建立.profile 檔案,如果有就不用建立了,然後在.profile 檔案裡新增

export JAVA_HOME=/root/app/jdk1.7.0_80
export PATH=$JAVA_HOME/bin:$PATH
複製程式碼

儲存退出後,執行 source .profile 讓配置生效

2.2 配置 ssh 免密登入

HDFS 是由一個 NameNode,一個 SecodaryNameNode,以及 n 個 DataNode 組成,當有多臺物理機時,NameNodeDataNode 是分佈在不同的物理機上,部署則需要 NameNode 能夠直接與 DataNode 進行通訊,通訊方式之一就是使用 SSH (Secure Shell),所以需要在之間設定免密登入

因為本次是 Hadoop 偽分散式搭建,本機同時充當 NameNodeDataNode 角色,所以只需要配置一個本機的 SSH 免密登入

執行:

ssh-keygen -t rsa
cp ~/.ssh/id_rsa.pub ~/.ssh/authorized_keys
複製程式碼

即可

2.3 修改 hadoop 配置檔案

解壓 hadoop 壓縮包:

tar -zxvf hadoop-2.6.0-cdh5.7.0.tar.gz -C ~/app/
複製程式碼

.profile 檔案裡新增:

export HADOOP_HOME=/root/app/hadoop-2.6.0-cdh5.7.0
export HADOOP_CONF_DIR=$HADOOP_HOME/etc/hadoop
export PATH=$HADOOP_HOME/bin:$PATH
複製程式碼

Hadoop 的配置檔案都在 hadoop_home/etc/hadoop/ 裡,如果你的檔案管理方式和我一樣的話,則是在 ~/app/hadoop-2.6.0-cdh5.7.0/etc/hadoop/

hadoop-env.sh 中新增:

export JAVA_HOME= 你的 java home 路徑
複製程式碼

core-site.xml 中新增:

<configuration>

<property>
    <name>fs.defaultFS</name>
    <value>hdfs:// {你的 IP 地址或 hostname} :8020</value>
</property>

<property>
    <name>hadoop.tmp.dir</name>
    <value>~/app/tmp</value>
</property>

</configuration>
複製程式碼

hdfs-site.xml 中新增:

<configuration>
    <property>
        <name>dfs.replication</name>
        <value>1</value>
    </property>
</configuration>
複製程式碼

2.4 啟動 hdfs

首先格式化檔案系統

注意:僅第一次執行即可,不要重複執行

cd ~/app/hadoop-2.6.0-cdh5.7.0
bin/hdfs namenode -format
複製程式碼

然後啟動 namenodedatanode

sbin/start-dfs.sh
複製程式碼

檢驗是否啟動成功,執行 jps,如果顯示:

3644 SecondaryNameNode
3341 NameNode
3450 DataNode
4141 Jps
複製程式碼

則表示環境配置成功,如果少一個就表示啟動沒有成功,則需要檢查相應的日誌進行錯誤排查

3. 錯誤排查

NameNodeSecondaryNameNode以及DataNode的啟動日誌都在~/app/hadoop-2.6.0-cdh5.7.0/logs/中,檢視對應的.log檔案可獲得啟動資訊以及錯誤日誌

本人配置過程的遇到的錯誤有:

(1) 地址繫結錯誤:

Problem binding to [aliyun:8030] 
java.net.BindException: Cannot assign requested address; 
For more details see:  http://wiki.apache.org/hadoop/BindException

Caused by: java.net.BindException: Cannot assign requested address
複製程式碼

解決方法:本人是在阿里雲伺服器上配置,在 /etc/hosts 檔案中,主機名配置IP不能用公網IP,需要用內網IP

(2) 在啟動 hadoop 時,有 log4jwarning 警告資訊

解決方法:vim etc/hadoop/log4j.properties,然後新增 log4j.logger.org.apache.hadoop.util.NativeCodeLoader=ERROR

注意:此方法只是修改了 log4j 的活躍等級,並不是解決了 warning 的根源,屬於治標不治本

(3) 執行 jps 後,只啟動了 NameNodeSecondaryNameNode,沒有啟動 DataNode 檢視日誌得到錯誤日誌:

2018-09-04 11:47:38,166 FATAL org.apache.hadoop.hdfs.server.datanode.DataNode: Initialization failed for Block pool <registering> (Datanode Uuid unassigned) service to aliyun/172.16.252.38:8020. Exiting.
java.io.IOException: All specified directories are failed to load.
	at org.apache.hadoop.hdfs.server.datanode.DataStorage.recoverTransitionRead(DataStorage.java:478)
	at org.apache.hadoop.hdfs.server.datanode.DataNode.initStorage(DataNode.java:1394)
	at org.apache.hadoop.hdfs.server.datanode.DataNode.initBlockPool(DataNode.java:1355)
	at org.apache.hadoop.hdfs.server.datanode.BPOfferService.verifyAndSetNamespaceInfo(BPOfferService.java:317)
	at org.apache.hadoop.hdfs.server.datanode.BPServiceActor.connectToNNAndHandshake(BPServiceActor.java:228)
	at org.apache.hadoop.hdfs.server.datanode.BPServiceActor.run(BPServiceActor.java:829)
	at java.lang.Thread.run(Thread.java:745)
複製程式碼

這個是檔案系統初試化時出了問題

解決方法:停止已啟動的節點,停止命令為 sbin/stop-dfs.sh,刪除 ~/app/tmp/dfs 資料夾,然後重新到 ~/app/hadoop-2.6.0-cdh-5.7.0/ 執行 bin/hdfs namenode -format,然後啟動 sbin/start-dfs.sh,此時就能夠成功啟動

強烈注意bin/hdfs namenode -format格式化檔案系統命令,如果你是初次搭建,可以用此方法暴力解決,但是如果已經使用了 Hadoop 一段時間,HDFS 存在重要資料,則需要另找它法。

OK,後面將會講解 Hadoop 的重要組成部分以及相關知識

相關文章