Hadoop全分佈安裝配置及常見問題


一、初始說明

  • 系統:Fedora 15
  • 機器:7臺,NameNode 1+ SecondaryNameNode 1+ DataNode 5
  • 單機配置:1G內存,2 core ,32位,35GB可用硬盤,此配置純屬用於簡單實驗 
  • Hadoop需要運行在oracle的hotspot JDK上,fedora自帶的open-jdk似乎不行
  • 使用默認的單機架結構,即所有機子在同一個機架
 二、軟件包準備

  • Hadoop:官網鏈接,本實驗使用tar.gz包,版本爲hadoop-1.0.3
  • JDK:鏈接,本實驗使用rpm,版本爲1.7.0
三、安裝

  1. 所有機子上,創建hadoop用戶,爲了方便密碼也保持一致。
  2. 在NameNode機器上解壓下載Hadoop到hadoop用戶的主目錄下,命令:tar -zxvf hadoop-*.tar.gz /home/hadoop/
  3. 在所有機器上安裝JDK,雙擊或命令:rpm -ivh jdk*.rpm,需要root用戶密碼。
四、配置/etc/profile,主要是配置jdk環境變量和hadoop的環境變量,在其中添加如下內容(注意版本不同要作相應修改):

export JAVA_HOME="/usr/java/jdk1.7.0"
export JRE_HOME="/usr/java/jdk1.7.0/jre"
export HADOOP_HOME="/home/hadoop/hadoop-1.0.3"
export CLASSPATH=.:$JAVA_HOME/LIB:$JRE_HOME/lib:$HADOOP_HOME/lib:$CLASSPATH
export PATH=$JAVA_HOME/bin:$HADOOP_HOME/bin:$PATH
export PATH=$JAVA_HOME/bin:$JRE_HOME/bin:$PATH

#每臺機子上的/etc/profile文件都要修改哈~

五、配置hadoop環境變量:修改HADOOP_HOME/conf/下的hadoop-env.sh,fedora下javaJDK默認被安裝到/usr/java下。

追加:

export JAVA_HOME="/usr/java/jdk1.7.0"

六、使用SSH令所有機器相互可無密碼訪問

只演示兩臺間A、B的操作,Fedora15默認已經安裝SSH:

  1. 在A、B的主目錄下創建.ssh文件夾:mkdir .ssh,並都修改其權限:chmod 700 .ssh   (注意不可以更高,似乎這樣SSH認爲不安全)。
  2. 在A,進入.ssh目錄:
    1)ssh-keygen -t rsa
    2)cat id_rsa.pud >> authorized_keys #請用cat,否則當機器很多的時候用cp可能覆蓋原來的文件,而導致之前配置好的機器的配置失效。
    3)chmod 600 authorized_keys 
    4)scp authorized_keys hadoop@B的IP:/home/hadoop/ #如果對ssh原理和scp命令不熟悉,建議你不要直接scp進入B的.ssh目錄中,否則在多臺機器時會出現覆蓋
    5)ssh B  #需要密碼
    6)touch ~/.ssh/authorized_keys  #如果authorized_keys文件不存在,創建之
    7)chmod 600 authorized_keys
    8)cat ~/authorized_keys >> ~/.ssh/authorized_keys #將前面複製過來的文件內容追加到.ssh目錄下的authorized_keys中。
    到此時,A可以無密碼登錄B
  3. 在B,進入.ssh 目錄:
    1)ssh-keygen -t rsa
    2)cat id_rsa.pub >> authorized_keys
    3)scp  authorized_keys hadoop@A的IP:/home/hadoop/
    4)ssh A
    6)cat ~/authorized_keys >> ~/.ssh/authorized_keys
    到此時,B也可無密碼登錄A

    其他機子兩兩間大致如上。
    如果發現有的機子無法無密碼訪問,很可能是權限問題,檢查.ssh目錄權限和authorized_keys文件的權限,也可通過以下命令查看日誌:

ssh -v localhost

 tail /var/log/secure -n 20 #查看系統日誌,需要root用戶

七、修改每臺機子的主機名,爲了以後方便,修改方式:

  1. 命令:hostname newName
  2. 修改/etc/sysconfig/network:      
NETWORKING=yes
HOSTNAME=datanode6

3.     修改/etc/hosts文件,我尚沒嘗試使用同步工具,因此我是先修改namenode的配置再使用scp命令複製到其它機子上的。

192.168.0.113 posa
192.168.0.118 datanode6
192.168.0.119 secondarynamenode
192.168.0.111 datanode2
192.168.0.121 datanode13
192.168.0.125 datanode16
192.168.0.116 datanode21

每臺機子修改後,要重啓服務:/etc/init.d/network restart

此時如果使用命令hostname發現主機名沒有成功改動,重啓電腦即可。

八、配置hadoop

在NameNode:

  1. slaves文件,運行datanode和tasktracker守護進程,我下面使用主機名,因爲已經配置好hosts文件
    datanode2
    datanode13
    datanode6
    datanode16
    datanode21
  2. masters,運行secondaryNamenode守護進程
    secondarynamenode
  3. conf/core-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>fs.default.name</name>
      <value>hdfs://posa:8022/</value>
    </property>
    <property>
      <name>io.file.buffer.size</name>
      <value>65536</value>
    </property>
    <property>
      <name>fs.trash.interval</name>
      <value>72000</value>
      <description>回收站是用戶級特性,當回收站被啓用,每個用戶都有獨立的回收站目錄。HDFS會自動刪除回收站文件,但其他文件系統不會,而不許定期用hadoop fs -expunge來刪除回收站中超過最小時間的文件</description>
    </property>
    </configuration>

  4. conf/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/hdfs/name</value>
    </property>
    <property>
      <name>dfs.data.dir</name>
      <value>/home/hadoop/hdfs/data</value>
    </property>

    <property>
      <name>dfs.http.address</name>
      <value>192.168.0.113:50070</value>
    </property>

    <property>
      <name>dfs.secondary.http.address</name>
      <value>secondarynamenode:50090</value>
    </property>

    <property>
      <name>fs.checkpoint.period</name>
      <value>300</value>
      <description>The number of seconds between two periodic checkpoints</description>
    </property>

    <property>
      <name>fs.checkpoint.dir</name>
      <value>/home/hadoop/hdfs/namesecondary</value>
    </property>
    </configuration>
  5. 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>posa:8021</value>
    </property>

    <property>
      <name>mapred.local.dir</name>
      <value>/home/hadoop/mapred/local</value>
    </property>
    <property>
      <name>mapred.system.dir</name>
      <value>/tmp/hadoop/mapred/system</value>
    </property>

    <property>
      <name>mapred.tasktracker.map.tasks.maximum</name>
      <value>4</value>
    </property>

    <property>
      <name>mapred.tasktracker.reduce.tasks.maximum</name>
      <value>4</value>
    </property>

    <property>
      <name>mapred.child.java.opts</name>
      <value>-Xmx400m</value>
    </property>

    </configuration>

九、複製hadoop至所有機器的hadoop用戶的主目錄下,注意所有機子都要按照jdk。

如複製到B:

scp  -r hadoop-1.0.3 hadoop@B的主機名或IP:/home/hadoop/

十、在NameNode啓動hadoop

start-all.sh

如果你發現要在HADOOP_HOME/bin/下使用./start-all 命令才能成功,那麼檢查你的/etc/profile文件的配置是否正確。

十一、看系統是否正常工作

1、hadoop dfsadmin -report

如果出現亂碼,則說明沒正常工作,檢查NameNode及各個節點的自己查看錯誤原因,很可能是以上配置出錯。

2、使用瀏覽器,localhost:50070,看是否出現正常頁面。

3、hadoop dfsadmin -put 文件名 /user 是否成功執行

4、jps查看守護進程是否正常啓動。


常見錯誤(以下的錯誤僅是可能的原因,是我犯過的錯誤):

一般的糾錯總結成一句話:查看日誌。

  1.  SecondaryNameNode沒起來,查看日誌說:文件夾CheckPoint.dir不存在,原因可能是hdfs-site.xml配置錯誤。
  2. 在關閉hadoop前format了,造成format後hdfs不可用:ERROR org.apache.hadoop.hdfs.server.datanode.DataNode: java.io.IOException: Incompatible namespaceIDs ……: namenode namespaceID = A; datanode namespaceID = B,則可能需要刪除所有機子上的數據文件,包括/tmp下的。如果你對我這種暴力的做法不滿意,請參考 。
  3. balancer.Balancer:Error moving block……沒有到主機的路由。原因:防火牆[沒關]。
  4. 新增datanode節點,啓動Hadoop發現新datanode沒啓動,查看其上日誌發現:datanodeName:未知的名稱或服務。原因:hosts配置有誤。
  5. 運行Job時發現,有一個task被Killed了兩次,在TaskLogs[在hostname:50030中查看]看到拋出org.apache.hadoop.mapred.ReduceTask:java net.unknownHostException:datanode;原因:複製數據時節點間交流出問題,因hosts在所有節點中沒有保持一致造成。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章