注:本文檔參考官方文檔編寫,原文連接:http://hadoop.apache.org/docs/r2.6.0/hadoop-project-dist/hadoop-common/SingleCluster.htmlhtml
http://hadoop.apache.org/docs/r2.6.0/hadoop-project-dist/hadoop-common/ClusterSetup.htmljava
1.硬件環境
共有 3 臺機器,均使用的 linux 系統,Java 使用的是 jdk8.0。 配置以下:
hadoop1.example.com:172.20.115.1(NameNode)
hadoop2.example.com:172.20.115.2(DataNode)
hadoop3.example.com:172.20.115.3 (DataNode)
hadoop4.example.com:172.20.115.4
主機與IP之間有正確解析
node
2.目錄結構
linux
因爲 Hadoop 要求全部機器上 hadoop 的部署目錄結構要相同,而且都有一個相同的用戶名的賬戶。
我 的 三 臺 機 器 上 是 這 樣 的 : 都 有 一 個 hadoop 的 賬 戶 , 主 目 錄是/home/hadoop。
添加用戶hadoop
#useradd -u 800 hadoop
#passwd hadoop 給用戶hadoop建立密碼
下載hadoop-2.6.0.tar.gz
解壓 #tar zxf hadoop-2.6.0.tar.gz
#mv hadoop-2.6.0/ /home/hadoop/
#cd /home/hadoop
#ln -s hadoop-2.6.0/ hadoop
切到hadoop用戶 #su - hadoop
下載jdk-8u40-linux-x64.tar.gz
解壓到/home/hadoop/hadoop/下web
$tar zxvf jdk-8u40-linux-x64.tar.gz -C /home/hadoop/hadoop/apache
$cd hadoop-2.6.0/vim
建立軟連接,以便與往後的更新、升級
服務器
$ln -s jdk jdk1.8.0_40 jdk併發
再次切換到rootapp
#chown -R hadoop.hadoop hadoop-2.6.0/
3.SSH設置
在 Hadoop 啓動之後,Namenode 是經過 SSH(Secure Shell)來啓動和中止各個節點上的各類守護進程的,這就須要在節點之間執行指令的時候是不須要輸入密碼的方式,故咱們須要配置 SSH 使用無密碼公鑰認證的方式。
首先要保證每臺機器上都裝了 SSH 服務器,且都正常啓動。實際中咱們用的都是 OpenSSH,這是 SSH 協議的一個免費開源實現。
以本文中的 3 臺機器爲例,如今 hadoop1 是主節點,它須要主動發起 SSH鏈接到 hadoop2 ,對於 SSH 服務來講, hadoop1 就是 SSH 客戶端,而hadoop2,hadoop3 則是 SSH 服務端,所以在 hadoop2,hadoop3 上須要肯定 sshd 服務已經啓動。簡單的說,在 hadoop1 上須要生成一個密鑰對,即一個私鑰,一個公鑰。將公鑰拷貝到 hadoop2 上,這樣,好比當 hadoop1 向 hadoop2 發起 ssh 鏈接的時候,hadoop2 上就會生成一個隨機數並用 hadoop1 的公鑰對這個隨機數進行加密併發送給 hadoop1,hadoop1 收到這個加密的數之後用私鑰進行解密,並將解密後的數發送回hadoop2,hadoop2 確認解密的數無誤後就容許 hadoop1 進行鏈接了。這就完成了一次公鑰認證過程。
對於本文中的 3 臺機器,首先在 hadoop1 上生成密鑰對:
#su - hadoop
$ssh-keygen
這個命令將爲 hadoop1 上的用戶 hadoop 生成其密鑰對。生成的密鑰對id_rsa,id_rsa.pub,在/home/hadoop/.ssh 目錄下。
$ssh-copy-id localhost
$ssh-copy-id 172.20.115.2
$ssh-copy-id 172.20.115.3
發佈密鑰到你本地和hadoop二、hadoop3
試着登陸本地和hadoop二、hadoop3看是否有密碼驗證,無密碼即驗證成功
4.環境變量(此版本中的配置目錄發生很大變化,你們要注意哦!)
在 /home/hadoop/hadoop-2.6.0/etc/hadoop/ 目 錄 下 的 hadoop-env.sh 和yarn-env.sh中 設 置Hadoop 需 要 的 環 境 變 量 , 其 中 JAVA_HOME 是 必 須 設 定 的 變 量 。HADOOP_HOME 變量能夠設定也能夠不設定,若是不設定, HADOOP_HOME默認的是 bin 目錄的父目錄,即本文中的/home/hadoop/hadoop。
vim /home/hadoop/hadoop-2.6.0/etc/hadoop/hadoop-env.sh
export JAVA_HOME=/home/hadoop/hadoop/jdk(大概在第25行)
vim /home/hadoop/hadoop-2.6.0/etc/hadoop/yarn-env.sh
export JAVA_HOME=/home/hadoop/hadoop/jdk(大概在第23行)
先進行簡單測試:
$cd /home/hadoop/hadoop/
$mkdir input
$cp /etc/hadoop/* input/
$bin/hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.6.0.jar grep input output 'dfs[a-z.]+'
$cd output
$cat *
統計文件中的單詞:
$bin/hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.6.0.jar wordcount input test
$cd test/
$cat *
5.hadoop配置文件
$cd /home/hadoop/hadoop/etc/hadoop/
配置HDFS
/core-site.xml:
configuration> <property> <name>fs.default.name</name> <value>hdfs://hadoop1.example.com:9000</value> </property></configuration>
/hdfs-site.xml:
<configuration> <property> <name>dfs.replication</name> <value>1</value> </property></configuration>
僞分佈式測試:
$mkdir /home/hadoop/bin
$ln -s /home/hadoop/hadoop/jdk/bin/jps /home/hadoop/bin/
$cd /home/hadoop/hadoop/
$sbin/hdfs namenode -format 先進行初始化
$sbin/start-dfs.sh
The hadoop daemon log output is written to the $HADOOP_LOG_DIR directory (defaults to $HADOOP_HOME/logs).(寫入到日誌文件)
web測試http://172.20.115.1:50070/
$ bin/hdfs dfs -mkdir /user
$ bin/hdfs dfs -mkdir /user/<username>
$bin/hdfs dfs -put etc/hadoop input
$ bin/hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.6.0.jar grep input output 'dfs[a-z.]+'
$ bin/hdfs dfs -get output output
$ cat output/*
配置YARN
cd /home/hadoop/hadoop/
etc/hadoop/mapred-site.xml:
<configuration> <property> <name>mapreduce.framework.name</name> <value>yarn</value> </property> </configuration>
etc/hadoop/yarn-site.xml:
<configuration> <property> <name>yarn.nodemanager.aux-services</name> <value>mapreduce_shuffle</value> </property> </configuration>
Start ResourceManager daemon and NodeManager daemon:
$ sbin/start-yarn.sh
訪問:http://172.20.115.1:8088
若是達到這種效果就說明你已經成功部署僞分佈式
6.部署Hadoop集羣
前面講的這麼多 Hadoop 的環境變量和配置文件都是在 hadoop1 這臺機器上的,如今須要將 hadoop 部署到其餘的機器上,保證目錄結構一致。
$scp -r /home/hadoop/hadoop hadoop2.example.com:/home/hadoop/
$scp -r /home/hadoop/hadoop hadoop3.example.com:/home/hadoop/
$scp -r .ssh/ hadoop2.example.com:
$scp -r .ssh/ hadoop3.example.com:
注意還要修改如下文件:
$cd /home/hadoop/hadoop/etc/hadoop
/masters
hadoop1.example.com
/slaves
hadoop2.example.com
hadoop3.example.com
$ln -s hadoop-1.2.1/ hadoop
$mkdir /home/hadoop/bin
$ln -s /home/hadoop/hadoop/jdk/bin/jps /home/hadoop/bin
至此,能夠說,Hadoop 已經在各個機器上部署完畢了,下面就讓咱們開始啓動 Hadoop 吧。
7. 啓動 Hadoop
啓動以前,咱們先要格式化 namenode,先進入~/hadoop/目錄,執行下面的命令:
$bin/hadoop namenode –format
不出意外,應該會提示格式化成功。若是不成功,就去 hadoop/logs/目錄下去查看日誌文件。
下面就該正式啓動 hadoop 啦,在 sbin/下面有不少啓動腳本,能夠根據本身的須要來啓動。
* start-all.sh 啓動全部的 Hadoop 守護
* stop-all.sh 中止全部的 Hadoop
* start-yarn.sh 啓動 YARN進程
* stop-yarn.sh 中止YARN進程
* start-dfs.sh 啓動 Hadoop DFS 守護
* stop-dfs.sh 中止 DFS 守護
在這裏,簡單啓動全部守護:
[hadoop@hadoop1:hadoop]$sbin/start-all.sh
Starting namenodes on [hadoop1.example.com]
hadoop1.example.com: starting namenode, logging to /home/hadoop/hadoop-2.6.0/logs/hadoop-hadoop-namenode-desktop3.example.com.out
localhost: starting datanode, logging to /home/hadoop/hadoop-2.6.0/logs/hadoop-hadoop-datanode-desktop3.example.com.out
Starting secondary namenodes [0.0.0.0]
0.0.0.0: starting secondarynamenode, logging to /home/hadoop/hadoop-2.6.0/logs/hadoop-hadoop-secondarynamenode-desktop3.example.com.out
15/03/28 08:41:10 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
starting yarn daemons
starting resourcemanager, logging to /home/hadoop/hadoop-2.6.0/logs/yarn-hadoop-resourcemanager-desktop3.example.com.out
能夠發現全部進程成功啓動,並寫入日誌文件。
$jps
查看Jps,NameNode,DataNode,SecondaryNameNode,ResourceManager,NodeManager是否啓動成功。
一樣,若是要中止 hadoop,則
[hadoop@hadoop1:hadoop]$sbin/stop-all.sh
8. HDFS 操做
運行 sbin/目錄的 hadoop 命令,能夠查看 Haoop 全部支持的操做及其用法,這裏以幾個簡單的操做爲例。
創建目錄:
[hadoop@hadoop1 hadoop]$sbin/hadoop dfs -mkdir testdir
在 HDFS 中創建一個名爲 testdir 的目錄,複製文件:
[hadoop@hadoop1 hadoop]$sbin/hadoop dfs -put /home/large.zip testfile.zip
把本地文件large.zip拷貝到HDFS的根目錄下,文件名爲testfile.zip,查看現有文件:
[hadoop@hadoop1 hadoop]$sbin/hadoop dfs -ls
hadoop web控制檯頁面的端口整理:
50070:hdfs文件管理
8088:ResourceManager
8042:NodeManager
19888:JobHistory(使用「mr-jobhistory-daemon.sh」來啓動JobHistory Server)
( 博客中免不了會有瑕疵和紕漏,請各位看官指正) --@leeypp.foxmail.com