最近工作需要,摸索著搭建了Hadoop 2.2.0(YARN)叢集,中間遇到了一些問題,在此記錄,希望對需要的同學有所協助。
本篇文章不涉及hadoop2.2的編譯,編譯相關的問題在另外一篇文章《hadoop 2.2.0 源碼編譯筆記》中說明,本篇文章我們假定已經獲得了hadoop 2.2.0的64bit發行包。
由於spark的相容問題,我們後面使用了Hadoop 2.0.5-alpha的版本(2.2.0是穩定版本),2.0.5的配置有一點細微的差別,文中有特別提示。
1. 簡介
【本節摘自http://www.cnblogs.com/xia520pi/archive/2012/05/16/2503949.html】
Hadoop是Apache軟體基金會旗下的一個開源分散式運算平台。以HadoopDistributed File System(HDFS,Hadoop Distributed Filesystem)和MapReduce(Google MapReduce的開源實現)為核心的Hadoop為使用者提供了系統底層細節透明的分布式基礎架構。
對於Hadoop的叢集來講,可以分成兩大類角色:Master和Salve。一個HDFS叢集是由一個NameNode和若干個DataNode組成的。其中NameNode作為主伺服器,管理檔案系統的命名空間和用戶端對檔案系統的訪問操作;叢集中的DataNode管理儲存的資料。MapReduce架構是由一個單獨運行在主節點上的JobTracker和運行在每個叢集從節點的TaskTracker共同組成的。主節點負責調度構成一個作業的所有任務,這些任務分布在不同的從節點上。主節點監控它們的執行情況,並且重新執行之前的失敗任務;從節點僅負責由主節點指派的任務。當一個Job被提交時,JobTracker接收到提交作業和配置資訊之後,就會將配置資訊等分發給從節點,同時調度任務並監控TaskTracker的執行。
從上面的介紹可以看出,HDFS和MapReduce共同組成了Hadoop分布式系統體繫結構的核心。HDFS在叢集上實現Distributed File System,MapReduce在叢集上實現了分散式運算和任務處理。HDFS在MapReduce任務處理過程中提供了檔案操作和儲存等支援,MapReduce在HDFS的基礎上實現了任務的分發、跟蹤、執行等工作,並收集結果,二者相互作用,完成了Hadoop分布式叢集的主要任務。
2. 系統內容 系統版本
CentOS 6.4 64bit
uname -a
Linux ** 2.6.32_1-7-0-0 #1 SMP *** x86_64 x86_64 x86_64 GNU/Linux JAVA環境 安裝Java 1.6
將jdk解壓到local目錄下
添加JAVA_HOME環境變數到.bashrc檔案中
export JAVA_HOME="/home/<hostname>/local/jdk1.6.0_45/"
export JRE_HOME="/home/<hostname>/local/jdk1.6.0_45/jre/"
export PATH=$JAVA_HOME/bin:$JRE_HOME/bin:$PATH
export CLASSPATH=.:$JAVA_HOME/lib:$JRE_HOME/lib:$CLASSPATH
HADOOP解壓hadoop-2.2.0-bin_64.tar.gz(這個包是我在CentOS6.4 64bit的環境下編譯得到的) 到使用者根目錄
export HADOOP_HOME=/home/<hostname>/hadoop-2.2.0
[html] view plaincopyprint? export PATH=$JAVA_HOME/bin:$HADOOP_HOME/bin:$PATH
測試本地模式 hadoop預設情況下配置為本地模式,所以解壓後不修改任何配置,可以執行本地測試
// 建立本地目錄
mkdir input
// 填充資料
cp conf/*.xml input
// 執行hadoop
bin/hadoop jar hadoop-examples-*.jar grep input output 'dfs[a-z.]+'
// 查看結果
[html] view plaincopyprint? cat output/*
3. 網路環境 由於前期只是測試環境和配置,所以簡單的使用兩個節點:
master機器,充當namenode & datanode
slave機器,充當datanode
設定hostname
HDFS用hostname而不是IP來相互之間進行通訊,hadoop會反向解析hostname,即使是用了IP,也會使用hostname 來啟動TaskTracker,所以所有設定檔只能用hostname,不能用IP(滿滿的都是淚)。我們給兩個機器分別設定如下:
| 機器 |
IP |
HOSTNAME |
角色 |
| master |
192.168.216.135 |
master |
namenode, datanode |
| slave |
192.168.216.136 |
slave1 |
datanode |
臨時更改hostname的命令是(root許可權)
hostname <new_name>
永久更改需要修改設定檔/etc/sysconfig/network
[html] view plaincopyprint? HOSTNAME=<new_name>
修改hosts檔案 設定/etc/hosts檔案(每台機器上都要設定),添加如下內容
[html] view plaincopyprint? 192.168.216.135 master 192.168.216.136 slave1 namenode與datanode的/etc/hosts內容都必須是ip位址與host name的對應,不能使用127.0.0.1代替原生ip地址,否則hadoop使用hostname找ip時,會以"127.0.0.1"作為ip位址。
設定ssh無密碼訪問 master和所有的slave之間,需要實現雙向ssh無密碼訪問(slave和slave之間可以不用實現)。
請參見《ssh無密碼訪問》文章,本文不再詳述
防火牆設定 嚴格來說,應該是開啟某些對應的連接埠。為了簡單起見,我們這裡關閉selinux和iptalbes. 關閉selinux的方法
[html] view plaincopyprint? setenforce 1 設定SELinux 成為enforcing模式 setenforce 0 設定SELinux 成為permissive模式 如果永久關閉,編輯/etc/selinux/config
[html] view plaincopyprint? SELINUX=disabled