以這篇文章開啟大資料開發系列教程更新,本人也是努力學習中
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
組成,當有多臺物理機時,NameNode
與 DataNode
是分佈在不同的物理機上,部署則需要 NameNode
能夠直接與 DataNode
進行通訊,通訊方式之一就是使用 SSH (Secure Shell),所以需要在之間設定免密登入
因為本次是 Hadoop 偽分散式搭建,本機同時充當 NameNode
與 DataNode
角色,所以只需要配置一個本機的 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
複製程式碼
然後啟動 namenode
和 datanode
sbin/start-dfs.sh
複製程式碼
檢驗是否啟動成功,執行 jps
,如果顯示:
3644 SecondaryNameNode
3341 NameNode
3450 DataNode
4141 Jps
複製程式碼
則表示環境配置成功,如果少一個就表示啟動沒有成功,則需要檢查相應的日誌進行錯誤排查
3. 錯誤排查
NameNode
、SecondaryNameNode
以及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 時,有 log4j
的 warning
警告資訊
解決方法:vim etc/hadoop/log4j.properties
,然後新增 log4j.logger.org.apache.hadoop.util.NativeCodeLoader=ERROR
注意:此方法只是修改了
log4j
的活躍等級,並不是解決了warning
的根源,屬於治標不治本
(3) 執行 jps
後,只啟動了 NameNode
與 SecondaryNameNode
,沒有啟動 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 的重要組成部分以及相關知識