注:該教程轉自廈門大學大數據課程學習總結
裝好了 Ubuntu 系統之后,在安裝 Hadoop 前還需要做一些必備工作。
創建hadoop用戶
如果你安裝 Ubuntu 的時候不是用的 “hadoop” 用戶,那么需要增加一個名為 hadoop 的用戶。
首先按 ctrl+alt+t 打開終端窗口,輸入如下命令創建新用戶 :
sudo useradd -m hadoop -s /bin/bash
這條命令創建了可以登陸的 hadoop 用戶,並使用 /bin/bash 作為 shell。
本文中會大量使用到sudo命令。sudo是ubuntu中一種權限管理機制,管理員可以授權給一些普通用戶去執行一些需要root權限執行的操作。當使用sudo命令時,就需要輸入您當前用戶的密碼.
在Linux的終端中輸入密碼,終端是不會顯示任何你當前輸入的密碼,也不會提示你已經輸入了多少字符密碼。而在windows系統中,輸入密碼一般都會以“*”表示你輸入的密碼字符
接着使用如下命令設置密碼,可簡單設置為 hadoop,按提示輸入兩次密碼:
sudo passwd hadoop
可為 hadoop 用戶增加管理員權限,方便部署,避免一些對新手來說比較棘手的權限問題:
sudo adduser hadoop sudo
更新apt
用 hadoop 用戶登錄后,我們先更新一下 apt,后續我們使用 apt 安裝軟件,如果沒更新可能有一些軟件安裝不了。按 ctrl+alt+t 打開終端窗口,執行如下命令:
sudo apt-get update
后續需要更改一些配置文件,我比較喜歡用的是 vim(vi增強版,基本用法相同)
sudo apt-get install vim
安裝SSH、配置SSH無密碼登陸
集群、單節點模式都需要用到 SSH 登陸(類似於遠程登陸,你可以登錄某台 Linux 主機,並且在上面運行命令),Ubuntu 默認已安裝了 SSH client,此外還需要安裝 SSH server:
sudo apt-get install openssh-server
安裝后,配置SSH無密碼登陸
利用 ssh-keygen 生成密鑰,並將密鑰加入到授權中:
exit # 退出剛才的 ssh localhost
cd ~/.ssh/ # 若沒有該目錄,請先執行一次ssh localhost
ssh-keygen -t rsa # 會有提示,都按回車就可以
cat ./id_rsa.pub >> ./authorized_keys # 加入授權
此時再用 ssh localhost
命令,無需輸入密碼就可以直接登陸了。
安裝Java環境
需要按照下面步驟來自己手動安裝JDK1.8。
我們已經把JDK1.8的安裝包jdk-8u162-linux-x64.tar.gz放在了百度雲盤,可以點擊這里到百度雲盤下載JDK1.8安裝包(提取碼:gx0b)。請把壓縮格式的文件jdk-8u162-linux-x64.tar.gz下載到本地電腦,假設保存在“/home/linziyu/Downloads/”目錄下。
在Linux命令行界面中,執行如下Shell命令(注意:當前登錄用戶名是hadoop):
- cd /usr/lib
- sudo mkdir jvm #創建/usr/lib/jvm目錄用來存放JDK文件
- cd ~ #進入hadoop用戶的主目錄
- cd Downloads #注意區分大小寫字母,剛才已經通過FTP軟件把JDK安裝包jdk-8u162-linux-x64.tar.gz上傳到該目錄下
- sudo tar -zxvf ./jdk-8u162-linux-x64.tar.gz -C /usr/lib/jvm #把JDK文件解壓到/usr/lib/jvm目錄下
JDK文件解壓縮以后,可以執行如下命令到/usr/lib/jvm目錄查看一下:
- cd /usr/lib/jvm
- ls
可以看到,在/usr/lib/jvm目錄下有個jdk1.8.0_162目錄。
下面繼續執行如下命令,設置環境變量:
- cd ~
- vim ~/.bashrc
上面命令使用vim編輯器打開了hadoop這個用戶的環境變量配置文件,請在這個文件的開頭位置,添加如下幾行內容:
export JAVA_HOME=/usr/lib/jvm/jdk1.8.0_162 export JRE_HOME=${JAVA_HOME}/jre export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib export PATH=${JAVA_HOME}/bin:$PATH
保存.bashrc文件並退出vim編輯器。然后,繼續執行如下命令讓.bashrc文件的配置立即生效:
- source ~/.bashrc
這時,可以使用如下命令查看是否安裝成功:
- java -version
如果能夠在屏幕上返回如下信息,則說明安裝成功:
hadoop@ubuntu:~$ java -version
java version "1.8.0_162"
Java(TM) SE Runtime Environment (build 1.8.0_162-b12)
Java HotSpot(TM) 64-Bit Server VM (build 25.162-b12, mixed mode)
至此,就成功安裝了Java環境。下面就可以進入Hadoop的安裝。
安裝 Hadoop 2
Hadoop 2 可以通過 http://mirror.bit.edu.cn/apache/hadoop/common/ 或者 http://mirrors.cnnic.cn/apache/hadoop/common/ 下載,一般選擇下載最新的穩定版本,即下載 “stable” 下的 hadoop-2.x.y.tar.gz 這個格式的文件,這是編譯好的,另一個包含 src 的則是 Hadoop 源代碼,需要進行編譯才可使用。
我們選擇將 Hadoop 安裝至 /usr/local/ 中:
- sudo tar -zxf ~/下載/hadoop-2.6.0.tar.gz -C /usr/local # 解壓到/usr/local中
- cd /usr/local/
- sudo mv ./hadoop-2.6.0/ ./hadoop # 將文件夾名改為hadoop
- sudo chown -R hadoop ./hadoop # 修改文件權限
Hadoop 解壓后即可使用。輸入如下命令來檢查 Hadoop 是否可用,成功則會顯示 Hadoop 版本信息:
- cd /usr/local/hadoop
- ./bin/hadoop version
Hadoop偽分布式配置
Hadoop 可以在單節點上以偽分布式的方式運行,Hadoop 進程以分離的 Java 進程來運行,節點既作為 NameNode 也作為 DataNode,同時,讀取的是 HDFS 中的文件。
Hadoop 的配置文件位於 /usr/local/hadoop/etc/hadoop/ 中,偽分布式需要修改2個配置文件 core-site.xml 和 hdfs-site.xml 。Hadoop的配置文件是 xml 格式,每個配置以聲明 property 的 name 和 value 的方式來實現。
修改配置文件 core-site.xml (通過 gedit 編輯會比較方便: gedit ./etc/hadoop/core-site.xml
),將當中的
- <configuration>
- </configuration>
修改為下面配置:
- <configuration>
- <property>
- <name>hadoop.tmp.dir</name>
- <value>file:/usr/local/hadoop/tmp</value>
- <description>Abase for other temporary directories.</description>
- </property>
- <property>
- <name>fs.defaultFS</name>
- <value>hdfs://localhost:9000</value>
- </property>
- </configuration>
同樣的,修改配置文件 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 的運行方式是由配置文件決定的(運行 Hadoop 時會讀取配置文件),因此如果需要從偽分布式模式切換回非分布式模式,需要刪除 core-site.xml 中的配置項。
此外,偽分布式雖然只需要配置 fs.defaultFS 和 dfs.replication 就可以運行(官方教程如此),不過若沒有配置 hadoop.tmp.dir 參數,則默認使用的臨時目錄為 /tmp/hadoo-hadoop,而這個目錄在重啟時有可能被系統清理掉,導致必須重新執行 format 才行。所以我們進行了設置,同時也指定 dfs.namenode.name.dir 和 dfs.datanode.data.dir,否則在接下來的步驟中可能會出錯。
配置完成后,執行 NameNode 的格式化:
- ./bin/hdfs namenode -format
成功的話,會看到 “successfully formatted” 和 “Exitting with status 0” 的提示,若為 “Exitting with status 1” 則是出錯。
接着開啟 NameNode 和 DataNode 守護進程。
- ./sbin/start-dfs.sh #start-dfs.sh是個完整的可執行文件,中間沒有空格
啟動時可能會出現如下 WARN 提示:WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform… using builtin-java classes where applicable WARN 提示可以忽略,並不會影響正常使用。
如果啟動 Hadoop 時遇到輸出非常多“ssh: Could not resolve hostname xxx”的異常情況,如下圖所示:
啟動Hadoop時的異常提示
這個並不是 ssh 的問題,可通過設置 Hadoop 環境變量來解決。首先按鍵盤的 ctrl + c中斷啟動,然后在 ~/.bashrc 中,增加如下兩行內容(設置過程與 JAVA_HOME 變量一樣,其中 HADOOP_HOME 為 Hadoop 的安裝目錄):
- export HADOOP_HOME=/usr/local/hadoop
- export HADOOP_COMMON_LIB_NATIVE_DIR=$HADOOP_HOME/lib/native
保存后,務必執行 source ~/.bashrc
使變量設置生效,然后再次執行 ./sbin/start-dfs.sh
啟動 Hadoop。
啟動完成后,可以通過命令 jps
來判斷是否成功啟動,若成功啟動則會列出如下進程: “NameNode”、”DataNode” 和 “SecondaryNameNode”(如果 SecondaryNameNode 沒有啟動,請運行 sbin/stop-dfs.sh 關閉進程,然后再次嘗試啟動嘗試)。如果沒有 NameNode 或 DataNode ,那就是配置不成功,請仔細檢查之前步驟,或通過查看啟動日志排查原因。
一般可以查看啟動日志來排查原因,注意幾點:
- 啟動時會提示形如 “DBLab-XMU: starting namenode, logging to /usr/local/hadoop/logs/hadoop-hadoop-namenode-DBLab-XMU.out”,其中 DBLab-XMU 對應你的機器名,但其實啟動日志信息是記錄在 /usr/local/hadoop/logs/hadoop-hadoop-namenode-DBLab-XMU.log 中,所以應該查看這個后綴為 .log 的文件;
- 每一次的啟動日志都是追加在日志文件之后,所以得拉到最后面看,對比下記錄的時間就知道了。
- 一般出錯的提示在最后面,通常是寫着 Fatal、Error、Warning 或者 Java Exception 的地方。
- 可以在網上搜索一下出錯信息,看能否找到一些相關的解決方法。
此外,若是 DataNode 沒有啟動,可嘗試如下的方法(注意這會刪除 HDFS 中原有的所有數據,如果原有的數據很重要請不要這樣做):
- # 針對 DataNode 沒法啟動的解決方法
- ./sbin/stop-dfs.sh # 關閉
- rm -r ./tmp # 刪除 tmp 文件,注意這會刪除 HDFS 中原有的所有數據
- ./bin/hdfs namenode -format # 重新格式化 NameNode
- ./sbin/start-dfs.sh # 重啟
成功啟動后,可以訪問 Web 界面 http://localhost:50070 查看 NameNode 和 Datanode 信息,還可以在線查看 HDFS 中的文件。
附加教程: 配置PATH環境變量
在這里額外講一下 PATH 這個環境變量(可執行 echo $PATH
查看,當中包含了多個目錄)。例如我們在主文件夾 ~ 中執行 ls
這個命令時,實際執行的是 /bin/ls
這個程序,而不是 ~/ls
這個程序。系統是根據 PATH 這個環境變量中包含的目錄位置,逐一進行查找,直至在這些目錄位置下找到匹配的程序(若沒有匹配的則提示該命令不存在)。
上面的教程中,我們都是先進入到 /usr/local/hadoop 目錄中,再執行 sbin/hadoop
,實際上等同於運行 /usr/local/hadoop/sbin/hadoop
。我們可以將 Hadoop 命令的相關目錄加入到 PATH 環境變量中,這樣就可以直接通過 start-dfs.sh
開啟 Hadoop,也可以直接通過 hdfs
訪問 HDFS 的內容,方便平時的操作。
同樣我們選擇在 ~/.bashrc 中進行設置(vim ~/.bashrc
,與 JAVA_HOME 的設置相似),在文件最前面加入如下單獨一行:
export PATH=$PATH:/usr/local/hadoop/sbin:/usr/local/hadoop/bin
添加后執行 source ~/.bashrc
使設置生效,生效后,在任意目錄中,都可以直接使用 hdfs
等命令了。
注:安裝的Hadoop版本和JDK版本最好先查一下是否適配,JDK版本太高或太低可能會造成莫名其妙的問題。