實驗條件:3台centos服務器,jdk版本1.8.0,Hadoop 版本2.8.0
注:hadoop安裝和搭建過程中都是在用戶lb的home目錄下,master的主機名為host98,slave的主機名分別是host99和host101。
1. ssh遠程連接服務器
ssh [username]@hostname
2. 創建新用戶並創建用戶的home主目錄
useradd -d /home/lb lb -m
3. 將當前用戶加入sudo用戶組中,方便在不修改當前用戶組權限的情況下,對某些文件和目錄做修改
vi /etc/sudoers
在 root ALL = (ALL) ALL 下添加一行 lb ALL = (ALL) ALL
4. 下載jdk並配置環境變量
1. 用sudo權限創建存放目錄
sudo mkdir /etc/java
2. 用curl命令從官網下載最新的jdk
curl -L "http://download.oracle.com/otn-pub/java/jdk/8u131-b11/d54c1d3a095b4ff2b6607d096fa80163/jdk-8u131-linux-x64.tar.gz" -H "Cookie: oraclelicense=accept-securebackup-cookie" -H "Connection: keep-alive" -O
從瀏覽器上得到的下載鏈接並不是最終的壓縮包位置,在這其中經過了3次重定向,所有使用-L參數可以自動對鏈接進行重定向,第一個-H命令傳遞了同意證書的cookie,第二個-H命令保持連接的穩定,否則下載速度可能很慢。-O命令才能下載文件,否則只是將內容輸出到控制台。
3. 將壓縮包解壓到當前目錄下
sudo tar -zxvf jdk-8u131-linux-x64.tar.gz
4. 配置環境變量
#set Java Environment
export JAVA_HOME=/usr/java/jdk1.8.0
export CLASSPATH=".:$JAVA_HOME/lib:$CLASSPATH"
export PATH="$JAVA_HOME/bin:$PATH"
export JRE_HOME=$JAVA_HOME/jre
修改完成后,在命令行執行source /etc/profile命令使文件生效。使用java -version可察看當前java版本。
5. 手動設置系統默認JDK(不知是否必要)
sudo update-alternatives --install /usr/bin/java java /usr/lib/jvm/jdk/bin/java 300
sudo update-alternatives --install /usr/bin/javac javac /usr/lib/jvm/jdk/bin/javac 300
sudo update-alternatives --config java
5. 在CentOS上安裝openssh服務並配置免密鑰登陸
1. 安裝openssh服務
yum install openssh
yum install openssh-server
yum install openssh-clients
對應的刪除命令將install改為remove。
2. 修改 sshd_config 配置文件
vi /etc/ssh/sshd_config 啟用以下三行
RSAAuthentication yes
PubkeyAuthentication yes
AuthorizedKeysFile
保存並退出,使用 service sshd start 啟用ssh服務。
3. 設置當前用戶免密鑰登陸
進入用戶主目錄應該存在 .ssh 子目錄,否則創建。
執行 ssh-keygen -t rsa -P '' -f ~/.ssh/id_rsa 在 ~/.ssh 子目錄下生成公鑰和私鑰文件。ssh-keygen 代表生成密鑰;-t 表示指定生成的密鑰類型,rsa 和 dsa 均可;-P 用於提供密語,為空;-f 指定生成的密鑰文件。
cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys 將用於認證的公鑰加到保存的公鑰文件中,密鑰和公鑰就像是鑰匙和鎖的關系,公鑰加入到在被連接的主機的authorized_keys文件中,私鑰自己保存。
注意修改 authorized_keys 文件和 .ssh 子目錄的訪問權限,很重要!
chmod 600 ~/.ssh/authorized_keys
chmod 700 ~/.ssh
完成以上操作后就可以通過 ssh localhost 完成本機的無密鑰訪問。
6. 安裝並配置hadoop
1. 下載並解壓hadoop
通過 http://www.apache.org/dyn/closer.cgi/hadoop/common/hadoop-2.8.0/hadoop-2.8.0.tar.gz 在本機上下載hadoop壓縮文件后,使用scp命令進行遠程拷貝到服務器。
scp /Users/hope/Downloads/hadoop-2.8.0.tar.gz lb@10.3.242.98:/home/lb
將本地路徑下的 hadoop-2.8.0.tar.gz 拷貝到遠程服務器 [[用戶名 @ ] 主機地址 : 路徑
tar -zxvf hadoop-2.8.0.tar.gz 進行解壓
2. 偽分布 Hadoop 配置
可以把偽分布式的Hadoop看作是只有一個節點的集群,在這個集群中,這個節點既是Master,也是Slave;既是Namenode,也是DataNode;既是JobTracker,也是TaskTracker。
需要修改hadoop安裝目錄下 ./etc/hadoop 中的配置文件。
1. 指定 jdk 的安裝位置
修改 hadoop-env.sh 文件,加上 export JAVA_HOME=/usr/java/java1.8.0 為jdk的安裝路徑。
2. 配置 HDFS 的地址及端口號
修改 hadoop 核心的配置文件 core-site.xml :
<configuration>
<property>
<name>fs.default.name</name>
<value>hdfs://localhost:9000</value>
</property>
</configuration>
上述配置增加了property,這樣就可以通過指定的web訪問hdfs的地址。
3. 配置 HDFS 的具體屬性
修改 hdfs-site.xml 文件:
<configuration>
<property>
<name>dfs.replication</name>
<value>1</value>
</property>
</configuration>
原本每個數據塊默認的備份數為3,在單機版的hadoop中,需要將其改為1。
4. 配置 MapReduce 的相關信息
修改 mapred-site.xml 文件:
<configuration>
<property>
<name>mapred.job.tracker</name>
<value>localhost:9001</value>
</property>
</configuration>
5. 格式化 hadoop 的文件系統 HDFS
進入 hadoop 安裝目錄下的二進制可執行文件夾,執行格式化文件
bin/hadoop namenode -format

返回結果如上圖所示,Exiting with status 0 表示格式化成功,如果是1的話代表存在錯誤。倒數第五行也有說 successfully formatted 。
6. 啟動 NameNode 和 DataNode
跟啟動有關的可執行二進制文件都在hadoop安裝目錄的sbin子目錄下。
sbin/hadoop-daemon.sh start namenode 用於啟動namenode
sbin/hadoop-daemon.sh start datanode 用於啟動datanode
用 jps 命令可以察看這兩種進程的啟動情況。
然后就可以用 Web 瀏覽器察看dfs的情況了,默認端口是50070。如果是本機訪問,就是 http://localhost:50070;如果通過公網訪問,就是 http://ip地址:50070。
7. 啟動 hadoop
sbin/start-all.sh 命令可用於啟動整個hadoop服務
3. hadoop 集群的配置
1. hadoop 集群的配置至少需要三台 Linux 服務器,首先給集群中的每台機器分配角色
10.3.242.98-master, namenode, jobtracker-host98(主機名)
10.3.242.99-slave, datanode, tasktracker-host99(主機名)
10.3.242.103-slave, datanode, tasktracker-host101(主機名)
2. 在三台主機上創建相同的用戶 lb (這是 hadoop 的基本要求),普通用戶即可,加入 sudoer 用戶組
3. 安裝 jdk ,配置環境變量
4. 修改 /etc/hosts 文件,用於定義局域網內主機名與IP地址的映射關系,可以通過主機名進行遠程連接
127.0.0.1 localhost
10.3.242.98 host98
10.3.242.99 host99
10.3.242.101 host101
5. 安裝ssh,配置不用主機間的免密鑰登陸
在重新安裝ssh后,一定要記得修改/etc/ssh/sshd_config文件,使用service sshd start命令啟動服務。否則中斷當前連接后可能無法使用ssh重新連接服務器。
比如要從host98主機免密鑰登陸host99,就將host98主機生成的公鑰加入到host99的authorized_keys文件中:
scp lb@host98:~/.ssh/is_rsa.pub lb@host99:~/.ssh/host99_rsa.pub
在host98主機下, cat ~/.ssh/host99_rsa.pub >> ~/.ssh/authorized_keys 即可。
對三台主機兩兩執行上述操作,使得每兩台主機間都可以實現免密鑰登陸。因為有可能 jobtracker 不是 master。
6. 配置三台主機的hadoop配置文件
1. etc/hadoop/hadoop-env.sh
export JAVA_HOME=/usr/java/jdk1.8.0 加上java的環境變量
2. etc/hadoop/core-site.xml
<configuration>
<property>
<name>fs.default.name</name>
<value>hdfs://host98:9000</value>
</property>
<property>
<name>hadoop.tmp.dir</name>
<value>/tmp</value>
</property>
</configuration>
第一個資源聲明的是訪問hdfs的web瀏覽器地址,host98是master主機名,也可以用ip地址替換。
第二個資源聲明的是在格式化分布式文件系統時所產生的臨時文件的存儲地址,有時不能重新格式化文件系統是因為臨時文件夾下有同名文件,需要將文件夾清空后才可以正常格式化。(通過報錯信息可以知道)
3. etc/hadoop/hdfs-site.xml
<configuration>
<property>
<name>dfs.replication</name>
<value>2</value>
</property>
</configuration>
聲明數據塊的備份個數
4. etc/hadoop/mapred.site.xml.template
<configuration>
<property>
<name>mapred.job.tracker</name>
<value>host98:9001</value>
</property>
</configurantion>
聲明jobtracker節點,為master主機host98,端口為9001
5. etc/hadoop/slaves
在slaves文件中添加作為slave的主機名
host99
host101
7. 啟動hadoop服務(均是在主機host98執行命令,會自動調用slave節點完成相應操作)
1. 格式化hdfs系統
bin/hadoop namenode -format
會完成hdfs文件系統的格式化,在臨時文件的文件夾下會生成很多臨時文件,在下一次格式化之前,一定要把這些臨時文件夾清空,否則會格式化失敗。
2. 啟動dfs服務
sbin/start-dfs.sh
會在master主機運行namenode進程,在所有的datanode節點運行datanode進程。
在啟動服務的過程中,出現了部分slave節點沒有運行datanode進程的情況,在slave節點單獨開啟datanode服務會出現問題的反饋,原因是由於其他進程占用了50010端口。解決的方式有兩種:1. 結束原本占用50010端口的進程;2. 更改datanode的端口。
使用 netstat -a -t --numeric-ports -p 命令察看正在占用50010端口的進程號,使用kill 進程號殺死該進程后重新啟動dfs服務,所有的slave節點都啟動了datanode進程。
3. 啟動yarn服務
sbin/start-yarn.sh
新版的hadoop2.*不存在 jobtracker 進程和 tasktarcker 進程,取而代之的是 sourcemanager 和 nodemanager。
在這個過程中出現了slave節點成功運行 nodemanager 進程,但是master節點沒有運行 sourcemanager 進程,出現問題的原因不會在終端界面顯示,需要自己去察看 logs 子目錄中的日志記錄。顯示如下:
NodeStatusUpdaterImpl failed in state STARTED; cause: org.apache.hadoop.yarn.exceptions.YarnRuntimeException: java.net.ConnectException: Call From host99/10.3.242.99 to 0.0.0.0:8031 failed on connection exception: java.net.ConnectException: Connection refused; For more details see: http://wiki.apache.org/hadoop/ConnectionRefused
可以看到問題與之前的一樣,是8031端口被占用,使用同樣的方法查找占用8031端口的進程號后殺死進程,重新啟動服務后成功。
4. 成功的標識
host98主機(master):
[lb@host98 ~]$jps
5904 ResourceManager
21028 SecondaryNameNode
20743 NameNode
1225 Jps
host99和host101主機(slave):
[lb@host99 ~]$jps
11316 Jps
12568 DataNode
11117 NodeManager
至此,在服務器上從 添加用戶 到 安裝jdk並配置環境變量 到 安裝並配置ssh免密鑰登陸 到 安裝配置hadoop單機模式、偽分布模式和集群模式的所有過程 均已有所呈現。
