歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux管理 >> Linux配置 >> Ubuntu下Hadoop的安裝部署

Ubuntu下Hadoop的安裝部署

日期:2017/2/27 14:58:48   编辑:Linux配置
1.說明
兩台機器,主機名為gislq-1,gislq-2
IP地址:192.9.116.20,192.9.116.67
操作系統:均為Ubuntu 10.10
hadoop:hadoop-0.16.3.tar.gz
gislq-1作為namenode(master),gislq-2作為datanode(slave)
遇到問題 我最初下載的是最新的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
注意:
1、 用streaming方式運行測試程序,執行的是本地文件,所以要講mapper和reducer
兩個程序拷貝到namenode和每個datanode的相同目錄下。本例是將mapper和reducer拷貝到每台機器的
/home/hadoop/hdfile目錄下。
2、 處理的文本文件要先傳到HDFS中,本例是將ap_base_session_fatmt0.txt傳到HDFS的input目錄下。
3、 如果要重新運行測試,需要將HDFS上的output目錄刪除,否則會報output目錄已經存在的錯誤。
刪除命令:bin/hadoop dfs -rmr output
Copyright © Linux教程網 All Rights Reserved