Hadoop 安裝、配置,以及問題的解決方案

來源:互聯網
上載者:User

        不少新手在剛接觸Hadoop時,第一次安裝、配置、部署、使用等方面或多或少的遇到過一些問題。本文既是自己的一個測試總結,也是為大多數新手提供一個參考(當然,網上以及有很多相關資料)。

 

硬體環境
共有2台機器,一台(作為masters),一台機器使用VM安裝兩套系統(作為slaves),三系統均使用的Ubuntu 11.04 系統,Java使用的是jdk1.6.0_25。IP配置如下:

 

vm網路連接方式:均為‘橋接’

frank-1(主機名稱:即hostname):192.168.0.100   masters-----namenode
frank-2(主機名稱:即hostname):192.168.0.102   slaves-------datanode

 

 

frank-3(主機名稱:即hostname):192.168.0.103   slaves-------datanode

 

關於linux下修改hostname主機名稱:

不能簡單的使用:

$ hostname  主機名稱           // 這樣設定只是臨時修改,重啟系統,會恢複為原主機名稱

網上說使用smit ---好像不是linux命令(沒細查)

最簡單最笨的方法--直接修改:/etc/hostname

 

另外有一點這裡有一點需要強調的就是,務必要確保每台機器的主機名稱和IP地址之間能正確解析。


 

一個很簡單的測試辦法就是ping一下主機名稱,比如在frank-1上ping frank-2,如果能ping通就OK!若不能正確解析,可以修改/etc/hosts檔案,如果該台機器作Namenode用,則需要在hosts檔案中加上叢集中所有機器的IP地址及其對應的主機名稱;如果該台機器作Datanode用,則只需要在hosts檔案中加上本機IP地址和Namenode機器的IP地址。

 

以本文為例,frank-1中的/etc/hosts檔案看起來就應該是這樣的:
127.0.0.0         localhost     localhost
192.168.0.100     frank-1        frank-1
192.168.0.102     frank-2        frank-2
192.168.0.103     frank-3        frank-3

frank-2中的/etc/hosts檔案看起來就應該是這樣的:
127.0.0.0         localhost    localhost
192.168.0.100     frank-1       frank-1
192.168.0.102     frank-2       frank-2

frank-3中的/etc/hosts檔案看起來就應該是這樣的:
127.0.0.0         localhost    localhost
192.168.0.100     frank-1       frank-1
192.168.0.103     frank-3       frank-3

 

      對於Hadoop來說,在HDFS看來,節點分為Namenode和Datanode,其中Namenode只有一個,Datanode可以是很多;在MapReduce看來,節點又分為Jobtracker和Tasktracker,其中Jobtracker只有一個,Tasktracker可以是很多。
我是將namenode和jobtracker部署在frank-1上,frank-2,frank-3作為datanode和tasktracker。當然你也可以將namenode,datanode,jobtracker,tasktracker全部部署在一台機器上.

 

所需軟體:

jdk-6u25-linux-i586.bin

hadoop-0.21.0.tar.gz(和hbase整合時,要選擇hadoop-0.20.x版本,經測試hadoop-0.20.0不可以,hadoop-0.20.1沒測試,推薦使用hadoop-0.20.2,測試成功)

openssh

 

 

 

目錄結構


由於Hadoop要求所有機器上hadoop的部署目錄結構要相同,並且都有一個相同的使用者名稱的帳戶。
我的三台機器上是這樣的:都有一個frank的帳戶,主目錄是/home/frank
Hadoop部署目錄結構如下:/home/dbrg/HadoopInstall,所有的hadoop版本放在這個目錄中。
將hadoop0.21.0壓縮包解壓至HadoopInstall中,為了方便以後升級,建議建立一個連結指向要使用的hadoop版本,不妨設為hadoop
$ ln  -s  hadoop0.21.0   hadoop
這樣一來,所有的設定檔都在/hadoop/conf/目錄中,所有執行程式都在/hadoop/bin目錄中。
但是由於上述目錄中hadoop的設定檔和hadoop的安裝目錄是放在一起的,這樣一旦日後升級hadoop版本的時候所有的設定檔都會被覆蓋,因此建議將設定檔與安裝目錄分離,一種比較好的方法就是建立一個存放設定檔的目錄,/home/dbrg/HadoopInstall/hadoop-config/,然後將/hadoop/conf/目錄中的core-site.xml,hdfs-site.xml,mapred-site.xml,masters,slaves,hadoop_env.sh六個檔案拷貝到hadoop-config/目錄中,並指定環境變數$HADOOP_CONF_DIR指向該目錄。環境變數在/home/frank/.bashrc和/etc/profile中設定。

 

綜上所述,為了方便以後升級版本,我們需要做到設定檔與安裝目錄分離,並通過設定一個指向我們要使用的版本的hadoop的連結,這樣可以減少我們對設定檔的維護。在下面的部分,你就會體會到這樣分離以及連結的好處了。

 

 

SSH安裝、設定


在Hadoop啟動以後,Namenode是通過SSH(Secure Shell)來啟動和停止各個節點上的各種守護進程的,這就需要在節點之間執行指令的時候是不需要輸入密碼的方式,故我們需要配置SSH使用無密碼公開金鑰認證的方式。
首先要保證每台機器上都裝了SSH伺服器,且都正常啟動。實際中我們用的都是OpenSSH,這是SSH協議的一個免費開源實現。ssh安裝很簡單,$ sudo apt-get install openssh-server
以本文中的三台機器為例,現在frank-1是主節點,它需要主動發起SSH串連到frank-2和frank-3,對於SSH服務來說,frank-1就是SSH用戶端,而frank-2、frank-3則是SSH服務端,因此在frank-2,frank-3上需要確定sshd服務已經啟動(安裝成功後,即啟動,同時也是隨系統的啟動而啟動的,可用$ netstat -ntl 查看網路狀態,ssh預設連接埠22)。

簡單的說,在frank-1上需要產生一個金鑰組,即一個私密金鑰,一個公開金鑰。將公開金鑰拷貝到frank-2,frank-3上,這樣,比如當frank-1向frank-2發起ssh串連的時候,frank-2上就會產生一個隨機數並用frank-1的公開金鑰對這個隨機數進行加密,並發送給frank-1;frank-1收到這個加密的數以後用私密金鑰進行解密,並將解密後的數發送回frank-2,frank-2確認解密的數無誤後就允許frank-1進行串連了。這就完成了一次公開金鑰認證過程。

對於本文中的三台機器,首先在frank-1上產生無需登入密碼的金鑰組:
$ssh-keygen  -t  dsa -P '' -f ~/.ssh/id_dsa
這個命令將為frank-1上的使用者frank產生其金鑰組。產生的金鑰組id_dsa,id_dsa.pub,預設儲存在/home/frank/.ssh目錄下。然後將id_dsa.pub的內容追加到每個機器(也包括本機)的/home/frank/.ssh/authorized_keys檔案中,即下面的操作:

對於frank-1
$ cat ~/.ssh/id_dsa.pub >> ~/.ssh/authorized_keys

$ scp ~/.ssh/id_dsa.pub frank-3:/home/frank

對於frank-2(frank-3同frank-2的方法)
$ mkdir .ssh  --------------------先進入frank-2,建立.ssh檔案夾
$ scp ~/.ssh/authorized_keys frank-2:/home/frank/.ssh
此處的scp就是通過ssh進行遠程copy,此處需要輸入遠程主機的密碼,即frank-2機器上frank帳戶的密碼,當然,你也可以用其他方法將authorized_keys檔案拷貝到其他機器上

接著,在三台機器上都需要對sshd服務進行配置(其實是可以不用配置的,完成了上面的那些操作了以後SSH就已經可以工作了),在三台機器上修改檔案/etc/ssh/sshd_config
#去除密碼認證前面的#
PasswordAuthentication  no
AuthorizedKeyFile   %h/.ssh/authorized_keys

至此各個機器上的SSH配置已經完成,可以測試一下了,比如frank-1向frank-2發起ssh串連
$ ssh  frank-2
如果ssh配置好了,就會出現以下提示資訊
The authenticity of host [frank-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串連了,恭喜你,配置成功了
不過,別忘了測試本機ssh  frank-1

 

JDK的安裝很簡單就不在敘述了,關鍵是不要忘記配置環境變數:/etc/profile (namenode datanode都需配置jdk)

 

#set java environment

export JAVA_HOME=/home/frank/JavaInstall/jdk

export JRE_HOME=$JAVA_HOME/jre

export CLASSPATH=.:$JAVA_HOME/lib:$JRE_HOME/lib:$CLASSPATH

export PATH=.:$JAVA_HOME/bin:$JRE_HOME/bin:$PATH

 

 

在----umask 022 之上

 

 

Hadoop環境變數 (namenode datanode都需配置)

 


/etc/profile:增加:

#set hadoop environment

export HADOOP_HOME=/home/frank/HadoopInstall/hadoop

export PATH=.:$HADOOP_HOME/bin:$PATH

 

/home/frank/HadoopInstall/hadoop-conf/hadoop_env.sh

去掉#,並修改JAVA_HOME

 

# The java implementation to use.  Required.

export JAVA_HOME=/home/frank/JavaInstall/jdk

 

 

 

 

Hadoop設定檔

 

只有namenode需要修改masters和slaves(本文即frank-1):

 

masters:

frank-1

 

slaves:

frank-2

frank-3

 

 

core-site.xml,hdfs-site.xml,mapred-site.xml等其他檔案可根據具體需求進行配置,下面是我的簡單配置

core-site.xml配置如下:

 

<?xml version="1.0"?>

<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>

 

<!-- Put site-specific property overrides in this file. -->

 

<configuration>

<!--   global properties-->

<property>

<name>hadoop.tmp.dir</name>

<value>/home/frank/HadoopInstall/tmp</value>

<description>A base for other temporary directories.</description>

</property>

<!--   file system properties-->

<property>

<name>fs.default.name</name>

<value>hdfs://frank-1:9000</value>

<description>The name of the default file system. Either the literal string "local" or a host:port for DFS.</description>

</property>

</configuration>

 

 

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.replication</name>

<value>1</value>

<description>Default block replication. The actual number of replications can be specified when the file is created. The default is used if replication is not specified in create time.</description>

</property>

</configuration>

 

 

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>frank-1:9001</value>

<description>The host and port that the MapReduce job tracker runs at. If "local", then jobs are run in-process as a single map and reduce task.</description>

</property>

</configuration>

 

 


現在需要將hadoop部署到其他的機器上,保證目錄結構一致。
$ scp  -r  /home/frank/HadoopInstall  frank-2:/home/frank/
$ scp  -r  /home/frank/HadoopInstall  frank-3:/home/frank/

拷貝之後需要把配置好的masters和slaves修改過來,另外刪除hadoop,重建立立連結

至此,可以說,Hadoop已經在各個機器上部署完畢了下面就讓我們開始啟動Hadoop吧

啟動Hadoop
啟動之前,我們先要格式化namenode,先進入~/HadoopInstall/hadoop目錄,執行下面的命令
$ hadoop  namenode  -format

在這裡,簡單啟動所有守護
$ start-all.sh

同樣,如果要停止hadoop,則
$ stop-all.sh

 

HDFS操作

查看現有檔案
$ hadoop  dfs  -ls /其他動作可參考網上資料

 

 

 

 

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.