java大数据最全课程学习笔记(2)--Hadoop彻底分布式运行模式

目前CSDN,博客园,简书同步发表中,更多精彩欢迎访问个人gitee pageshtml

Hadoop彻底分布式运行模式

步骤分析:

  1. 准备3台客户机(关闭防火墙、静态ip、主机名称)node

    vim /etc/sysconfig/networkgit

    三台机器各自的配置分别为HOSTNAME=hadoop101;HOSTNAME=hadoop102;HOSTNAME=hadoop103web

    vim /etc/hostsshell

    三台机器都加入下面的映射关系vim

    192.168.1.101 hadoop101
    192.168.1.102 hadoop102
    192.168.1.103 hadoop103
  2. 安装JDK浏览器

  3. 配置环境变量安全

  4. 安装Hadoopbash

  5. 配置环境变量服务器

  6. 配置集群

  7. 单点启动

  8. 配置ssh

  9. 群起并测试集群

因为在上一章节已经配置好环境并测试了hadoop伪分布式开发模式,因此在此再也不赘述.

编写集群分发脚本xsync

  1. scp(secure copy) 安全拷贝(全量复制)

    1. scp定义

      scp能够实现服务器与服务器之间的数据拷贝.(from server1 to server2)

    2. 基本语法

      scp -r 源文件用户名A@主机名1:path1 目标文件用户名B@主机名2:path2

    3. 其余

      1. 若是从本机执行读取或写入,用户名B@主机名2:能够省略!
      2. 在主机1上,使用A用户读取path1的文件,再使用用户B登陆到主机2,在主机2的path2路径执行写入!
      3. 要求:
        1. 用户名A@主机名1 对path1有读权限
        2. 用户名B@主机名2 对path2有写权限
  2. rsync 远程同步工具

    rsync主要用于备份和镜像。具备速度快、避免复制相同内容和支持符号连接的优势。
    rsync和scp区别:用rsync作文件的复制要比scp的速度快,rsync只对差别文件作更新。scp是把全部文件都复制过去。

    rsync -rvlt path1 目标文件用户名B@主机名2:path2

    选项 功能
    -r 递归
    -v 显示复制过程
    -l 拷贝符号链接
    -t 基于文件的修改时间进行对比,只同步修改时间不一样的文件

    只能将本机的文件同步到其余机器!

    注意:path1是个目录,目录以/结尾,只会同步目录中的内容,不会同步目录自己!目录不以/结尾,同步目录中的内容,也会同步目录自己!

  3. 编写xsync集群分发脚本

    1. 需求:循环复制文件到全部节点的相同目录下,即将当前机器的文件,同步到集群全部机器的相同路径下!例如:hadoop102:/A/a , 执行脚本后,将此文件同步到集群中全部机器的 /A/a

    2. 需求分析:

      1. 用户在使用xsync时,只须要传入要同步的文件便可
        xysnc a
        无论a是一个相对路径仍是绝对路径,都须要将a转换为绝对路径!
      2. 文件的绝对路径:
        父路径: dirpath=$(cd dirname /home/atguigu/hi; pwd -P)
        文件名: filename=basename hi
        pwd -P为了不软连接没法获取到真实的父路径
      3. 核心命令:
        for(())
        do
        rsync -rvlt path1
        done
      4. 说明:在/home/atguigu/bin这个目录下存放的脚本,atguigu用户能够在系统任何地方直接执行。
    3. 脚本实现:

      [atguigu@hadoop102 ~]$ mkdir bin
      [atguigu@hadoop102 ~]$ cd bin/
      [atguigu@hadoop102 bin]$ touch xsync
      [atguigu@hadoop102 bin]$ vi xsync
      • 在该文件中编写以下代码

        #!/bin/bash
        #校验参数是否合法
        if(($#==0))
        then
        		echo 请输入要分发的文件!
        		exit;
        fi
        #拼接要分发文件的绝对路径
        dirpath=$(cd `dirname $1`; pwd -P)
        filename=`basename $1`
        
        echo 要分发的文件的路径是:$dirpath/$filename
        
        #循环执行rsync分发文件到集群的每台机器
        for((i=101;i<=103;i++))
        do
        		echo --------------hadoop$i-------------------
        		rsync -rvlt $dirpath/$filename atguigu@hadoop$i:$dirpath
        done
      • 修改脚本 xsync 具备执行权限

        [atguigu@hadoop102 bin]$ chmod 777 xsync

        或者

        [atguigu@hadoop102 bin]$ chmod u+x xsync
      • 调用脚本形式:xsync 文件名称

    4. 编写批量执行同一命令的脚本

      #!/bin/bash
      #在集群的全部机器上批量执行同一条命令
      if(($#==0))
      then
      		echo 请输入您要操做的命令!
      		exit;
      fi
      
      echo 要执行的命令是$*
      
      #循环执行此命令
      for((i=101;i<=103;i++))
      do
      		echo --------------hadoop$i-------------------
      		ssh hadoop$i $*
      done

集群配置

集群部署规划

hadoop101 hadoop102 hadoop103
HDFS NameNode DataNode DataNode SecondaryNameNode DataNode
YARN NodeManager ResourceManager NodeManager NodeManager

配置集群

  1. 核心配置文件

    • 配置core-site.xml

    [atguigu@hadoop102 hadoop]$ vi core-site.xml

    • 在该文件中编写以下配置
    <!-- 指定HDFS中NameNode的地址 -->
    <property>
    	<name>fs.defaultFS</name>
         <value>hdfs://hadoop101:9000</value>
    </property>
    <!-- 指定Hadoop运行时产生文件的存储目录 -->
    <property>
    	<name>hadoop.tmp.dir</name>
    	<value>/opt/module/hadoop-2.7.2/data/tmp</value>
    </property>
  2. HDFS配置文件

    • 配置hadoop-env.sh

      [atguigu@hadoop102 hadoop]$ vi hadoop-env.sh

      export JAVA_HOME=/opt/module/jdk1.8.0_144

    • 配置hdfs-site.xml

      [atguigu@hadoop102 hadoop]$ vi hdfs-site.xml

    • 在该文件中编写以下配置

      <property>
      	  <name>dfs.replication</name>
      	  <value>3</value>
      </property>
      <!-- 指定Hadoop辅助名称节点主机配置 -->
      <property>
           <name>dfs.namenode.secondary.http-address</name>
           <value>hadoop103:50090</value>
      </property>
  3. YARN配置文件

    • 配置yarn-env.sh

      [atguigu@hadoop102 hadoop]$ vi yarn-env.sh

      export JAVA_HOME=/opt/module/jdk1.8.0_144

    • 配置yarn-site.xml

      [atguigu@hadoop102 hadoop]$ vi yarn-site.xml

    • 在该文件中增长以下配置

      <!-- reducer获取数据的方式 -->
      <property>
      	  <name>yarn.nodemanager.aux-services</name>
      	  <value>mapreduce_shuffle</value>
      </property>
      <!-- 指定YARN的ResourceManager的地址 -->
      <property>
      	  <name>yarn.resourcemanager.hostname</name>
      	  <value>hadoop101</value>
      </property>
  4. MapReduce配置文件

    • 配置mapred-env.sh

      [atguigu@hadoop102 hadoop]$ vi mapred-env.sh

      export JAVA_HOME=/opt/module/jdk1.8.0_144

    • 配置mapred-site.xml

      [atguigu@hadoop102 hadoop]$ vi mapred-site.xml

    • 在该文件中增长以下配置

      <!-- 指定mr运行在yarn上 -->
      <property>
      	  <name>mapreduce.framework.name</name>
      	  <value>yarn</value>
      </property>
  5. 在集群上分发配置好的Hadoop配置文件

    [atguigu@hadoop102 hadoop]$ xsync /opt/module/hadoop-2.7.2/

  6. 查看文件分发状况

    xcall cat /opt/module/hadoop-2.7.2/etc/hadoop/core-site.xml

集群单点启动

  1. 若是集群是第一次启动,须要格式化NameNode

    [atguigu@hadoop102 hadoop-2.7.2]$ hadoop namenode -format

  2. 在hadoop102上启动NameNode

    [atguigu@hadoop102 hadoop-2.7.2]$ hadoop-daemon.sh start namenode
    [atguigu@hadoop102 hadoop-2.7.2]$ jps
    8118 NameNode
  3. 启动hadoop101,hadoop102,hadoop103上的DataNode

    [atguigu@hadoop102 hadoop-2.7.2]$ xcall hadoop-daemon.sh start datanode
    [atguigu@hadoop101 hadoop]$ xcall jps
    要执行的命令是jps
    --------------hadoop101-------------------
    8118 NameNode
    13768 Jps
    8238 DataNode
    --------------hadoop102-------------------
    8072 DataNode
    12959 Jps
    --------------hadoop103-------------------
    7347 DataNode
    13950 Jps

SSH无密登录配置

  1. 免密登陆原理

  2. 生成公钥和私钥

    [atguigu@hadoop102 .ssh]$ ssh-keygen -t rsa

    而后敲(三个回车),就会生成两个文件id_rsa(私钥)、id_rsa.pub(公钥)

  3. 将公钥拷贝到要免密登陆的目标机器上的/home/atguigu/.ssh目录下的authorized_keys中

    如下命令能够直接完成上述操做

    [atguigu@hadoop102 .ssh]$ ssh-copy-id hadoop101
    [atguigu@hadoop102 .ssh]$ ssh-copy-id hadoop102
    [atguigu@hadoop102 .ssh]$ ssh-copy-id hadoop103
  4. .ssh文件夹下(~/.ssh)的文件功能解释

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

登陆状态的环境变量

  • Login Shell

    是指登陆时,须要提供用户名密码的shell,如:su – user1 , 图形登陆, ctrl+alt+F2-6进入的登陆界面。

    • 这种Login shell 执行脚本的顺序:
      1. /etc/profile 【全局profile文件;它定义了LoginUser的 PATH, USER, LOGNAME(登陆使用者账号)】
      2. /etc/profile.d/目录下的脚本
      3. ~/.bash_profile 【搜索命令的路径 ——————- 登陆级别 环境变量配置文件 】
      4. ~/.bashrc 【存储用户设定的别名和函数 ———- shell级别 环境变量配置文件】
      5. /etc/bashrc 【全局bashrc文件; 它主要定义一些 Function 和 Alias;更改/etc/bashrc会影响到全部用户,由root用户管理。】
  • Non-Login shell

    • 登陆终端后,使用ssh 登陆 其余机器!
    • 非登陆shell指的是,不须要输入用户名密码的shell,如图形下 右键terminal,或ctrl+shift+T打开的shell
    • 这种Non-Login shell 执行登陆脚本的顺序:
      1. ~/.bashrc
      2. /etc/bashrc
      3. /etc/profile.d/目录下的脚本
  • ssh 目标机器
    登陆以后,执行某个命令!
    属于Login-shell,会自动读取 /etc/profile文件中定义的全部的变量!

  • ssh 目标机器 命令
    属于Non-Login-shell
    不会读取/etc/profile
    若是在使用命令时,咱们须要使用/etc/profile定义的一些变量,须要在目标机器的对应的用户的家目录/.bashrc中添加如下代码

    source /etc/profile

    若是不添加以上代码,在执行start-all.sh | stop-all.sh必定会报错!

群起集群

群起脚本的原理是获取集群中全部的节点的主机名
默认读取当前机器 HADOOP_HOME/etc/hadoop/slaves,获取集群中全部的节点的主机名

循环执行 ssh 主机名 hadoop-daemon.sh start xxx
保证当前机器到其余节点,已经配置了ssh免密登陆
保证集群中全部当前用户的家目录/.bashrc中,已经配置source /etc/profile

  1. 配置slaves

    /opt/module/hadoop-2.7.2/etc/hadoop/slaves
    [atguigu@hadoop102 hadoop]$ vi slaves

    在文件中增长以下内容:

    hadoop101
    hadoop102
    hadoop103

    注意:该文件中添加的内容结尾不容许有空格,文件中不容许有空行。

  2. 启动集群

    1. 若是集群是第一次启动,须要格式化NameNode

      [atguigu@hadoop102 hadoop-2.7.2]$ hdfs namenode -format

    2. 启动HDFS

      [atguigu@hadoop101 hadoop]$ start-dfs.sh
      [atguigu@hadoop101 hadoop]$ xcall jps
      要执行的命令是jps
      --------------hadoop101-------------------
      8118 NameNode
      13768 Jps
      8238 DataNode
      --------------hadoop102-------------------
      8072 DataNode
      12959 Jps
      --------------hadoop103-------------------
      7473 SecondaryNameNode
      7347 DataNode
      13950 Jps
    3. 启动YARN

      [atguigu@hadoop103 hadoop-2.7.2]$ start-yarn.sh

    4. web端查看SecondaryNameNode

      1. 浏览器中输入:http://hadoop103:50090/status.html
      2. 查看SecondaryNameNode信息

  3. 集群基本测试

    1. hadoop fs -mkdir /wcinput

    2. hadoop fs -put hi /wcinput/

    3. hadoop jar /opt/module/hadoop-2.7.2/share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.2.jar wordcount /wcinput/ /wcoutput

集群启动/中止方式总结

  1. 各个服务组件逐一启动/中止

    1. 分别启动/中止HDFS组件

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

    2. 启动/中止YARN

      yarn-daemon.sh start / stop resourcemanager / nodemanager

  2. 各个模块分开启动/中止(配置ssh是前提)

    1. 总体启动/中止HDFS

      start-dfs.sh / stop-dfs.sh

    2. 总体启动/中止YARN

      start-yarn.sh / stop-yarn.sh

  3. 启动历史服务器

    mr-jobhistory-daemon.sh start historyserver

集群时间同步

每台虚拟机做以下设置便可保证时间同步

也可设置定时同步时间的任务

crontab -e

* */1 * * * ntpdate -u ntp7.aliyun.com

其余注意事项

  1. start-all.sh实际上是分别调用了start-dfs.sh和start-yarn.sh,现已过期不建议使用.
  2. stop-all.sh同理.
  3. start-dfs.sh能够在集群的任意一台机器使用!能够启动HDFS中的全部进程!
  4. start-yarn.sh在集群的非RM所在的机器使用,不会启动resourcemanager!

建议:

只须要配置RM所在机器到其余机器的SSH免密登陆! 都在RM所在的机器执行群起和群停脚本! xsync和xcall只放在RM所在的机器便可!

相关文章
相关标签/搜索