詳細解析 hadoop 分佈式部署(轉載至lee_ypp的博客)

詳細解析 hadoop 分佈式部署

對於 Hadoop 來講,在 HDFS 看來,節點分爲 Namenode 和 Datanode,其中Namenode 只有一個, Datanode 能夠是不少;在 MapReduce 看來,節點又分爲Jobtracker 和 Tasktracker,其中 Jobtracker 只有一個,Tasktracker 能夠是不少。我是將 namenode 和 jobtracker 部署在 hadoop1 上, hadoop2, hadoop3 做爲 datanode和 tasktracker 。node

1.硬件環境
安全

共有 3 臺機器,均使用的 linux 系統,Java 使用的是 jdk1.6.0。 配置以下:服務器

hadoop1.example.com:192.168.2.1(NameNode)網絡

hadoop2.example.com:192.168.2.2(DataNode)併發

hadoop3.example.com:192.168.2.3 (DataNode)ssh

hadoop4.example.com:192.168.2.4

主機與IP之間有正確解析

對於 Hadoop 來講,在 HDFS 看來,節點分爲 Namenode 和 Datanode,其中Namenode 只有一個, Datanode 能夠是不少;在 MapReduce 看來,節點又分爲Jobtracker 和 Tasktracker,其中 Jobtracker 只有一個,Tasktracker 能夠是不少。我是將 namenode 和 jobtracker 部署在 hadoop1 上, hadoop2, hadoop3 做爲 datanode和 tasktracker 。固然你也能夠將 namenode ,datanode ,jobtracker,tasktracker 所有部署在一臺機器上(這樣就是僞分佈式)。

2.目錄結構

因爲 Hadoop 要求全部機器上 hadoop 的部署目錄結構要相同,而且都有一個相同的用戶名的賬戶。

我 的 三 臺 機 器 上 是 這 樣 的 : 都 有 一 個 hadoop 的 賬 戶 , 主 目 錄是/home/hadoop。

添加用戶hadoop

#userad -u 800 hadoop

下載hadop-1.2.1.tar.gz

解壓    #tar zxf hadop-1.2.1.tar.gz

#ln -s hadoop-1.2.1 hadoop  #mv hadoop-1.2.1 /home/hadoop/  #cd /home/hadoop  #chown -R hadoop.hadoop hadoop-1.2.1/  #passwd hadoop 給用戶hadoop建立密碼

下載jdk-6u32-linux-x64.bin

sh jdk-6u32-linux-x64.bin   cd ~  mv jdk1.6.0_32 hadoop-1.2.1/   cd hadoop-1.2.1/

建立軟連接,以便與往後的更新、升級

ln -s jdk jdk1.6.0_32

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 192.168.2.2   $ssh-copy-id 192.168.2.3

發佈密鑰到你本地和hadoop二、hadoop3

試着登陸本地和hadoop二、hadoop3看是否有密碼驗證,無密碼即驗證成功

下載jdk-6u32-linux-x64.bin

sh jdk-6u32-linux-x64.bin   cd ~  mv jdk1.6.0_32 hadoop-1.2.1/   cd hadoop-1.2.1/

建立軟連接

ln -s jdk jdk1.6.0_32

4.環境變量

在 ~/hadoop-1.2.1/conf/ 目 錄 下 的 hadoop-env.sh 中 設 置Hadoop 需 要 的 環 境 變 量 , 其 中 JAVA_HOME 是 必 須 設 定 的 變 量 。HADOOP_HOME 變量能夠設定也能夠不設定,若是不設定, HADOOP_HOME默認的是 bin 目錄的父目錄,即本文中的/home/hadoop/hadoop。

vim~/hadoop-1.2.1/conf/hadoop-env.sh

export JAVA_HOME=/home/hadoop/hadoop/jdk

先進行簡單測試:

$cd  /home/hadoop/hadoop/   $mkdir input   $cp conf/* input/   $bin/hadoop jar hadoop-examples-1.2.1.jar   $bin/hadoop jar hadoop-examples-1.2.1.jar grep input output 'dfs[a-z.]+'   $cd output   $cat *

統計文件中的單詞:

$bin/hadoop jar hadoop-examples-1.2.1.jar   $bin/hadoop jar hadoop-examples-1.2.1.jar wordcount input test   $cd test/   $cat *

5.hadoop配置文件

$cd /home/hadoop/hadoop/conf

conf/core-site.xml:

<configuration>
     <property>
         <name>fs.default.name</name>
         <value>hdfs://hadoop1.example.com:9000</value>
     </property></configuration>

conf/hdfs-site.xml:

<configuration>
     <property>
         <name>dfs.replication</name>
         <value>2</value>
     </property></configuration>

conf/mapred-site.xml:

<configuration>
     <property>
         <name>mapred.job.tracker</name>
         <value>hadoop1.example.com:9001</value>
     </property></configuration>

僞分佈式測試:

$mkdir ~/bin

$ln -s /home/hadoop/hadoop/jdk/bin/jps ~/bin/

$cd /home/hadoop/hadoop/

$bin/hadoop namenode -format  先進行初始化

$bin/start-all.sh

web測試192.168.2.1:50070

192.168.2.1:50030

$rm -fr input/ output/ test/

$bin/hadoop fs -mkdir input

$bin/hadoop fs -put conf input

$bin/hadoop fs -lsr

192.168.2.1:50075下查看/usr/hadoop/input是否有變化

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:

$scp -r .ssh/ hadoop3:

注意還要修改如下文件:

$cd /home/hadoop/hadoop/conf

conf/masters

hadoop1.example.com

conf/slaves

hadoop2.example.com
hadoop3.example.com

$ln -s hadoop-1.2.1/ hadoop

$mkdir ~/bin

$ln -s ~/hadoop/jdk/bin/jps ~/bin

至此,能夠說,Hadoop 已經在各個機器上部署完畢了,下面就讓咱們開始啓動 Hadoop 吧。

7. 啓動 Hadoop

啓動以前,咱們先要格式化 namenode,先進入~/hadoop/目錄,執行下面的命令:

$bin/hadoop namenode –format

不出意外,應該會提示格式化成功。若是不成功,就去 hadoop/logs/目錄下去查看日誌文件。

下面就該正式啓動 hadoop 啦,在 bin/下面有不少啓動腳本,能夠根據本身的須要來啓動。

* start-all.sh 啓動全部的 Hadoop 守護。包括 namenode, datanode, jobtracker,tasktrack

* stop-all.sh 中止全部的 Hadoop

* start-mapred.sh 啓動 Map/Reduce 守護。包括 Jobtracker 和 Tasktrack

* stop-mapred.sh 中止 Map/Reduce 守護

* start-dfs.sh 啓動 Hadoop DFS 守護.Namenode 和 Datanode

* stop-dfs.sh 中止 DFS 守護

在這裏,簡單啓動全部守護:

[hadoop@hadoop1:hadoop]$bin/start-all.sh  $jps

查看JobTracker,Jps,SecondaryNameNode,NameNode是否啓動成功。

一樣,若是要中止 hadoop,則

[hadoop@hadoop1:hadoop]$bin/stop-all.sh

8. HDFS 操做

運行 bin/目錄的 hadoop 命令,能夠查看 Haoop 全部支持的操做及其用法,這裏以幾個簡單的操做爲例。

創建目錄:

[hadoop@hadoop1 hadoop]$bin/hadoop dfs -mkdir testdir

在 HDFS 中創建一個名爲 testdir 的目錄,複製文件:

[hadoop@hadoop1 hadoop]$bin/hadoop dfs -put /home/large.zip testfile.zip

把 本 地 文 件 large.zip 拷 貝 到 HDFS 的 根 目 錄 /user/hadoop/ 下 , 文 件 名 爲testfile.zip,查看現有文件:

[hadoop@hadoop1 hadoop]$bin/hadoop dfs -ls

9.hadoop 在線更新節點:

新增節點:

1). 在新增節點上安裝 jdk,並建立相同的 hadoop 用戶,uid 等保持一致

2). 在 conf/slaves 文件中添加新增節點的 ip

3). 同步 master 上 hadoop 全部數據到新增節點上,路徑保持一致

4). 在新增節點上啓動服務:

$ bin/hadoop-daemon.sh start datanode  $ bin/hadoop-daemon.sh start tasktracker

5). 均衡數據:

$ bin/start-balancer.sh

(1)若是不執行均衡,那麼 cluster 會把新的數據都存放在新的 datanode 上,這樣會下降 mapred的工做效率

(2)設置平衡閾值,默認是 10%,值越低各節點越平衡,但消耗時間也更長

$ bin/start-balancer.sh -threshold 5

在線刪除datanode節點:

1). 在 master 上修改 conf/mapred-site.xml

<property>  <name>dfs.hosts.exclude</name>  <value>/home/hadoop/hadoop-1.2.1/conf/datanode-excludes</value>  </property>

2). 建立 datanode-excludes 文件,並添加須要刪除的主機,一行一個

192.168.2.4

3). 在 master 上在線刷新節點

$ bin/hadoop dfsadmin -refreshNodes

此操做會在後臺遷移數據,等此節點的狀態顯示爲 Decommissioned,就能夠安全關閉了。

4). 你能夠經過如下命令查看 datanode 狀態

$ bin/hadoop dfsadmin -report

在作數據遷移時,此節點不要參與 tasktracker,不然會出現異常。

在線刪除tasktracker 節點:

1). 在 master 上修改 conf/mapred-site.xml

<property>  <name>mapred.hosts.exclude</name>  <value>/home/hadoop/hadoop-1.2.1/conf/tasktracker-excludes</value>  </property>

2. 建立 tasktracker-excludes 文件,並添加須要刪除的主機名,一行一個

hadoop4.example.com

3. 在 master 上在線刷新節點

$ bin/hadoop mradmin -refreshNodes

4. 登陸 jobtracker 的網絡接口,進行查看。

相關文章
相關標籤/搜索