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在所有节点中没有保持一致造成。

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