Hadoop入门

180 阅读3分钟

Hadoop概述

1.Hadoop是apache基金会开发的分布式基础架构
2.主要解决海量数据的存储和分析计算问题
3.广义来说Hadoop通常指的是更广泛的概念-Hadoop生态圈

Hadoop优势

1.高可靠性:多副本机制,即使某个节点出现故障也不会导致数据的丢失
2.高扩展性:在集群件分配任务数据,可方便的扩展节点
3.高效性:并行计算可以加快任务处理速度
4.高容错性:能够自动将失败的任务自动分配

Hadoop组成

1.HDFS:分布式文件系统
    1.1 NameNode:存储文件的元数据,如文件名,目录结构,文件属性,及每个文件的块列表和其所在的DataNode
    1.2 DataNode:在本地文件系统中存储文件块数据及数据的校检和
    1.3 SecondaryNameNode:每隔一段时间对NameNode元数据备份
2.Yarn:资源管理器
    2.1 ResourceManager(RM):整个集群资源的(内存、cpu等)的老大
    2.2 NodeManager(NM):单个节点服务器的老大
    2.3 ApplicationMaster(AM):单个任务运行的老大
    2.4 Container:容器,相当于一台独立的服务器,里面装了任务运行所需要的资源
3.MapReduce:MapReduce将计算过程分为两个阶段:Map和Reduce
    3.1 Map阶段并行处理输入数据
    3.2 Reduce阶段对Map结果进行汇总

Hadoop完全分布式运行环境搭建(3台虚拟机)

1.关闭防火墙,

    systemctl status firewalld //查看防火墙状态
    systemctl stop firewalld //关闭防火墙
    systemctl disable firewalld //禁止防火墙开机自启

2.创建用户和密码

    useradd wsl(个人用户名) //创建用户
    passwd wsl(个人设置的密码) //设置密码

3.配置用户具有root权限

    修改/etc/sudoers文件,在 %wheel 下面一行添加
    wsl ALL=(ALL) NOPASSWD:ALL

4.在/opt 目录下创建文件夹并修改所属组和所属主

     4.1 创建目录:
         mkdir /opt/module (该目录用于存放软件)
     4.2 修改文件的所有者和所属组均为wsl用户:
         chown wsl:wsl /opt/module

5. 卸载虚拟机自带的jdk

     5.1 查看自带的jdk信息
        java -version
     5.2 查找jdk文件
        rpm -qa | grep java
     5.3 删除文件
         rpm -e --nodeps 查找出来的文件

6. 修改主机名和ip地址

    6.1 修改IP地址
        vim /etc/sysconfig/network-scripts/ifcfg-ens33 打开配置文件
             ONBOOT=yes
             BOOTPROTO=static
             NAME="ens33"
             IPADDR=192.168.84.11
             PREFIX=24
             GATEWAY=192.168.84.2
             DNS1=192.168.84.2
    6.2 虚拟机设置为NAT模式
    6.3 修改主机名
        vim /etc/hostname
         wsl01
    6.4 配置主机名映射
        vim /etc/hosts
         192.168.84.11  wsl01
         192.168.84.12  wsl02
         192.168.84.13  wsl03

7. 安装jdk

    7.1 上传jdk到 /opt/module 目录下并解压
     tar -zxvf xxx.tar.gz
    7.2 配置环境变量
        1. 打开配置文件:
            vim /etc/profile
        2. 添加环境变量
            #JAVA_HOME
            export JAVA_HOME=/opt/module/jdk1.8.0_212
            export PATH=$PATH:$JAVA_HOME/bin
        3. 退出并使配置文件生效
            :wq 退出 
            source /etc/profile 生效
         4. 测试是否生效
             java -version

8. 安装Hadoop

    8.1 创建Hadoop到/opt/module 并解压
        tar -zxvf xxxx.tar.gz
    8.2 配置环境变量
        1. 打开配置文件:
            vim /etc/profile
        2. 添加环境变量
           #HADOOP_HOME
            export HADOOP_HOME=/opt/module/hadoop-3.1.3
            export PATH=$PATH:$HADOOP_HOME/bin
            export PATH=$PATH:$HADOOP_HOME/sbin
        3. 退出并使配置文件生效
            :wq 退出 
            source /etc/profile 生效
         4. 测试是否生效
             hadoop version

9. 编写集群分发脚本

    9.1 安装 rsync远程同步工具
        yum -y install rsync
    9.2 把分发脚本放在声明了全局变量的路径里
        1. echo $PATH
            /usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/bin:/sbin:/opt/module/jdk1.8.0_212/bin:/opt/module/hadoop-3.1.3/bin:/opt/module/hadoop-3.1.3/sbin:/opt/module/hive/bin:/home/wsl/.local/bin:/home/wsl/bin
        2. 在/home/wsl/bin 目录下创建xsync文件
            vim xsync.sh
            #!/bin/bash
            #1. 判断参数个数
            if [ $# -lt 1 ]
            then
                echo Not Enough Arguement!
                exit;
            fi
            #2. 遍历集群所有机器
            for host in wsl01 wsl02 wsl03
            do
                echo =====  $host  ======
                #3. 遍历所有目录,挨个发送
                for file in $@
                do
                    #4. 判断文件是否存在
                    if [ -e $file ]
                        then
                            #5. 获取父目录
                            pdir=$(cd -P $(dirname $file); pwd)
                            #6. 获取当前文件的名称
                            fname=$(basename $file)
                            ssh $host "mkdir -p $pdir"
                            rsync -av $pdir/$fname $host:$pdir
                        else
                            echo $file does not exists!
                    fi
                 done
              done
        3.修改脚本执行权限
            chmod +x xsync

10 ssh免密登录

   1. 生成公钥和密钥
       wsl01、wsl02、wsl03:ssh-keygen -t rsa
   2. 互相拷贝公钥到要免密的机器上
       ssh-copy-id 目标主机

11 集群时间同步

  1. 查看所有节点的ntpd服务状态和开机自启状态
      systemctl status ntpd
      systemctl start ntpd
      systemctl is-enabled ntpd
  2. 修改ntp.conf配置文件
      2.1 vim /etc/ntp.conf
      (a)修改1(授权192.168.84.0-192.168.84.255网段上的所有机器可以从这台机器上查询和同步时间)
            #restrict 192.168.84.0 mask 255.255.255.0 nomodify notrap
            为restrict 192.168.84.0 mask 255.255.255.0 nomodify notrap
      (b)修改2(集群在局域网中,不使用其他互联网上的时间)
            server 0.centos.pool.ntp.org iburst
            server 1.centos.pool.ntp.org iburst
            server 2.centos.pool.ntp.org iburst
            server 3.centos.pool.ntp.org iburst
            为
            # server 0.centos.pool.ntp.org iburst
            # server 1.centos.pool.ntp.org iburst
            # server 2.centos.pool.ntp.org iburst
            # server 3.centos.pool.ntp.org iburst
      (c)添加3(当该节点丢失网络连接,依然可以采用本地时间作为时间服务器为集群中的其他节点提供时间同步)
        server 127.127.1.0
        fudge 127.127.1.0 stratum 10
      2.3.修改wsl01的/etc/sysconfig/ntpd 文件
           vim /etc/sysconfig/ntpd
           增加内容如下(让硬件时间与系统时间一起同步)
           SYNC_HWCLOCK=yes
      2.4.重新启动ntpd服务
             systemctl start ntpd
      2.5.设置ntpd服务开机启动
            systemctl enable ntpd
  3. 其他机器配置
      3.1 关闭所有节点上ntp服务和自启动
          wsl02:sudo systemctl stop ntpd
          wsl02:sudo systemctl disable ntpd
          wsl03:sudo systemctl stop ntpd
          wsl03:sudo systemctl disable ntpd
      3.2 在其他机器配置1分钟与时间服务器同步一次
          wsl02: crontab -e
          编写定时任务如下:
            */1 * * * * /usr/sbin/ntpdate wsl01
          wsl03 同上

12 集群配置

1.部署规划

wsl01wsl02wsl03
HDFSNameNode,DataNodeDataNodeDataNode,SecondaryNameNode
YARNNodeManagerResourceManager,NodeManagerNodeManager

2.配置文件

 2.1 配置core-site.xml
     <?xml version="1.0" encoding="UTF-8"?>
     <?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
     <configuration>
            <!-- 指定NameNode的地址 -->
            <property>
                <name>fs.defaultFS</name>
                <value>hdfs://wsl01:8020</value>
            </property>
            <!-- 指定hadoop数据的存储目录 -->
            <property>
                <name>hadoop.tmp.dir</name>
                <value>/opt/module/hadoop-3.1.3/data</value>
            </property>
            <!-- 配置HDFS网页登录使用的静态用户为wsl -->
            <property>
                <name>hadoop.http.staticuser.user</name>
                <value>wsl</value>
            </property>
      </configuration>
2.2 配置hdfs-site.xml
    <?xml version="1.0" encoding="UTF-8"?>
    <?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
    <configuration>
       <!-- nn web端访问地址-->
       <property>
            <name>dfs.namenode.http-address</name>
            <value>wsl01:9870</value>
        </property>
       <!-- 2nn web端访问地址-->
        <property>
            <name>dfs.namenode.secondary.http-address</name>
            <value>wsl03:9868</value>
        </property><!--关闭默认权限检查-->
        <property>
            <name>dfs.permissions.enabled</name>
            <value>false</value>
        </property>
    </configuration>
2.3 配置 yarn-site.xml
    <?xml version="2.0"?>
    <configuration>
    <!-- Site specific YARN configuration properties -->
            <!-- 指定MR走shuffle -->
        <property>
            <name>yarn.nodemanager.aux-services</name>
            <value>mapreduce_shuffle</value>
        </property>
        <!-- 指定ResourceManager的地址-->
        <property>
            <name>yarn.resourcemanager.hostname</name>
            <value>wsl02</value>
        </property>
        <!-- 环境变量的继承 -->
        <property>
            <name>yarn.nodemanager.env-whitelist</name>
            <value>JAVA_HOME,HADOOP_COMMON_HOME,HADOOP_HDFS_HOME,HADOOP_CONF_DIR,CLASSPATH_PREPEND_DISTCACHE,HADOOP_YARN_HOME,HADOOP_MAPRED_HOME</value>
        </property>

        <!-- 开启日志聚集功能 -->
        <property>
            <name>yarn.log-aggregation-enable</name>
            <value>true</value>
        </property>
        <!-- 设置日志聚集服务器地址 -->
        <property>
            <name>yarn.log.server.url</name>
            <value>http://wsl01:19888/jobhistory/logs</value>
        </property>
        <!-- 设置日志保留时间为7天 -->
        <property>
            <name>yarn.log-aggregation.retain-seconds</name>
            <value>604800</value>
        </property>

                <!--  取消物理内存检查  -->
        <property>
                <name>yarn.nodemanager.pmem-check-enabled</name>
                <value>false</value>
        </property>
        <!--  取消虚拟内存检查  -->
        <property>
                <name>yarn.nodemanager.vmem-check-enabled</name>
                <value>false</value>
        </property>
   </configuration>
2.4 配置mapred-site.xml
    <?xml version="1.0"?>
    <?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
    <configuration>
        <!-- 指定MapReduce程序运行在Yarn上 -->
            <property>
                <name>mapreduce.framework.name</name>
                <value>yarn</value>
            </property>
        <!-- 历史服务器端地址 -->
        <property>
            <name>mapreduce.jobhistory.address</name>
            <value>wsl01:10020</value>
        </property>

        <!-- 历史服务器web端地址 -->
        <property>
            <name>mapreduce.jobhistory.webapp.address</name>
            <value>wsl01:19888</value>
        </property>
    </configuration> 
2.5 配置hadoop.env.sh
    # 添加jdk的路径
    export  JAVA_HOME=/opt/module/jdk1.8.0_212
2.6 配置works
    vim /opt/module/hadoop-3.1.3/etc/hadoop/workers
     wsl01
     wsl02
     wsl03
2.7 分发
    xsync /opt/module/hadoop-3.1.3/etc

3.启动集群

1. 如果集群第一次启动需要在wsl01格式化NameNode
    wsl01:hdfs namenode -format
2. 启动HDFS
    wsl01: start-dfs.sh
3. 在配置了ResourceManager的节点启动yarn
    wsl02: start-yarn.sh
4. 启动历史服务器
    wsl01: mapred --daemon start historyserver
5. 浏览器查看运行情况
    web端查看HDFS的namenode
    http://wsl01:9870
    web端查看yarn的resourcemanager
    http://wsl02:8088
    web端查看历史服务
    http://wsl01:19888/jobhistory

4.编写启动脚本

1.hadoop集群启停脚本
    cd /home/wsl/bin
    vim hadoop.sh
    #!/bin/bash
    if [ $# -lt 1 ]
    then
        echo "No Args Input..."
        exit ;
    fi
    case $1 in
    "start")
            echo " =================== 启动 hadoop集群 ==================="
            echo " --------------- 启动 hdfs ---------------"
            ssh wsl01 "/opt/module/hadoop-3.1.3/sbin/start-dfs.sh"
            echo " --------------- 启动 yarn ---------------"
            ssh wsl02 "/opt/module/hadoop-3.1.3/sbin/start-yarn.sh"
            echo " --------------- 启动 historyserver ---------------"
            ssh wsl01 "/opt/module/hadoop-3.1.3/bin/mapred --daemon start historyserver"
    ;;
    "stop")
            echo " =================== 关闭 hadoop集群 ==================="
            echo " --------------- 关闭 historyserver ---------------"
            ssh wsl01 "/opt/module/hadoop-3.1.3/bin/mapred --daemon stop historyserver"
            echo " --------------- 关闭 yarn ---------------"
            ssh wsl02 "/opt/module/hadoop-3.1.3/sbin/stop-yarn.sh"
            echo " --------------- 关闭 hdfs ---------------"
            ssh wsl01 "/opt/module/hadoop-3.1.3/sbin/stop-dfs.sh"
    ;;
    *)
        echo "Input Args Error..."
    ;;
    esac
2. 查看java进程脚本
    cd /home/wsl/bin
    vim jspall.sh
    #!/bin/bash
    for host in wsl01 wsl02 wsl03
    do
            echo =============== $host ===============
            ssh $host jps
    done

5.常用端口说明

端口名hadoop2.xhadoop3.x
NameNode内部通信端口8020/90008020/9000/9820
NameNode HTTP UI500709870
MapReduce查看执行任务端口80888088
历史服务器通信端口1988819888