硬件環境
共有3臺機器,ubuntu 10.04和9.10系統,Java使用的是jdk1.6.0。IP配置如下:
ingteam:192.168.0.1
ing-1:192.168.0.101
ing-2:192.168.0.102
前提:ssh rsync jdk1.6
$sudo apt-get install ssh
$sudo apt-get install rsync
$sudo apt-get install sun-java6-jdk
ps:Ubuntu 10.04 LTS弄走了sun-java6-jdk,只有openjdk
ubuntu 10.04安裝sun-java6-jdk
$sudo add-apt-repository "deb http://archive.canonical.com/ lucid partner"
然後update再安裝
務必確保每臺機器的主機名和IP地址之間能正確解析
一個很簡單的測試辦法就是ping一下主機名,若不能正確解析,可以修改/etc/hosts文件,如果該臺機器作Namenode用,則需要在hosts文件中加上集羣中所有機器的IP地址及其對應的主機名;如果該臺機器作Datanode用,則只需要在hosts文件中加上本機IP地址和Namenode機器的IP地址。
以本文爲例,ingteam中的/etc/hosts文件看起來就應該是這樣的:
127.0.0.0 localhost
192.168.0.1 ingteam
192.168.0.101 ing-1
192.168.0.102 ing-2
ing-1中的/etc/hosts文件看起來就應該是這樣的:
127.0.0.0 localhost
192.168.0.1 ingteam
192.168.0.101 ing-1
對於Hadoop來說,在HDFS看來,節點分爲Namenode和Datanode,其中Namenode只有一個,Datanode可以是很多;在MapReduce看來,節點又分爲Jobtracker和Tasktracker,其中Jobtracker只有一個,Tasktracker可以是很多。
我是將namenode和jobtracker部署在ingteam上,ing-1,ing-2作爲datanode和tasktracker。由於Hadoop要求所有機器上hadoop的部署目錄結構要相同,並且都有一個相同的用戶名的帳戶。
SSH免密碼設置
在Hadoop啓動以後,Namenode是通過SSH(Secure Shell)來啓動和停止各個節點上的各種守護進程的,這就需要在節點之間執行指令的時候是不需要輸入密碼的方式,故我們需要配置SSH使用無密碼公鑰認證的方式。
首先在ingteam上生成密鑰對:
$ssh-keygen -t rsa
這個命令將爲ingteam上的用戶ingteam生成其密鑰對,詢問其保存路徑時直接回車採用默認路徑,當提示要爲生成的密鑰輸入passphrase的時候,直接回車,也就是將其設定爲空密碼。生成的密鑰對id_rsa,id_rsa.pub,默認存儲在/home/ingteam/.ssh目錄下。然後將id_rsa.pub的內容複製到每個機器(也包括本機)的/home/ingteam/.ssh/authorized_keys文件中,如果機器上已經有authorized_keys這個文件了,就在文件末尾加上id_rsa.pub中的內容,如果沒有authorized_keys這個文件,直接cp或者scp就好了,下面的操作假設各個機器上都沒有authorized_keys文件。
[ingteam@ingteam:.ssh]$scp authorized_keys ing-1:/home/ingteam/.ssh/
[ingteam@ing-2:.ssh]$chmod 644 authorized_keys
這一步非常關鍵,必須保證authorized_keys只對其所有者有讀寫權限,其他人不允許有寫的權限,否則SSH是不會工作的。
接着,在三臺機器上都需要對sshd服務進行配置(其實是可以不用配置的,完成了上面的那些操作了以後SSH就已經可以工作了)
至此各個機器上的SSH配置已經完成,可以測試一下了,比如ingteam向dbrg-2發起ssh連接
[ingteam@ingteam:~]$ssh ing-1
不過,別忘了測試本機ssh ingteam
環境的配置
在$HADOOP_HOME/conf/hadoop-env.sh中定義了Hadoop啓動時需要的環境變量設置,其中我們至少需要配置JAVA_HOME(Jdk的路徑)變量;另外我們一般還需要更改HADOOP_LOG_DIR(Hadoop的日誌路徑)這個變量,默認的設置是“export HADOOP_LOG_DIR=${HADOOP_HOME}/logs”,一般需要將其配置到一個磁盤空間比較大的目錄下。
我的是這樣設置的
export JAVA_HOME=/usr/lib/jvm/java-6-sun
Hadoop核心代碼需要配置conf文件夾裏面的core-site.xml,hdfs-site.xml,mapread-site.xml,mapred-site.xml,hadoop-env.sh這幾個文件。具體各個配置的含義請參考Hadoop幫助文檔。
1.首先編輯各個機器節點(包括master和slave)的core-site.xml文件,命令如下:(Hadoop 文件夾放在home下)
- <?xml version="1.0"?>
- <?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
- <!-- Put site-specific property overrides in this file. -->
- <configuration>
- <property>
- <name>fs.default.name</name>
- <value>hdfs://192.168.0.1:9000</value>
- </property>
- </configuration>
2.其次編輯各個機器節點(包括master和slave)的hdfs-site.xml,命令如下:
- <?xml version="1.0"?>
- <?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
- <!-- Put site-specific property overrides in this file. -->
- <configuration>
- <property>
- <name>dfs.name.dir</name>
- <value>/home/hadoop/NameData</value>
- </property>
- <property>
- <name>dfs.permissions</name>
- <value>false</value>
- </property>
- <property>
- <name>dfs.replication</name>
- <value>1</value>
- </property>
- </configuration>
3.再次,編輯各個機器節點(包括master和slave)mapred-site.xml文件,命令如下:
- <?xml version="1.0"?>
- <?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
- <!-- Put site-specific property overrides in this file. -->
- <configuration>
- <property>
- <name>mapred.job.tracker</name>
- <value>192.168.0.1:9001</value>
- </property>
- </configuration>
Masters/Slave文件配置
在master主機上的hadoop/conf/目錄下,打開master 文件,把master 主機名添加進去:
192.168.0.1
在master主機上的hadoop/conf/目錄下,打開slaves文件,該文件用來指定所有的從節點,一行指定一個主機名,因此slaves文件看起來應該是這樣的
192.168.0.101
192.168.0.102
部署Hadoop
前面講的這麼多Hadoop的環境變量和配置文件都是在dbrg-1這臺機器上的,現在需要將hadoop部署到其他的機器上,保證目錄結構一致。
$scp -r /home/hadoop ing-1:/home/
$scp -r /home/hadoop ing-2:/home/
至此,可以說,Hadoop已經在各個機器上部署完畢了下面就讓我們開始啓動Hadoop
啓動Hadoop
啓動之前,我們先要格式化namenode,先進入~/HadoopInstall/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守護
在這裏,簡單啓動所有守護
$bin/start-all.sh
同樣,如果要停止hadoop,則
$bin/stop-all.sh
HDFS操作
運行bin/目錄的hadoop命令,可以查看Haoop所有支持的操作及其用法,這裏以幾個簡單的操作爲例。
建立目錄
$bin/hadoop dfs -mkdir testdir
在HDFS中建立一個名爲testdir的目錄
複製文件
$bin/hadoop dfs -put /home/dbrg/large.zip testfile.zip
把本地文件large.zip拷貝到HDFS的根目錄/user/dbrg/下,文件名爲testfile.zip
查看現有文件
$bin/hadoop dfs -ls