hadoop-2.8.0 完全分布式运行模式

1.虚拟机准备

  准备三台客户机(安装JDK8,关闭防火墙,静态ip,主机名称)

  修改etc/hosts文件

192.168.138.102 hadoop102
192.168.138.103 hadoop103
192.168.138.104 hadoop104

2.编写集群分发脚本xsync

  2.1 scp(secure copy)安全拷贝

    2.1.1 scp定义

      scp可以实现服务器与服务器之间的数据拷贝;

    2.1.2 基本语法

scp  -r  $pdir/$fname      $user@hadoop$host:$pdir/$fname
命令 递归  要拷贝的文件路径/名称  目的用户@主机:目的路径/名称

    2.1.3 在192.168.138.55主机上,将192.168.138.187中的/opt/module目录下的软件拷贝到192.168.138.66上;

scp -r 192.168.138.55:/opt/module/hadoop 192.168.138.66:/opt/module

    2.1.4 在192.168.138.77主机上,将0192.168.138.55服务器上的/opt/module目录下的软件拷贝到192.168.138.77上;

scp -r 192.168.138.55:/opt/module/hadoop 192.168.138.77:/opt/module

  2.2 rsync运城同步工具

    rsync远程同步工具,主要用于备份和镜像。具有速度块,避免复制相同内容和支持符号链接的优点;

    rsync和scp区别:用rsync做文件的复制要比scp的速度快,rsync只对差异文件做更新。scp是把所以文件都复制过去;

    2.2.1 查看rsync使用说明

man rsync | more

    2.2.2 基本语法

rsync -rvl     $pdir/$fname         $user@hadoop$host:$pdir
#命令 命令参数  要拷贝的文件路径/名称    目的用户@主机:目的路径

    2.2.3 选项说明

      

    2.2.4 将55机器上的/opt/sodtware目录同步到66服务器的/opt目录下

rsync -rvl /opt/software/* 192.168.138.66:/opt/software/

    2.2.5 原始拷贝

rsync  -rvl     /opt/module    192.168.138.77:/opt/

    2.2.6 脚本实现

#!/bin/bash
#1 获取输入参数个数,如果没有参数,直接退出
pcount=$#
if((pcount==0)); then
echo no args;
exit;
fi

#2 获取文件名称
p1=$1
fname=`basename $p1`
echo fname=$fname

#3 获取上级目录到绝对路径
pdir=`cd -P $(dirname $p1); pwd`
echo pdir=$pdir

#4 获取当前用户名称
user=`whoami`

#5 循环
for((host=102; host<104; host++)); do
       echo --------------------- hadoop$host ----------------
       rsync -rvl $pdir/$fname $user@hadoop$host:$pdir
done

    2.2.7 修改脚本xsync具有执行权限

chmod 777 xsync

    2.2.8 执行脚本文件

./xsync xsync 

3.集群配置

  1.集群部署规划

          hadoop55     hadoop66    hadoop77

    HDFS    NameNode      DataNode    SecondaryNameNode

          DataNode              DataNode

    YARN   NodeManager    ResourceManager

                    NodeManager    NodeManager

  2.配置集群(三台机器)

    2.1 配置core-site.xml文件【/hadoop/etc/hadoop】目录下

<configuration>
     <!--NameNode的IP地址和端口-->
     <property>
          <name>fs.defaultFS</name>
          <value>hdfs://hadoop102:9000</value>
     </property>
      <!--指定hadoop运行时产生文件的存储目录-->
      <property>
           <name>hadoop.tmp.dir</name>
           <value>/opt/module/hadoop/data/temp</value>
      </property>
</configuration>

    2.2 配置hdfs-site.xml文件

<configuration>
     <!--指定HDFS副本的数量-->
     <property>
         <name>dfs.replication</name>
       <value>3</value>
     </property>
    <property>
        <name>dfs.namenode.secondary.http-address</name>
        <value>hadoop104:50090</value>
    </property>
</configuration>

    2.3 配置hadoop-env.sh文件

# The java implementation to use.
export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.242.b08-0.el7_7.x86_64

    2.4 配置yarn-env.sh文件

# some Java parameters
export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.242.b08-0.el7_7.x86_64

    2.5 配置yarn-site.xml文件

<configuration>
<!-- Site specific YARN configuration properties -->
     <!-- Reducer获取数据的方式 -->
     <property>
        <name>yarn.nodemanager.aux-services</name>
        <value>mapreduce_shuffle</value>
     </property>
    <!-- 指定YARN的ResourceManager的地址 -->
    <property>
        <name>yarn.resourcemanager.hostname</name>
        <value>hadoop103</value>
    </property>
</configuration>

    2.6 配置mapred-env.sh问价

export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.242.b08-0.el7_7.x86_64

    2.7 配置mapred-site.xml文件

<configuration>
<!-- 指定MR运行在YARN上 -->
     <property>
        <name>mapreduce.framework.name</name>
        <value>yarn</value>
     </property>
</configuration>

    2.8 在集群上分发配置好的hadoop配置文件

./xsync /opt/module/hadoop/

4.集群单点启动

  4.1 如果集群是第一次启动,需要格式化NameNode

bin/hdfs namenode -format

    

  4.2 在hadoop55上启动NameNode

hadoop-daemon.sh start namenode

  4.3 在hadoop55,hadoop66,hadoop77上分别启动DataNode

hadoop-daemon.sh start datanode

  4.4 在hadoop77上启动SecondaryNameNode

hadoop-daemon.sh start secondarynamenode

  4.5 访问

    

  4.6 hadoop完全分布式环境下,DataNode正常启动,但是网页上显示DataNode节点

    解决方案如下:

      1.查看/etc/hosts是否配置了所有从节点的hostname到ip的映射关系;

      2.在namenode的机器上修改hafs.site.xml文件,加入配置后,DataNode重新启动

<property>
     <name>dfs.namenode.datanode.registration.ip-hostname-check</name>
     <value>false</value>
</property>

5.SSH无密登录配置

  5.1 配置ssh

    5.1.1 ssh基本原理

      SSH之所以能够保证安全,原因在于它采用了公钥加密,过程如下:

        1.远程主机收到用户的登录请求,把自己的公钥发给用户;

        2.用户使用这个公钥,将登录密码加密后,发送回来;

        3.远程主机用自己的私钥,解密登录密码,如果密码正确,就同意用户登录;

    5.1.2 基本语法

      假如用户名为java,登录远程主机名为Linux,命令如下:

        $ssh java@linux

      SSH默认端口为22,也就是说,你的登录请求会发进远程主机的22端口。使用p参数,可以修改这个端口,例如改为88端口,命令如下:

        $ssh -p 88@linux

      注意:如果出现错误提供:ssh:Could not resolve hostname linux:Name or service not known,则是因为Linux主机为添加本主机的Name Server中,故不能识别,需要在/etc/hosts里添加进该主机及对应IP即可:

        linux  192.168.138.102

  5.2 无密钥配置

    5.2.1 免密登录原理

      Master作为客户端,要实现无密码公钥认证,连接搭到服务器salve上时,需要在master上生成一个密钥对,包含一个公钥和一个私钥,而后将公钥复制到所以逇salve上。当master通过ssh连接salve是,salve就会生成一个随机数并用master的公钥对随机数进行加密,并发送给master。master收到加密数之后再用私钥解密,并将解密后数回传给slave确认解密数无误之后就允许master进行连接了。这就是一个公钥认证过程,其间不需要用户手工输入密码。

    5.2.2 在master主机(hadoop102)上生成一个无密码密钥对  

ssh-keygen -t rsa

      运行后询问其保存路径时直接回车即可,采用默认路径;

      生成的密钥对:id_rsa(私钥),id_rsa.pub(公钥),默认存储在‘/用户名/.ssh’目录下;

      

    5.2.3 查看密钥对

cd .ssh

      

    5.2.4 将master(hadoop102)节点上的公钥传送到远程主机上

ssh-copy-id hadoop103

      

      查看hadoop103是否传送成功

      

    5.2.5 测试无密码登录

ssh hadoop103

      

  5.3 ssh文件夹下的文件功能解释

    (1)known_hosts  :记录ssh访问过计算机的公钥(public key)
    (2)id_rsa   :生成的私钥
    (3)id_rsa.pub   :生成的公钥
    (4)authorized_keys  :存放授权过得无密登录服务器公钥

6.群起集群

  6.1 配置Slaves

cd /opt/module/hadoop/etc/hadoop/
vim slaves

    

    配置完成后,分发给其他节点

./xsync /opt/module/hadoop/etc/hadoop/

  6.2 启动集群

    6.2.1 如果第一次启动,需要格式化NameNode

bin/hdfs namenode -format

    6.2.2 在hadoop102机器上启动HDFS

start-dfs.sh

      

      

      

      

    6.2.3 在hadoop103机器上启动yarn

start-yarn.sh

      

       

      

      

    6.2.4 访问

      HDFS:http://192.168.138.102:50070

        

      YARN:http://192.168.138.103:8088

        

7.启动MapReduce程序进行测试

  7.1 在hadoop目录下创建一个文件夹名为wcinput

mkdir wcinput

  7.2 在wcinput文件夹里创建一个wc.input文件并编译

cd wcinput
touch wc.input
vim wc.input

    

  7.3 返回/opt/module/hadoop 目录下

  7.4 执行程序

hadoop fs -put wcinput /

    

  7.5 执行MapReduce程序

hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.8.0.jar wordcount /wcinput /wcoutput

    

  7.6 查看运行结果

hadoop fs -cat /wcoutput/*

8.集群启动/停止方式总结

  8.1 各个组件逐一启动/停止

    8.1.1 分别启动/停止hdfs组件

hadoop-daemon.sh  start|stop  namenode|datanode|secondarynamenode

    8.1.2 分别启动/停止yarn组件

yarn-daemon.sh  start|stop  resourcemanager|nodemanager

  8.2 各个模块分开启动/停止(配置ssh前提)常用

    8.2.1 整体启动/停止hdfs

start-dfs.sh 
stop-dfs.sh

    8.2.2 整体启动/停止yarn

start-yarn.sh 
stop-yarn.sh

 9.集群时间同步

  时间同步的方式:找一个机器,作为时间服务器,所有的机器与这台集群时间进行定时的同步,比如,每隔十分钟,同步一次时间。

  9.1 检查是否安装

rpm -qa|grep ntp

    

  9.2 查看ntpd服务是否开启 

service ntpd status

    

    如果开启需要关闭,然后进行下面的操作;

  9.3 修改ntp配置文件

vim /etc/ntp.conf

    9.3.1 修改1(授权192.168.1.0网段上的所有机器可以从这台机器上查询和同步时间)

#restrict 192.168.1.0 mask 255.255.255.0 nomodify notrap为
restrict 192.168.1.0 mask 255.255.255.0 nomodify notrap

    9.3.2 修改2(集群在局域网中,不使用其他的网络时间)

      

    9.3.3 添加3(当该节点丢失网络连接,依然可以作为时间服务器为集群中的其他节点提供时间同步)

server 127.127.1.0
fudge 127.127.1.0 stratum 10

  9.4 修改/etc/sysconfig/ntpd文件 

vim /etc/sysconfig/ntpd

    增加内容如下(让硬件时间与系统时间一起同步)

SYNC_HWCLOCK=yes

  9.5 重新启动ntpd服务

service ntpd start

  9.6 设置ntpd服务器开启启动

    9.6.1 在其他机器上配置1分钟与时间服务器同步一次

crontab -e

      编写内容如下:

*/1 * * * * /usr/sbin/ntpdate hadoop102

    9.6.2 修改任意机器的时间

date -s "2017-9-11 11:11:11"

    9.6.3 一分钟后查看机器是否与时间服务器同步

date

      

原文地址:https://www.cnblogs.com/wnwn/p/12521746.html