Hadoop完全分布式详细说明及常见错误解决办法

来源:互联网 发布:java猜拳游戏编程代码 编辑:程序博客网 时间:2024/05/16 16:15
  1. 准备环境(以三台机器为例)

    三台机器理想IP

    master 

    169.254.19.4 

    Slave1 

    169.254.19.5 

    Slave2 

    169.254.19.6 

     

    1. 准备三台Linux机器或虚拟机分别创建相同的用户名,这点很重要如果用户名不一样的话后面配置ssh以后启动hadoop,hadoop利用ssh关联时默认用启动的本机的用户来试图登录,如果用户名不一样则会失败,此处我就用root用户在三台机器上分别创建hadoop用户

     

    1. 配置网络问题(针对拷贝或者克隆的Linux虚拟机):
      1. 启动虚拟机在setting的network配置中选NAT,如果有固定路由可以选桥接方式bridged,但不推荐
      2. 配置网卡:vi /etc/udev/rules.d/70persistend-net.rules 将最后一个的name改成eth0,并将这之前的网卡加"#"注释,如图:
      3. 配置网卡驱动:vi /etc/sysconfig/network-scripts/ifcfg-eth0 将DRIVE和NAME 改成eth0修改BOOTPORTO为static 修改IPADDR为指定ip,如169.254.19.4,修改网关GATEWAY和NETMASK为固定值如GATEWAY=169.254.19.1,NETMASK=255.255.255.0
      4. 修改网卡驱动配置可以通过 service network restart 来重新加载,但是修改网卡配置需要重启机器可以切换到root执行reboot或者init 6 来重启
      5. 配置localhost:配置localhost就相当于给一台机器取名,也相当于给一台机器的ip取别名我们分别取master和slave1和slave2,vi /etc/sysconfig/network,,将HOSTNAME修改成指定的名称,如:
      6. 配置hosts:hosts就相当于一个域服务器记录一些主机名和IP的对应关系,要让三台机器运行hadoop需要他们互相通信,需要分别配置好/etc/hosts,vi /etc/hosts 分别配置好IP和各自的HOSTNAME,但是第一行的127.0.0.1的localhost的配置不能去掉,如图:
    2. 配置ssh:
      1. 用root账户登录vi /etc/ssh/sshd_config将RSAAuthentication yes PubkeyAuthentication yes AuthorizedKeysFile .ssh/authorized_keys的注释去掉,如图:

      ,如果使用普通用户登录执行上述vi命令则看不到任何内容

      1. 切换到hadoop用户,执行ssh-keygen -t rsa -P '' -f ~/.ssh/id_rsa则会在/home/hadoop/.ssh下生成id_rsa(私钥)和id_rsa.pub(公钥),执行cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys 将生成的公钥追加重定向到authorized_keys中,并将公钥用scp命令传到另外的机器,执行scp ~/.ssh/id_rsa.pub hadoop@slave1:~/.ssh/id_master_rsa.pub和scp ~/.ssh/id_rsa.pub hadoop@slave2:~/.ssh/id_master_rsa.pub,给authorized_keys 赋权限,此处要点:各个节点的authorized_keys文件中都有自己和其他节点的公钥修改.ssh目录的权限为700,authorized_keys文件的权限为644,cd ~/.ssh,chmod 644 authorized_keys,执行ssh localhost 如果不需要密码就能登录说明ssh配置成功了,另外两台机器分别执行生成私钥公钥命令,将公钥重定向追加到authorized_keys里面,并将id_rsa.pub用scp命令发送到另外两台机器上重命名为id_slave1_rsa.pub 和 id_slave2_rsa.pub,每台机器分别用追加重定向将另外两台机器发过来的公钥追加到authorized_keys 中,例如:master机器中一定有id_slave1_rsa.pub和id_slave2_rsa.pub,执行cat ~/.ssh/id_slave1_rsa.pub >> ~/.ssh/authorized_keys 和 cat ~/.ssh/id_slave2_rsa.pub >> ~/.ssh/authorized_keys,上述步骤完成后任意两台机器都拥有互相的公钥,因此都能互相无密码通信
    3. 安装JDK:登录root用户,将jdk的Linux版通过WInscp拷贝到/usr/soft,事先在/usr下执行mkdir soft,执行chmod -u+x jdk-6u25-linux-i586.bin 给软件赋执行权限,./jdk-6u25-linux-i586.bin 执行软件进行安装,安装完后配置环境变量,vi /etc/profile 加入JAVA_HOME=/usr/soft/jdk1.6.0_25

    CLASS_PATH=.:$JAVA_HOME/lib:$JAVA_HOME/jre/lib

    PATH=$PATH:$JAVA_HOME/bin:$JAVA_HOME/jre/bin

    export PATH CLASS_PATH JAVA_HOME变量,执行source /etc/profile,执行java -version 就能看到安装好的JDK版本

    1. 安装hadoop用Winscp将hadoop-1.0.4.tar.gz拷贝到/usr/soft并解压,执行chown -R hadoop:hadoop soft 来将soft文件夹及其下面所有文件所属改成hadoop用户
  2. 配置hadoop环境

    1. 一般要配置conf目录下的core-site.xml文件,hdfs-site.xml文件mapred-site.xml文件,配置如下:

      core-site.xml

      <configuration>
      <property>
      <name>fs.default.name</name>
      <value>hdfs:// 169.254.19.4:9000</value>
      </property>

      <property>
      <name>hadoop.tmp.dir</name>
      <value>/usr/soft/hadoop/tmp</value>
      </property>
      </configuration>

      hdfs-site.xml

      <configuration>

      <property>

      <name>dfs.replication</name>

      <value>1</value>

      </property>

      <property>

      <name>dfs.permissions</name>

      <value>false</value>

      </property>

      </configuration>

      mapred-site.xml

      <configuration>

      <property>

      <name>mapred.job.tracker</name>

      <value>169.254.19.4:9001</value>

      </property>

      </configuration>

      配置好后,通过scp命令将hadoop配置给每个机器都发一份

    2. 配置jdk环境变量
    3. 配置conf中的slaves和masters,slaves中配置的是datanode的ip,每个IP占一行masters是secondnamenode的ip,从哪个机器启动hadoop则哪个是namenode,这里配置的是secondnamenode,本例子slaves配置如下:

      169.254.19.5

      169.254.19.6

      Masters配置如下(这里和namenode同节点,实际生产不会这么配置):

      169.254.19.4

    4. 在bin目录下先执行./hadoop namenode -format 没有问题的话执行./start-all.sh,hadoop就运行起来了,通过jps来查看运行状态
  3. 常见错误

    IP配置问题,不能ping上:

  4. 可能是由于配置的网段没有和外面计算机的VMnet8保持同一网段
  5. /etc/sysconfig/network-scripts/ifcfg-etho的mac地址配置不是/etc/udev/rules.d/70-persistend-net.rules中的ATTR(address),也没注释,而是无效的

    Ssh配置问题:

  6. 可能是格台机器上用户名不一样,注意这里登录的用户名和配置的HOSTNAME不是同一个概念注意,一般xxx@xxx 前面的表示登录的用户名,后面的表示localhost,也可以理解为一个IP很多地方这个后面的XXX用ip代替也是可行的
  7. 将私钥id_rsa追加到authorized_keys后面而没有将公钥id_rsa.pub追加到authorized_keys后面
  8. 没有将authorized_keys的权限改成600或者644

    Hadoop启动出问题:

  9. xml配置问题,可以从日志查看,并将错误在网上搜索,可能是slaves或者masters配置的有问题
  10. 没有执行./hadoop namenode -format
    1. 单个节点启动不了datanode进程,执行hadoop-daemon.sh start datanode 时启动后立马被stop了,此种问题可能是由于配置了单个节点的删除部署exclude文件但是没注释,应该将配置文件中的该节点注释掉或者删除,在执行hadoop-daemon.sh start datanode来解决。
    2. JAVA_HOME not set 时,配置conf目录下的hadoop-env.sh中的export JAVA_HOME
    3. dataNode节点启动后自动关了且报错No route to host则可能是防火墙没关闭或者hostname和/etc/hosts配置不一样

     

     

     

0 0