Hadoop在linux下的安裝部署

Hadoop在linux下的安裝部署 java


1.說明
共有兩臺機器(一臺式一筆記本),主機名爲gislq-1,gislq-2
IP地址:192.9.116.20,192.9.116.67
操做系統:均爲Ubuntu 10.10
hadoop:hadoop-0.16.3.tar.gz【1】
gislq-1做爲namenode(master),gislq-2做爲datanode(slave)
【1】遇到問題 我最初下載的是最新的hadoop版本0.21.0,可是到最後全部配置完成後,輸入命令$ start-all.sh 提示DEPRECATED: Use of this script to execute hdfs command isdeprecated. Instead use the hdfs command for it。可是當我使用hdfs命令時又出現Hadoop common not found。後來發現好象是新版本里的一個bug(或者是新版本還須要新的設置),安裝0.16.3版問題消失

2.ping機器
網上說一個很簡單的測試辦法就是ping一下主機名,好比在gislq-1上ping gislq-2,若是能ping通就OK!我不知道什麼叫能ping通。。。同事說只要在終端輸入ping gislq-2命令,若是能能傳輸數據包便可。我照作,用這個命令能夠ping通,可是到了後面使用scp命令複製文件時【2】,若是目標地址使用主機名錶示,則不能複製,過很長時間後提示:
ssh: connect to host gislq-2 port 22: Connection timed out
lost connection
若是目標地址使用IP地址表示,則沒有問題。一樣ssh也不能用主機名鏈接
解決辦法就是修改/etc/hosts文件,若是該臺機器做Namenode用,則須要在hosts文件中加上集羣中全部機器的IP地址及其對應的主機名;若是該臺機器做Datanode用,則只須要在hosts文件中加上本機IP地址和Namenode機器的IP地址。
以本機爲例,gislq-1中的/etc/hosts文件看起來是這樣的
127.0.0.0         localhost    localhost
192.9.116.20     gislq-1       gislq-1
192.9.116.20     gislq-2       gislq-2
gislq-2中的/etc/hosts文件看起來是這樣的
127.0.0.0        localhost     localhost
192.9.116.20     gislq-1       gislq-1
192.9.116.20     gislq-2       gislq-2
【2】使用scp命令時,會詢問目標機器的root管理員的密碼,普通用戶(就是不論是安裝時本身設的用戶,仍是後來添加的管理員用戶)的密碼無效。ubuntu默認root用戶密碼爲空 輸入命令passwd root就能夠更改密碼了

3.新建系統hadoop用戶
Hadoop要求全部機器上hadoop的部署目錄結構要相同,而且都有一個相同的用戶名的賬戶,因此須要每臺機器建一個同名的用戶。
在這4臺機器上建hadoop用戶,密碼:hadoop(用戶名和密碼可本身指定),我建的是管理員帳戶

4.安裝並開啓SSH服務
在SSH設置以前先要安裝ssh服務,並開啓。Ubuntu缺省安裝了openssh-client,因此在這裏就不安裝了,若是你的系統沒有安裝的話,再用apt-get安裝上便可。
網上有不少介紹在Ubuntu下開啓SSH服務的文章,但大多數介紹的方法測試後都不太理想,均不能實現遠程登陸到Ubuntu上,最後分析緣由是都沒有真正開啓ssh-server服務。最終成功的方法以下:
$ sudo apt-get install openssh-server
而後確認sshserver是否啓動了:
$ ps -e |grep ssh
若是隻有ssh-agent那ssh-server尚未啓動,須要執行命令$ /etc/init.d/ssh start,若是看到sshd那說明ssh-server已經啓動了。

5.配置SSH
Hadoop須要namenode到datanode的無密碼SSH,因此須要設置namenode到其餘3臺datanode的無密碼公鑰認證方式的SSH。簡單的說,在gislq-1上須要生成一個密鑰對,即一個私鑰,一個公鑰。將公鑰拷貝到gislq-2上,這樣,好比當gislq-1向 gislq-2發起ssh鏈接的時候,gislq-2上就會生成一個隨機數並用gislq-1的公鑰對這個隨機數進行加密,併發送給gislq-1;gislq-1 收到這個加密的數之後用私鑰進行解密,並將解密後的數發送回gislq-2,gislq-2確認解密的數無誤後就容許gislq-1進行鏈接了。這就完成了一次公鑰認證過程。
首先用hadoop用戶登陸每臺機器(包括namenode),在/home/hadoop/目錄下創建.ssh目錄,並將目錄權限設爲:drwxr-xr-x,設置命令: chmod 755 .ssh
在namenode(gislq-1)上執行命令:$ ssh-keygen -t rsa (這個命令將爲namenode生成一個密鑰對)
Enter file in which to save the key (/home/hadoop/.ssh/id_rsa):
Enter passphrase (empty for no passphrase): 
Enter same passphrase again:
這三個項目直接回車便可(第一個回車表示將密鑰對默認存儲在/home/hadoop/.ssh目錄下,第二三個回車表示設置空密碼)。
這個命令將在/home/hadoop/.ssh目錄下生成一對密鑰id_rsa,id_rsa.pub。而後將id_rsa的內容複製到每一個機器(包括本機)的home/hadoop/.ssh/authorized_keys文件中,若是機器上已經有authorized_keys這個文件了,就在文件末尾加上 id_rsa.pub中的內容,若是沒authorized_keys這個文件,直接cp或者scp就行了,下面的操做假設各個機器上都沒有 authorized_keys文件。
具體命令:
在namenode執行(用新建的hadoop用戶登陸):
$ cp /home/hadoop/.ssh/id_rsa.pub /home/hadoop/.ssh/authorized_keys 
$ scp /home/hadoop/.ssh/authorized_keys gislq-2:/home/hadoop/.ssh/
此處的scp就是經過ssh進行遠程copy,此處須要輸入遠程主機的密碼,按照提示輸入便可
固然,也能夠用其餘方法將authorized_keys文件拷貝到其餘機器上,比方說用U盤(不過仍是建議用scp命令,由於能夠檢查如下ssh服務是否已經開啓)。
用hadoop用戶登陸每臺機器,修改/home/hadoop/.ssh/authorized_keys文件的權限爲:-rw-r–r–,設置命令:
$ cd /home/hadoop/.ssh
$ chmod 644 authorized_keys
設置完成後,測試一下namenode到各個datanode節點的ssh連接,包括到本機,若是不須要輸入密碼就能夠ssh登陸,說明設置成功了。
測試方法:
好比gislq-1向gislq-2發起ssh鏈接
[hadoop@gislq-1:~]$ssh  gislq-2
若是ssh配置好了,就會出現如下提示信息
The authenticity of host [gislq-2] can't be established.
Key fingerprint is 1024 5f:a0:0b:65:d3:82:df:ab:44:62:6d:98:9c:fe:e9:52.
Are you sure you want to continue connecting (yes/no)?
OpenSSH告訴你它不知道這臺主機,可是你不用擔憂這個問題,由於你是第一次登陸這臺主機。鍵入「yes」。這將把這臺主機的「識別標記」加到「~/.ssh/know_hosts」文件中。第二次訪問這臺主機的時候就不會再顯示這條提示信息了。
而後你會發現不須要輸入密碼就能夠創建ssh鏈接了,恭喜你,配置成功了!

6.安裝JDK
到sun網站下載JDK安裝包jdk-6u11-linux-i586.bin,copy到機器的usr目錄中,並在每臺機器的root用戶下面安裝.
在root用戶下:
$ cd /usr
$ chmod +x jdk-6u11-linux-i586.bin 給安裝文件增長執行權限.
$ ./jdk-6u11-linux-i586.bin,按提示按幾個空格健後,輸入yes後開始安裝jdk6.
安裝好後,將目錄名修改成jdk6.
設置JDK的環境變量,考慮到JDK可能會有其餘系統用戶也會用到,建議將環境變量直接設置在/etc/profile中具體內容(若是沒有則直接在profile文件中添加):
export JAVA_HOME=/usr/jdk6
export CLASSPATH=$CLASSPATH:$JAVA_HOME/lib:$JAVA_HOME/jre/lib
export PATH=$JAVA_HOME/bin:$JAVA_HOME/jre/bin:$PATH:$HOME/bin
用$ source /etc/profile使用java環境生效.

7.設置目錄並安裝Hadoop
用hadoop用戶登陸namenode,並新建一個目錄,用於存放全部hadoop相關內容。
本例中在/home/hadoop目錄下新建HadoopInstall
下載hadoop安裝包並copy至namenode的hadoop用戶的/home/hadoop/HadoopInstall並解壓縮:
tar zxvf hadoop-0.16.3.tar.gz
考慮到從此升級以及其餘操做的方便性,建議建一個名稱爲hadoop的連接,指向hadoop-0.16.3目錄:
ln -s hadoop-0.16.3 hadoop
新建目錄:/home/hadoop/HadoopInstall/hadoop-conf
將/home/hadoop/HadoopInstall/hadoop/conf目錄下的hadoop_site.xml,slaves,hadoop_env.sh,masters文件拷貝到/home/hadoop/HadoopInstall/hadoop-conf目錄
在/home/hadoop/.bashrc文件中設置環境變量$HADOOP_CONF_DIR:
export HADOOP_CONF_DIR=$HOME/HadoopInstall/hadoop-conf/

8.Hadoop環境變量設置和配置文件修改
在/home/hadoop/HadoopInstall/hadoop-conf/hadoop_env.sh文件中設置環境變量:
export JAVA_HOME=/usr/jdk6
export HADOOP_HOME=/home/hadoop/HadoopInstall/hadoop
在/home/hadoop/HadoopInstall/hadoop-conf/masters文件中設置namenode:
文件內容:
gislq-1
在/home/hadoop/HadoopInstall/hadoop-conf/slaves文件中設置datanode:
文件內容:
gislq-2
在conf/目錄中的hadoop-default.xml中包含了Hadoop的全部配置項,可是不容許直接修改!能夠在hadoop-conf/目錄下的hadoop-site.xml裏面定義咱們須要的項,其值會覆蓋hadoop-default.xml中的默認值。能夠根據本身的實際須要來進行定製。
在/home/hadoop/HadoopInstall/hadoop-conf/hadoop-site.xml文件中設置hadoop配置:
<?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>gislq-1:9000</value>
  <description>The name of the default file system. Either theliteral string "local" or a host:port for DFS.</description>
</property>
<property>
  <name>mapred.job.tracker</name>
  <value>gislq-1:9001</value>
  <description>The host and port that the MapReduce job tracker runsat. If "local", then jobs are run in-process as a single map andreduce task.</description>
</property>
<property>
  <name>hadoop.tmp.dir</name>
  <value>/home/hadoop/HadoopInstall/tmp</value>
  <description>A base for other temporarydirectories.</description>
</property>
<property>
  <name>dfs.name.dir</name>
  <value>/home/hadoop/HadoopInstall/filesystem/name</value>
  <description>Determines where on the local filesystem the DFS namenode should store the name table. If this is a comma-delimited list ofdirectories then the name table is replicated in all of the directories, forredundancy. </description>
</property>
<property>
  <name>dfs.data.dir</name>
  <value>/home/hadoop/HadoopInstall/filesystem/data</value>
  <description>Determines where on the local filesystem an DFS datanode should store its blocks. If this is a comma-delimited list of directories,then data will be stored in all named directories, typically on differentdevices. Directories that do not exist are ignored.</description>
</property>
<property>
  <name>dfs.replication</name>
  <value>1</value>
  <description>Default block replication. The actual number ofreplications can be specified when the file is created. The default is used ifreplication is not specified in create time.</description>
</property>
</configuration>

9.部署datanode節點
將namenode上安裝配置完成的hadoop文件拷貝到全部datanode:
$ scp -r /home/hadoop/HadoopInstall gislq-2:/home/hadoop/scp -r/home/hadoop/HadoopInstall

10.啓動Hadoop
啓動以前,咱們先要格式化namenode,先進入~/HadoopInstall/hadoop目錄,執行下面的命令
[hadoop@gislq-1: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@gislq-1:hadoop]$bin/start-all.sh
一樣,若是要中止hadoop,則
[hadoop@gislq-1:hadoop]$bin/stop-all.sh

11.HDFS測試
運行bin/目錄的hadoop命令,能夠查看Haoop全部支持的操做及其用法,這裏以幾個簡單的操做爲例。
在HDFS創建目錄(在HDFS中創建一個名爲testdir的目錄):
$ bin/hadoop dfs -mkdir testdir
複製文件到HDFS(把本地文件large.zip拷貝到HDFS的根目錄/user/hadoop/下,文件名爲testfile.zip):
$ bin/hadoop dfs -put /home/hadoop/large.zip testfile.zip
查看HDFS的現有文件
$ bin/hadoop dfs -ls

12.C++測試(網上大牛寫的,我暫時還未測試)
分別用c++編寫mapper和reducer程序,完成對文件中的單詞數量的統計:

mapper.cpp:
// c++ map reduce Mapper
// word count example
// 2008.4.18
// by iveney
#include 
#include 
using namespace std;

int main()
{
string buf;
while( cin>>buf )
cout< return 0;
}

reducer.cpp:
#include 
#include 
#include
using namespace std; int main()
{
map dict;
map::iterator iter;
string word;
int count;
while( cin>>word>>count )
dict[word]+=count;
iter = dict.begin();
while( iter != dict.end() )
{
cout<first<<」\t」<second< iter++;
}
return 0;
}

編譯兩個源文件:
g++ mapper.cpp -o mapperg++ reducer.cpp -o reducer
簡單測試一下這兩個程序:echo "ge abc ab df " | ./mapper |./reducer
輸出:ab 1abc 1df 1hadoop
運行測試bin/hadoop dfs -mkdir inputbin/hadoop dfs -put/home/hadoop/ap_base_session_fatmt0.txt
inputbin/hadoop jar contrib/streaming/hadoop-0.16.3-streaming.jar -mapper
/home/hadoop/hdfile/mapper -reducer /home/hadoop/hdfile/reducer -input input/ap_base_session_fatmt0.txt-output output
注意:
一、 用streaming方式運行測試程序,執行的是本地文件,因此要講mapper和reducer
兩個程序拷貝到namenode和每一個datanode的相同目錄下。本例是將mapper和reducer拷貝到每臺機器的
/home/hadoop/hdfile目錄下。
二、 處理的文本文件要先傳到HDFS中,本例是將ap_base_session_fatmt0.txt傳到HDFS的input目錄下。
三、 若是要從新運行測試,須要將HDFS上的output目錄刪除,不然會報output目錄已經存在的錯誤。
刪除命令:bin/hadoop dfs -rmr output node

相關文章
相關標籤/搜索