美文网首页
3_大数据之Hadoop完全分布式

3_大数据之Hadoop完全分布式

作者: 十丈_红尘 | 来源:发表于2019-05-24 21:22 被阅读0次

    目录 :
     1)准备3台客户机(关闭防火墙、静态ip、主机名称)
     2)安装JDK
     3)配置环境变量
     4)安装Hadoop
     5)配置环境变量
     6)配置集群
     7)单点启动
     8)配置ssh
     9)群起并测试集群


    一 虚拟机准备
    #!/bin/bash
    #环境初始化脚本V1.0
    #V2.0待优化项:
    #   1. 增加下载相关软件操作:例如下载JDK mysql等 ----> 相关命令wget Curl Axel
    #   2. 完成下载软件的配置修改操作:例如修改mysql hadoop配置等 ----> sed
    #   3. 读取用户输入指令交互优化:在合适的地方提示用户输入相关内容 ----> 参考VMTools安装交互过程
    #   4. 加入检查机制:例如判断文件是否存在,用户是否已经被创建等操作 ----> if
    #   5. 加入容错机制:执行过程中发生Error以后的处理逻辑 ----> 
    #   6. 增加下载前软件安装情况检查等 ----> 待考虑点是否需要增加用户选择逻辑
    #   7. 难点 : 
    #           1. 下载过程中网络波动问题导致文件下载失败;
    #           2. 部分软件需要登录才能下载例如JDK,实现方式选择 : 携带签名访问或者通过三方资源站点下载
    
    #读取用户输入
    read -t 10 -p "Enter your user name in 10 seconds " username
    read -t 10 -p "Enter your folder name in 10 seconds " foldernameone
    read -t 10 -p "Enter your folder name in 10 seconds " foldernametwo
    read -t 10 -p "Enter your starting value in 10 seconds " minvalue
    read -t 10 -p "Enter your end value in 10 seconds " maxvalue
    read -t 10 -p "Enter your ip number in 10 seconds " ip
    
    
    #关闭防火墙
    echo "关闭防火墙"
    service iptables stop
    chkconfig iptables off
    
    #创建一个一般用户
    echo "创建一般用户"
    useradd $username
    echo "123456" | passwd $username --stdin
    
    #创建目录
    echo "创建目录"
    mkdir /opt/$foldernameone /opt/$foldernametwo
    chown $username:$username /opt/$foldernameone /opt/$foldernametwo
    
    #加入Sudoers
    echo "加入Sudoers"
    sed -i "/^root/a $username ALL=(ALL)       NOPASSWD: ALL" /etc/sudoers
    
    
    lan=`ifconfig | grep Bcast | cut -d . -f 3`
    #改Host
    echo "修改hosts"
    for ((i=$minvalue;i<$maxvalue;i++))
    do
        echo "192.168.$lan.$i hadoop$i" >> /etc/hosts
    done
    
    #改网卡
    echo "修改网卡"
    cat <<EOF >/etc/sysconfig/network-scripts/ifcfg-eth0
    DEVICE=eth0
    TYPE=Ethernet
    ONBOOT=yes
    BOOTPROTO=static
    IPADDR=192.168.$lan.$ip
    PREFIX=24
    GATEWAY=192.168.$lan.2
    DNS1=192.168.$lan.2
    NAME=eth0
    EOF
    
    #改主机名
    echo "修改主机"
    sed -i "s/HOSTNAME=.*/HOSTNAME=hadoop$ip/g" /etc/sysconfig/network
    
    #改网卡脚本
    echo "修改网卡"
    sed -i '/eth0/d' /etc/udev/rules.d/70-persistent-net.rules 
    sed -i 's/eth1/eth0/g' /etc/udev/rules.d/70-persistent-net.rules
    
    #重启使配置生效
    reboot
    

    二 编写集群分发脚本xsync
    1. scp(secure copy)安全拷贝

    (1)scp定义:
      scp可以实现服务器与服务器之间的数据拷贝。(from server1 to server2)
    (2)基本语法
      scp -r $pdir/$fname $user@hadoop$host:$pdir/$fname
      命令 递归 要拷贝的文件路径/名称 目的用户@主机:目的路径/名称
    (3)案例实操
      (a)在hadoop101上,将hadoop101/opt/module目录下的软件拷贝到hadoop102上 : scp -r /opt/module root@hadoop102:/opt/module
      (b)在hadoop103上,将hadoop101服务器上的/opt/module目录下的软件拷贝到hadoop103上.
      (c)在hadoop103上操作将hadoop101/opt/module目录下的软件拷贝到hadoop104上 : scp -r root@hadoop101:/opt/module root@hadoop104:/opt/module
    注意:拷贝过来的/opt/module目录,别忘了在hadoop102、hadoop103、hadoop104上修改所有文件的,所有者和所有者组。sudo chown xxx:xxx -R /opt/module
      (d)将hadoop101/etc/profile文件拷贝到hadoop102/etc/profile上 : sudo scp /etc/profile root@hadoop102:/etc/profile
      (e)将hadoop101/etc/profile文件拷贝到hadoop103/etc/profile上 : sudo scp /etc/profile root@hadoop103:/etc/profile
      (f)将hadoop101/etc/profile文件拷贝到hadoop104/etc/profile
      注意:拷贝过来的配置文件别忘了source一下/etc/profile

    1. rsync 远程同步工具
      rsync主要用于备份和镜像。具有速度快、避免复制相同内容和支持符号链接的优点。
      rsyncscp区别:用rsync做文件的复制要比scp的速度快,rsync只对差异文件做更新。scp是把所有文件都复制过去

    (1)基本语法
    rsync -av $pdir/$fname $user@hadoop$host:$pdir/$fname
    命令 选项参数 要拷贝的文件路径/名称 目的用户@主机:目的路径/名称
    选项参数说明

    (2)案例实操
      (a)把hadoop101机器上的/opt/software目录同步到hadoop102服务器的root用户下的/opt/目录 : rsync -av /opt/software/ hadoop102:/opt/software
    1. xsync集群分发脚本

    (1)需求:循环复制文件到所有节点的相同目录下
    (2)需求分析:
      (a)rsync命令原始拷贝:rsync -av /opt/module root@hadoop103:/opt/
      (b)期望脚本:xsync要同步的文件名称
      (c)说明:在/home/xxx/bin这个目录下存放的脚本,xxx用户可以在系统任何地方直接执行。
    (3)脚本实现
      (a)在/home/xxx目录下创建bin目录,并在bin目录下xsync创建文件,文件内容如下

    #!/bin/bash
    # mkdir bin
    # cd bin/
    # touch xsync
    # vi xsync
    # 在该文件中编写如下代码
    #1. 判断参数个数
    if [ $# -lt 1 ]
    then
       echo Not Enough Arguement!
       exit;
    fi
    
    #2. 遍历所有目录,挨个发送
    for file in $@
    do
       #4.5 判断文件是否存在
       if [ -e $file ]
       then
           #3. 获取父目录
           pdir=$(cd -P $(dirname $file); pwd)
           
           #4. 获取当前文件的名称
           fname=$(basename $file)
             
           #5. 遍历集群所有机器,拷贝
           for host in hadoop102 hadoop103 hadoop104
           do
               echo ====================    $host    ====================
               rsync -av $pdir/$fname $USER@$host:$pdir
           done
       else
           echo $file does not exists!
       fi
    done
    

    (b)修改脚本xsync具有执行权限 : chmod 777 xsync
    (c)调用脚本形式:xsync 文件名称
    注意:如果将xsync放到/home/xxx/bin目录下仍然不能实现全局使用,可以将xsync移动到/usr/local/bin目录下

    1. SSH无密登录配置
    1. 配置ssh
      (1)基本语法 : ssh另一台电脑的ip地址;
      (2)ssh连接时出现Host key verification failed的解决方法
      (3)解决方案如下:直接输入yes
    2. 无密钥配置
      (1)免密登录原理
      (2)生成公钥和私钥 : ssh-keygen -t rsa
      (3)将公钥拷贝到要免密登录的目标机器上
    ssh-copy-id hadoop102
    ssh-copy-id hadoop103
    ssh-copy-id hadoop104
    

    注意:
    还需要在hadoop102上采用root账号,配置一下无密登录到hadoop102、hadoop103、hadoop104; &emsp;还需要在hadoop103上采用xxx账号配置一下无密登录到hadoop102、hadoop103、hadoop104服务器上。

    1. .ssh文件夹下(~/.ssh)的文件功能解释

    三 集群配置
    1. 集群部署规划
    2. 配置集群

    (1)核心配置文件->配置core-site.xml : vim core-site.xml

    <!-- 指定HDFS中NameNode的地址 -->
    <property>
         <name>fs.defaultFS</name>
         <value>hdfs://hadoop102: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 : vim hadoop-env.sh export JAVA_HOME=/opt/module/jdk1.8.0_144
       配置hdfs-site.xml : vim hdfs-site.xml

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

    (3)YARN配置文件
     配置yarn-env.sh : vim yarn-env.sh
    export JAVA_HOME=/opt/module/jdk1.8.0_144
     配置yarn-site.xml : vim 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>hadoop103</value>
    </property>
    

    (4)MapReduce配置文件
     配置mapred-env.sh : vim mapred-env.sh export JAVA_HOME=/opt/module/jdk1.8.0_144
     配置mapred-site.xml : cp mapred-site.xml.template mapred-site.xml vim mapred-site.xml

    <!-- 指定MR运行在Yarn上 -->
    <property>
         <name>mapreduce.framework.name</name>
         <value>yarn</value>
    </property>
    
    1. 在集群上分发配置好的Hadoop配置文件 : xsync /opt/module/hadoop-2.7.2/
    2. 查看文件分发情况 : cat /opt/module/hadoop-2.7.2/etc/hadoop/core-site.xml

    四 集群单点启动

    (1)如果集群是第一次启动,需要格式化NameNode : hdfs namenode -format
    (2)在hadoop102上启动NameNode : hadoop-daemon.sh start namenode jps
    (3)在hadoop102hadoop103以及hadoop104上分别启动DataNode

    hadoop-daemon.sh start datanode
    jps
    

    (4)思考:每次都一个一个节点启动,如果节点数增加到1000个怎么办?


    五 集群群起
    1. 配置slaves : vim /opt/module/hadoop-2.7.2/etc/hadoop/slaves
    hadoop102
    hadoop103
    hadoop104
    # 注意:该文件中添加的内容结尾不允许有空格,文件中不允许有空行
    

     同步所有节点配置文件 : xsync slaves

    1. 启动集群

    (1)如果集群是第一次启动,需要格式化NameNode(注意格式化之前,一定要先停止上次启动的所有namenodedatanode进程,然后再删除datalog数据): bin/hdfs namenode -format
    (2)启动HDFS : sbin/start-dfs.sh
    (3)启动YARN : sbin/start-yarn.sh
    注意:NameNode和ResourceManger如果不是同一台机器,不能在NameNode上启动 YARN,应该在ResouceManager所在的机器上启动YARN
    (4)Web端查看SecondaryNameNode
     (a)浏览器中输入:http://hadoop104:50090/status.html
     (b)查看SecondaryNameNode信息

    1. 集群基本测试

    (1)上传文件到集群
    hdfs dfs -mkdir -p /user/xxx/input
    hdfs dfs -put wcinput/wc.input /user/xxx/input
    (2)上传文件后查看文件存放在什么位置
     (a)查看HDFS文件存储路径 : pwd
     (b)查看HDFS在磁盘存储文件内容 : cat blk_1073741825
    (3)拼接 cat blk_1073741836>>tmp.file
    (4)打包 tar -zxvf tmp.file
    (5)下载 bin/hadoop fs -get /user/xxx/input/hadoop-2.7.2.tar.gz ./


    六 集群启动/停止方式总结

    1.各个服务组件逐一启动/停止
    (1)分别启动/停止HDFS组件 : hadoop-daemon.sh start / stop namenode / datanode / secondarynamenode
    (2)启动/停止YARN : yarn-daemon.sh start / stop resourcemanager / nodemanager

    1. 各个模块分开启动/停止(配置ssh是前提)常用
      (1)整体启动/停止HDFS : start-dfs.sh / stop-dfs.sh
      (2)整体启动/停止YARN : start-yarn.sh / stop-yarn.sh
    七 集群时间同步
    时间同步的方式:找一个机器,作为时间服务器,所有的机器与这台集群时间进行定时的同步,比如,每隔十分钟,同步一次时间

    配置时间同步具体操作 :

    1. 时间服务器配置(必须root用户)
      (1)检查ntp是否安装 : rpm -qa|grep ntp (2)修改ntp配置文件 : vim /etc/ntp.conf
    a)修改1(授权192.168.1.0-192.168.1.255网段上的所有机器可以从这>>台机器上查询和同步时间)
    #restrict 192.168.1.0 mask 255.255.255.0 nomodify notrap为
    restrict 192.168.1.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
    

    (3)修改/etc/sysconfig/ntpd文件 : vim /etc/sysconfig/ntpd

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

    (4)重新启动ntpd服务 : service ntpd status ntpd 已停 service ntpd start 正在启动 ntpd: [确定]
    (5)设置ntpd服务开机启动 : chkconfig ntpd on

    1. 其他机器配置(必须root用户)
      (1)在其他机器配置10分钟与时间服务器同步一次 : crontab -e */10 * * * * /usr/sbin/ntpdate hadoop102
      (2)修改任意机器时间 : date -s "2017-9-11 11:11:11"
      (3)十分钟后查看机器是否与时间服务器同步 date

    Hadoop编译源码

    1️⃣前期准备工作

    1. CentOS联网
      配置CentOS能连接外网。Linux虚拟机ping www.baidu.com 是畅通的
      注意:采用root角色编译,减少文件夹权限出现问题
    2. jar包准备(hadoop源码、JDK8mavenantprotobuf)

    2️⃣jar包安装 : 注意:所有操作必须在root用户下完成

    1. JDK解压、配置环境变量 JAVA_HOMEPATH,验证java -version(如下都需要验证是否配置成功)
    tar -zxf jdk-8u144-linux-x64.tar.gz -C /opt/module/
    vim /etc/profile
    #JAVA_HOME:
    export JAVA_HOME=/opt/module/jdk1.8.0_144
    export PATH=$PATH:$JAVA_HOME/bin
    source /etc/profile
    
    1. Maven解压、配置 MAVEN_HOMEPATH
    tar -zxvf apache-maven-3.0.5-bin.tar.gz -C /opt/module/
    vim conf/settings.xml
    
    <mirrors>
       <!-- mirror
        | Specifies a repository mirror site to use instead of a given >>repository. The repository that
        | this mirror serves has an ID that matches the mirrorOf element of >>this mirror. IDs are used
        | for inheritance and direct lookup purposes, and must be unique >>across the set of mirrors.
        |
    <mirror>
          <id>mirrorId</id>
          <mirrorOf>repositoryId</mirrorOf>
          <name>Human Readable Name for this Mirror.</name>
          <url>http://my.repository.com/repo/path</url>
         </mirror>
        -->
          <mirror>
                   <id>nexus-aliyun</id>
                   <mirrorOf>central</mirrorOf>
                  <name>Nexus aliyun</name>
                   <url>http://maven.aliyun.com/nexus/content/groups/public</url>
           </mirror>
    </mirrors>
    
    vi /etc/profile
    #MAVEN_HOME
    export MAVEN_HOME=/opt/module/apache-maven-3.0.5
    export PATH=$PATH:$MAVEN_HOME/bin
    source /etc/profile
    mvn -version
    
    1. ant解压、配置 ANT _HOMEPATH
    tar -zxvf apache-ant-1.9.9-bin.tar.gz -C /opt/module/
    vim /etc/profile
    #ANT_HOME
    export ANT_HOME=/opt/module/apache-ant-1.9.9
    export PATH=$PATH:$ANT_HOME/bin
    source /etc/profile
    ant -version
    
    1. 安装 glibc-headersg++ 命令如下
    yum install glibc-headers
    yum install gcc-c++
    
    1. 安装makecmake
    yum install make
    yum install cmake
    
    1. 解压protobuf,进入到解压后protobuf主目录,/opt/module/protobuf-2.5.0,然后相继执行命令
    tar -zxvf protobuf-2.5.0.tar.gz -C /opt/module/
    cd /opt/module/protobuf-2.5.0/
    ./configure 
    make 
    make check
    make install
    ldconfig
    vim /etc/profile
    #LD_LIBRARY_PATH
    export LD_LIBRARY_PATH=/opt/module/protobuf-2.5.0
    export PATH=$PATH:$LD_LIBRARY_PATH
    source /etc/profile
    验证命令:protoc --version
    
    1. 安装openssl
    yum install openssl-devel
    
    1. 安装ncurses-devel
    yum install ncurses-devel
    

    到此,编译工具安装基本完成

    3️⃣编译源码

    1. 解压源码到/opt/目录 : tar -zxvf hadoop-2.7.2-src.tar.gz -C /opt/;
    2. 进入到hadoop源码主目录 : pwd;
    3. 通过maven执行编译命令 : mvn package -Pdist,native -DskipTests -Dtar等待时间30分钟左右,最终成功是全部SUCCESS,如下图所示 :
    4. 成功的64位hadoop包在/opt/hadoop-2.7.2-src/hadoop-dist/target
    5. 编译源码过程中常见的问题及解决方案
      (1)MAVEN install时候JVM内存溢出
       处理方式:在环境配置文件和maven的执行文件均可调整MAVEN_OPTheap大小。(详情查阅MAVEN 编译 JVM调优问题,如:http://outofmemory.cn/code-snippet/12652/maven-outofmemoryerror-method
      (2)编译期间maven报错。可能网络阻塞问题导致依赖库下载不完整导致,多次执行命令(一次通过比较难):mvn package -Pdist,nativeN -DskipTests -Dtar
      (3)报ant、protobuf等错误,插件下载未完整或者插件版本问题,最开始链接有较多特殊情况,同时推荐
      (4)2.7.0版本的问题汇总帖子 http://www.tuicool.com/articles/IBn63qf

    九 常见错误及解决方案

    1)防火墙没关闭、或者没有启动YARN : INFO client.RMProxy: Connecting to ResourceManager at hadoop108/192.168.10.108:8032
    2)主机名称配置错误
    3)IP地址配置错误
    4)ssh没有配置好
    5)root用户和xxx两个用户启动集群不统一
    6)配置文件修改不细心
    7)未编译源码 Unable to load native-hadoop library for your platform... using builtin-java classes where applicable 17/05/22 15:38:58 INFO client.RMProxy: Connecting to ResourceManager at hadoop108/192.168.10.108:8032

    8)不识别主机名称

    java.net.UnknownHostException: hadoop102: hadoop102
           at java.net.InetAddress.getLocalHost(InetAddress.java:1475)
           at org.apache.hadoop.mapreduce.JobSubmitter.submitJobInternal(JobSubmitte>>r.java:146)
           at org.apache.hadoop.mapreduce.Job$10.run(Job.java:1290)
           at org.apache.hadoop.mapreduce.Job$10.run(Job.java:1287)
           at java.security.AccessController.doPrivileged(Native Method)
    at javax.security.auth.Subject.doAs(Subject.java:415)
    

    解决办法:
    (1)在/etc/hosts文件中添加192.168.1.102 hadoop102
    (2)主机名称不要起hadoop hadoop000等特殊名称

    9)DataNodeNameNode进程同时只能工作一个

    10)执行命令不生效,粘贴word中命令时,遇到-和长–没区分开。导致命令失效

    解决办法:尽量不要粘贴word中代码

    11)jps发现进程已经没有,但是重新启动集群,提示进程已经开启。原因是在linux的根目录下/tmp目录中存在启动的进程临时文件,将集群相关进程删除掉,再重新启动集群。
    12)jps不生效。
     原因:全局变量hadoop java没有生效。解决办法:需要source /etc/profile文件。
    13)8088端口连接不上

    cat /etc/hosts
    注释掉如下代码
    #127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
    #::1         hadoop102
    

    相关文章

      网友评论

          本文标题:3_大数据之Hadoop完全分布式

          本文链接:https://www.haomeiwen.com/subject/aconzqtx.html