hadoop百度百科:https://baike.baidu.com/item/Hadoop/3526507?fr=aladdin
hadoop官網:http://hadoop.apache.org/
本文結構如下:
- 安裝hadoop前的准備工作
1.1 創建新用戶
1.2 更新APT
1.3 安裝SSH
1.4 安裝Java環境
2.安裝和配置hadoop
2.1 hadoop下載
2.2 hadoop為分布式模式配置
3.問題總結
1.安裝hadoop前的准備工作
1.1創建hadoop用戶
為了方便以后的實驗進行,推薦創建一個新的hadoop用戶,所有實驗內容都登陸該用戶進行,具體的shell代碼和注釋如下:
sudo useradd -m hadoop -s /bin/bash #創建用戶hadoop,並使用/bin/bash作為Shell sudo passwd hadoop #設置hadoop的密碼 sudo adduser hadoop sudo #為hadoop增加管理員權限
1.2更新APT
APT是一款軟件管理工具,Linux采用APT來安裝和管理各種軟件,安裝成功LInux系統以后,需要及時更新APT軟件,否則后續的一些軟件可能無法正常安裝,更新APT使用以下命令:
sudo apt-get update
1.3安裝SSH
SSH是Secure Shell的縮寫.....
為什么要安裝Hasoop之前要配置SSH呢? 這是因為Hadoop名稱節點(NameNode)需要啟用集群中所有機器的Hadoop守護進程,這個過程需要通過SSH登陸來實現。Hadoop並沒有提供SSH輸入密碼登陸的形式,因此,為了能夠順利登陸集群中的每台機器,需要將所有機器配置為“名稱節點可以無密碼登陸它們”
Ubuntu默認已經安裝了SSH客戶端,因此,只需要安裝SSH服務端,在終端中執行以下命令:
sudo apt-get install openssh-server
然后可以使用如下命令登陸本機(因為是偽分布式集群,只有一台機器,同時作為名稱節點和普通節點),如果提示輸入密碼,則表示安裝成功了:
ssh localhost
由於這樣登陸需要每次輸入密碼,所以,有必要配置SSH為無密碼登陸,這樣在Hadoop集群中,名稱節點(NameNode)要登陸某台機器就不需要人工輸入密碼了(實際上也不可能每次都人工輸入密碼),SSH免密登陸配置方法如下:
cd ~/.ssh/ #,切換目錄,若沒有該目錄,請先執行一次ssh localhost ssh-keygen -t rsa #會有提示,按enter即可(即不設置密碼),這條語句生成公鑰和私鑰兩個文件,補充ssh-keygen的基本用法:https://blog.csdn.net/qq_38570571/article/details/79268426 cat ./id_rsa.pub >> ./authorized_keys #加入授權,cat file1 >> file2 的含義是將file1的內容寫入到file2的尾部
然后再執行ssh localhost命令,無需輸入密碼就可以直接登陸了,如圖:
1.4 安裝Java環境
Hadoop是基於Java語言開發的,同時Java語言也可以用來編寫Hadoop應用程序,在Linux系統中安裝Java環境有兩種方式:Oracle的JDK或OpenJDK,本文采用第二中方式:
sudo apt-get install default-jre default-jdk #使用apt安裝jre和jdk
安裝完成后,編輯~/.bashrc,添加JAVA_HOME環境變量:
vim ~/.bashrc #編輯~/.bashrc
在.bashrc中添加如下單獨一行:
export JAVA_HOME=/usr/lib/jvm/defult-java
然后執行如下代碼,使環境變量立即生效:
source ~/.bashrc #使環境變量設置生效
檢驗一下是否設置正確:
echo $JAVA_HOME #打印$JAVA_HOME java --version #查看java版本
Java安裝成功后,就可以進行Hadoop的安裝了
2.安裝和配置Hadoop
2.1 Hadoop下載和安裝
Hadoop官網:http://hadoop.apache.org/,選擇合適的版本(本文采用Hadoop2.7.7)下載(可以在windows系統中下載后,用ftp軟件如filezilla上傳到ubuntu虛擬機,也可以在ubuntu中直接下載),本文使用filezilla上傳hadoop壓縮包到ubuntu的~/Downloads/目錄下,然后解壓縮到/usr/local/並重命名文件夾為hadoop,由於我們當前的用戶為hadoop,沒有usr/local的文件權限,所以還需要修改文件權限,執行命令如下:
sudo tar -zxf ~/Downloads/hadoop-2.7.7.tar.gz -C /usr/local #解壓縮 cd /usr/local/ sudo mv ./hadoop-2.7.7 ./hadoop #重命名文件 sudo chown -R hadoop ./hadoop #修改文件權限,即將./hadoop目錄下所有的文件的屬組都改成hadoop,也可以使用sudo chmod 777 ./hadoop
解壓成功后,就可以使用如下命令查看Hadoop的版本信息:
cd /usr/local/hadoop
./bin/hadoop version
2.2Hadoop模式配置
Hadoop的默認模式為本地模式(即單機模式),無須其他配置就可以運行,值得注意的是,Hadoop的模式變更(單機模式、偽分布式、分布式)完全是通過修改配置文件實現的,本文想要將Hadoop配置為偽分布式模式,即只有一個節點(一台機器),這個節點既作為名稱節點(NameNode),也作為數據節點(DataNode),偽分布式模式配置涉及兩個配置文件:hadoop目錄/etc/hadoop/下的core-site.xml和hdfs-site.xml,首先在core-site.xml文件中新增如下屬性:
<property> <name>hadoop.tmp.dir</name> <value>file:/usr/local/hadoop/tmp</value> #指定臨時目錄,如果不指定,會默認使用臨時目錄/tmp/hadoo-hadoop,這個文件在Hadoop重啟時可能被清除 <description>Abase for other trmporary directories</description> </property> <property> <name>fs.defaultFS</name> #指定HDFS的訪問地址 <value>hdfs://localhost:9000</value> </property>
然后在hdfs-site.xml中新增如下屬性:
<property> <name>dfs.replication</name> #指定副本數量 <value>1</value> </property> <property> <name>dfs.namenode.name.dir</name> #name節點的存儲位置 <value>file:/usr/local/hadoop/tmp/dfs/name</value> </property> <property> <name>dfs.datanode.data.dir</name> #data節點的存儲位置 <value>file:/usr/local/hadoop/tmp/dfs/data</value> </property>
上面兩個文件內涉及的屬性名稱和值得含義可以在Hadoop官網中查看:
http://hadoop.apache.org/docs/stable/hadoop-project-dist/hadoop-common/core-default.xml
和http://hadoop.apache.org/docs/stable/hadoop-project-dist/hadoop-hdfs/hdfs-default.xml
完成了配置文件的修改后,就可以執行名稱節點格式化(NameNode Format)了:
cd /usr/local/hadoop
./bin/hdfs namenode -format
如果格式化成功,會看到Exiting with status 0的提示
然后執行以下命令啟動Hadoop
cd /usr/local/hadoop
./sbin/start-dfs.sh
在終端中執行jps(查看所有java進程pid)判斷hadoop是否啟動成功:
jps
如果執行成功,就可以看到如下幾個進程:
至此,Hadoop偽分布式環境搭建成功
3.問題總結
1.DataNode沒有啟動
通過查閱資料https://blog.csdn.net/islotus/article/details/78357857,原因是:
當我們使用hadoop namenode -format格式化namenode時,會在namenode數據文件夾(這個文件夾為自己配置文件中dfs.name.dir的路徑)中保存一個current/VERSION文件,記錄clusterID,datanode中保存的current/VERSION文件中的clustreID的值是上一次格式化保存的clusterID,這樣就導致了datanode和namenode之間的ID不一致。
解決方法有兩種,一是刪除dfs文件(如果沒有重要數據),二是在dfs/name目錄下找到一個current/VERSION文件,記錄clusterID並復制。然后dfs/data目錄下找到一個current/VERSION文件,將其中clustreID的值替換成剛剛復制的clusterID的值即可
應該在每一次運行結束Hadoop后,都關閉Hadoop
2.一定要關注權限問題
因為Linux下對用戶權限有着嚴格的約束,用戶A只有權訪問/home/A/下的文件,用戶B只有權訪問/home/B/下的文件,如果A想要訪問B的文件fileB,那么就要賦權給A,具體的方法有很多種,本文在剛開始執行名稱節點格式化的過程中老是出錯,就是因為沒有注意權限問題。