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)
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
發布密鑰到你本地和hadoop2、hadoop3
試著登錄本地和hadoop2、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 的網絡接口,進行查看。