> Linux集群 > Hadoop >

hadoop完全分布式安装

hadoop安装包:hadoop0.20.205.0.tar.gz

操作系统:     fedora14

jdk版本:      jdk1.6.0_31

一、安装过程

  对于hadoop ,不同的系统会有不同的节点划分方式。在HDFS看来,节点分为Namenode和Datanode,其中Namenode只有一个,datanode可以有多个;在MapReduce看来,节点又分为jobtracker和tasktracker,其中jobtracker只有一个,而tasktacker可以有多个。namenode和jobtracker可以部署在不同的机器上,也可以部署在同一机器上。部署namenode和/或jobtracker的机器是master,其余的都是slaves。用户甚至可以将namenode、datanode、jobtacker、tasktracker都部署在一台机器上。详细的配置方法如下。

配置之前,确保所有主机的防火墙处于关闭状态。

1. 配置namenode和datanode

  配置成功的关键在于确保各机器上的主机名和IP地址之间能正确解析。修改每台机器的/etc/hosts文件,如果该台机器作namenode用,则需要在文件中添加集群中所有机器的IP地址及其对应 主机名;如果该台机器仅作为datanode用,则只需要在文件中添加本机和namenode的IP地址及其对应的主机名。

(修改主机名的命令为:hostname 新名称)

假设有两台机器,主机名分别为summer1,summer2,IP地址为10.0.5.199,10.0.5.198,summer1作为namenode,summer2作为datanode,刚两者的hosts文件配置是一样的,如下:

2. 在所有机器上建立相同的用户summer

   $useradd -m summer

   $passwd summer

3. ssh配置

  该配置主要是为了实现在机器间执行指令时不需要输入密码。在namenode上执行以下命令:

  $cd ~/.ssh

  $ssh-keygen -t rsa  --------------------然后一直按回车键,就会按照默认的选项将生成的密钥保存在.ssh/id_rsa文件中。

  $cp id_rsa.pub authorized_keys

  $scp authorized_keys summer@10.0.5.198:/home/summer/.ssh   ------把刚刚产生的authorized_keys文件拷一份到datanode上.

  最后进入所有机器的.ssh目录,改变authorized_keys文件的许可权限。

  $chmod 644 authorized_keys

  这时从namenode所在机器向其他datanode所在机器发起ssh连接,只有在第一次登录时需要输入密码,以后则不需要。

4. 在所有机器上配置hadoop

    首先在namenode所在机器上配置,执行如下解压命令:

    $sudo tar -xzvf hadoop0.20.205.0.tar.gz --------------解压 

    $sudo mv hadoop0.20.205.0  hadoop -----------------重命名文件夹,把名字中的版本号去掉,方便以后的命令输入

    解压完成后,编辑conf/core-site.xml,conf/hdfs-site.xml,conf/mapred-site.xml

  core-site.xml

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

<configuration>
<property>
  <name>hadoop.tmp.dir</name>
  <value>/home/summer/hadoopTMP</value> 
</property>
<property>
  <name>fs.default.name</name>
  <value>hdfs://summer1:9000</value>
</property>
</configuration>

hdfs-site.xml

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

<configuration>
<property>
  <name>dfs.replication</name>
  <value>1</value> 
</property>
</configuration>

mapred-site.xml

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

<configuration>
  <property>
    <name>mapred.job.tracker</name>
    <value>summer1:9001</value>  
  </property>
</configuration>


       编辑conf/master,修改为master的主机名(或IP),此处为summer1(或10.0.5.199)

       编辑conf/slaves,加入所有slaves/datanodes的主机名(或IP),每个主机名占一行,此处即为summer2(或10.0.5.198)

       把namenode机器上配置好的hadoop安装包复制到其他的datanode机器上:

       $scp -r hadoop summer@10.0.5.198:/usr/local 

    (此处可能会提示没有权限,是普通用户对/usr/local目录没有操作权限,可以在10.0.5.198机器上使用chown命令更改/usr/local目录对summer用户有权限,或者不使用该目录,而换成smmer家目录下的某个目录)

     编辑所有机器上的conf/hadoop-env.sh文件,重点修改下面两行:

# The java implementation to use.  Required.:!
export JAVA_HOME=/usr/local/jdk1.6.0_31   #不同的机器上java根目录不同,根据实际情况进行设定
# The directory where pid files are stored. /tmp by default.
 export HADOOP_PID_DIR=/usr/local/hadoop/run/tmp  #防止数据丢失

  现在hadoop已经在集群上部署完毕。如果要新加入或者删除节点,仅需要修改namenode的master和slaves文件,并作相关的拷贝工作。

5.  hadoop运行

     运行前先在 /etc/profile文件中配置hadoop的环境变量,如下图所示:

     格式化分布式文件系统,启动守护进程的命令如下:

     $hadoop namenode -format   --------------------因为配置了环境变量,此处不需要输入hadoop命令的全路径 /hadoop/bin/hadoop

     执行后的结果中会提示“ dfs/name has been successfully formatted”。否则格式化失败。

     启动hadoop:

     $start-all.sh   

    启动成功后,分别在namenode和datanode所在机器上使用 jps 命令查看,会在namenode所在机器上看到namenode,jobtracker,secondaryNamenode,会在datanode所在机器上看到datanode,tasktracker. 否则启动失败,检查配置是否有问题。

    停止hadoop:

    $stop-all.sh

 

二、常见问题:

1.安装完java和hadoop之后,直接在终端下运行start-all.sh,在启动namenode、datanode等进程时,
分别要求输入密码,这是因为当前用户对hadoop文件夹没有使用权限造成的。解决办法:
[summer@localhost ~]$ sudo chown -R summer:summer hadoop-0.20.2
注:当前用户为summer,所以组为summer,hadooop安装目录为:/home/summer/hadoop-0.20.2

2.在解决了问题1之后,又出现一个问题,如下图所示,

大概是要表明在运行hadoop-daemon.sh时hadoop-hadoop-namenode.pid权限不够导致namenode无法启动。

在网上搜索了好久,发现有人也遇到过同样的问题,参考他的方法解决了此问题,原文地址:http://bbs.chinacloud.cn/showtopic-3564.aspx
解决办法为:
第一步,在hadoop-config中修改hadoop-env.sh,添加:export HADOOP_PID_DIR=$HADOOP_HOME/run/tmp。改变pid的路径。
第二步,修改/etc/profile,添加:export HADOOP_PID_DIR=$HADOOP_HOME/run/tmp。
最后,运行start-all.sh后一切正常。

3.在配置好hadoop伪分布模式后,使用start-all.sh成功启动各个节点,使用jps查看成功,

使用浏览器查看:http://localhost:50070查看hdfs文件系统,一切正常。
在使用hadoop fs -copyFromLocal 或者-put时出现如现错误。大概意思是连接被拒绝。
copyFromLocal: Call to localhost/127.0.0.1:8020 failed on connection exception: 
java.net.ConnectException: Connection refused

解决办法:1.查看防火墙是否关闭,要求关闭防火墙。如果还不行,2.请查看/etc/hosts文件是否配置正确。

4.datanode无法启动

在测试Hadoop的分布式环境搭建时,在namenode启动时信息正常(jps查看显示:JobTracker ,SecondaryNameNode ,NameNode ,Jps),而 在datanode上使用jps查看时,只显示了 tasktracker,
没有显示datanode ,解决办法如下: 
(1)先检查conf/masters 和conf/slaves文件,确保配置没错。 
(2)把所有节点的hadoop.tmp.dir指定的文件夹下的内容全部删掉 
(3)重新格式化 namenode: $hadoop namenode -format  
(4)启动 : $start-all.sh  

查看namenode 和 datanode ,一切正常


 

(责任编辑:IT)