zoukankan      html  css  js  c++  java
  • Hadoop概述与配置

    Hadoop概述

    Hadoop起源

    Google三篇论文

    GFS->HDFS

    MapReduce->MR<stype>

    BigTable->HBase

    Hadoop三大发行版本

    Apache Hadoop

    官网地址:http://hadoop.apache.org/releases.html

    下载地址:https://archive.apache.org/dist/hadoop/common/

    Cloudera Hadoop

    官网地址:https://www.cloudera.com/downloads/cdh/5-10-0.html

    下载地址:http://archive-primary.cloudera.com/cdh5/cdh/5/

    Hortonworks Hadoop

    官网地址:https://hortonworks.com/products/data-center/hdp/

    下载地址:https://hortonworks.com/downloads/#data-platform

     

    Hadoop的优势

    1、高可靠性:Hadoop底层维护多个数据副本,所以即使Hadoop某个计算元素或存储出现故障,也不会导致数据的丢失。

    2、高扩展性:在集群间分配任务数据,可方便的扩展数以千计的节点。

    3、高效性:在MapReduce的思想下,Hadoop是并行工作的,以加快任务的处理速度。

    4、高容错性:能够自动将失败的任务重新分配。

     

    Hadoop模块组成

    新版本新增Ozone

     

    Hadoop各模块架构

    Hadoop Distributed File System

    HDFS架构

    1、NameNode:存储文件的元数据,如文件名,文件目录结构,文件属性(生成时间、副本数、文件权限),以及每个文件的块列表和块所在的DataNode等。

    2、DataNode:在本地文件系统存储文件块数据,以及块数据的校验和。

    3、Secondary NameNode:每隔一段时间对NameNode元数据备份。

     

    YARN架构

    1、Client:提交作业

    2、ResourceManager

    1)处理客户端请求

    2)监控NodeManager

    3)启动或监控ApplicationMaster

    4)资源的分配和调度

    3、NodeManager

    1)管理单个节点上的资源

    2)处理来自ResourceManager的命令

    3)处理来自ApplicationMaster的命令

    4、ApplicationMaster

    1)负责数据的切分

    2)为应用程序申请资源并分配给内部任务

    3)任务的监控和容错

    5、Container:

    容器,表示一个抽象资源,封装了某个节点的多维度资源,如内存、cpu、磁盘、网络等。

     

    MapReduce架构

    MapReduce将计算过程分为两个阶段:Map和Reduce

    1)Map阶段并行处理输入数据

    2)Reduce阶段对Map结果进行汇总

     

    Linux脚本

    SSH免密登录

    公私钥生成后放在~/.ssh里面id_rsa&id_rsa.pub,该目录中authorized_keys文件中存放的是别的节点发过来的公钥。

    # -t 选择编解码格式
    ssh-keygen -t rsa

    # 发送公钥至对应节点
    ssh-copy-id hadoop102
    ssh-copy-id hadoop103
    ssh-copy-id hadoop104

     

    分发脚本

    前提:配置好ssh免密登录

    #!/bin/bash
    #判断参数数量
    if [ $# -lt 1 ]
    then
    echo Not Enough Agrument!
    exit;
    fi
    #遍历集群中所有节点
    for host in hadoop102 hadoop103 hadoop104
    do
    echo ================$host================
    #遍历目录
    for file in $@
    do
    if [ -e $file ]
    then
    #获取文件真实目录(-P 进入物理目录)
    pdir=$(cd -P $(dirname $file); pwd)
    #获取文件名称
    fname=$(basename $file)
    ssh $host "mkdir -p $pdir"
    rsync -av $pdir/$fname $host:$pdir
    else
    echo $file is not exists!
    fi
    done
    done

     

    集群状态脚本

    #!/bin/bash
    for host in hadoop102 hadoop103 hadoop104
    do
    echo ============$host============
    ssh $host jps
    done

     

    群起集群脚本

    #!/bin/bash
    if [ $# -ne 1 ]
    then
    echo "args number error"
    exit
    fi
    case $1 in
    "start")
    ssh hadoop102 $HADOOP_HOME/sbin/start-dfs.sh
    ssh hadoop103 $HADOOP_HOME/sbin/start-yarn.sh
    ;;
    "stop")
    ssh hadoop102 $HADOOP_HOME/sbin/stop-dfs.sh
    ssh hadoop103 $HADOOP_HOME/sbin/stop-yarn.sh
    ;;
    *)
    echo "args info error!"
    ;;
    esac

     

    Hadoop集群

    集群配置

    集群部署规划

     Hadoop102Hadoop103Hadoop104
    HDFS NameNode DataNode DataNode SecondaryNameNode Datanode
    YARN NodeManager ResourceManager NodeManager NodeManager

    配置Linux环境

    1)配置hostname

    vim /etc/hostname
    #重启服务器
    reboot

    2)配置hosts

    vim /etc/hosts

    3)配置静态ip

    vim /etc/sysconfig/network-scripts/ifcfg-ens33(网卡)
    #修改下面两个
    #[none|static|bootp|dhcp](引导时不使用协议|静态分配IP|BOOTP协议|DHCP协议)
    BOOTPROTO=static
    ONBOOT=yes
    添加下面的内容    
    #IP地址
    IPADDR=192.168.1.102
    #网关  
    GATEWAY=192.168.1.2
    #域名解析器
    DNS1=114.114.114.114
    DNS2=8.8.8.8

    #重启网络服务
    systemctl restart network
    #测试网络连接
    ping www.baidu.com

     

    配置核心配置文件

    cd $HADOOP_HOME/etc/hadoop

    配置core-site.xml
    <configuration>
    <!--指定HDFS中NameNode的地址 -->
       <property>
           <name>fs.defaultFS</name>
           <value>hdfs://hadoop102:9820</value>
    </property>
    <!-- 指定Hadoop运行时产生文件的存储目录 -->
       <property>
           <name>hadoop.tmp.dir</name>
           <value>/opt/module/hadoop-3.1.3/data</value>
    </property>
    <!-- 通过web界面操作hdfs的权限 -->
    <property>
           <name>hadoop.http.staticuser.user</name>
           <value>atguigu</value>
    </property>
    <!-- 后面hive的兼容性配置 -->
       <property>
           <name>hadoop.proxyuser.atguigu.hosts</name>
           <value>*</value>
       </property>
       <property>
           <name>hadoop.proxyuser.atguigu.groups</name>
           <value>*</value>
    </property>
    </configuration>
    配置hdfs-site.xml
    <configuration>
       <property>
           <name>dfs.namenode.secondary.http-address</name>
           <value>hadoop104:9868</value>
       </property>
    </configuration>
    配置yarn-site.xml
    <configuration>
    <!-- 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>
    <!-- 环境变量通过从NodeManagers的容器继承的环境属性,对于mapreduce应用程序,除了默认值 hadoop op_mapred_home应该被添加外。属性值 还有如下-->
       <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>
    <!-- 解决Yarn在执行程序遇到超出虚拟内存限制,Container被kill -->
       <property>
           <name>yarn.nodemanager.pmem-check-enabled</name>
           <value>false</value>
       </property>
       <property>
           <name>yarn.nodemanager.vmem-check-enabled</name>
           <value>false</value>
       </property>
    <!-- 后面hive的兼容性配置 -->
       <property>
           <name>yarn.scheduler.minimum-allocation-mb</name>
           <value>512</value>
       </property>
       <property>
           <name>yarn.scheduler.maximum-allocation-mb</name>
           <value>4096</value>
       </property>
       <property>
           <name>yarn.nodemanager.resource.memory-mb</name>
           <value>4096</value>
    </property>
    </configuration>
    配置mapred-site.xml
    <configuration>
    <!-- 指定MR运行在Yarn上 -->
       <property>
           <name>mapreduce.framework.name</name>
           <value>yarn</value>
       </property>
    </configuration>
    注意

    配置好后通过分发脚本分发配置文件 xsync ./

     

    配置集群

    配置workers

    vim /opt/module/hadoop-3.1.3/etc/hadoop/workers

    增加如下内容:

    hadoop102

    hadoop103

    hadoop104

    同步workers

    xsync /opt/module/hadoop-3.1.3/etc/workers

     

    启动集群
    集群初始化

    注意:如果是第一次启动集群,需要在NameNode所在节点格式化,格式化之前,一定要先停止上次启动的所有namenode和datanode进程,然后在删除data和logs数据。

    #格式化namenode
    hdfs namenode -format
    #启动HDFS
    sbin/start-dfs.sh
    #启动YARN(注意:要在配置了ResourceManager的节点启动YARN)
    sbin/start-yarn.sh

     

    集群启动失败

    哪个服务没开启,就查看/opt/module/hadoop-3.1.3/data文件夹中的对应日志文件。

    集群ID不一致错误(重复格式化namenode造成)

    查看集群ID(可以不做)

    cat /opt/module/hadoop-3.1.3/data/dfs/data/current/VERSION

    cat /opt/module/hadoop-3.1.3/data/dfs/name/current/VERSION

    停止集群服务

    #需要删除所有节点中的对应文件,可以写一个脚本运行

    删除$HADOOP_HOME/data

    删除$HADOOP_HOME/logs

    删除/tmp/*

    删除脚本

    #!/bin/bash
    for host in hadoop102 hadoop103 hadoop104
    do
    ssh $host rm -rf $HADOOP_HOME/data $HADOOP_HOME/logs
    ssh $host sudo rm -rf /tmp/*
    done

     

    各模块端口号

    模块Web端口号程序端口号
    HDFS (NameNode) 9870 9820
    Secondary NameNode 9868  
    DataNode 9864 9866
    Yarn 8088 8032
    历史服务器 (在NameNode配置) 19888 10020
         

     

    集群启动和停止

    1)各模块单独启动停止

    单独启动停止hdfs单个组件

    hdfs --daemon start xxx
    hdfs --daemon stop xxx

    单独启动停止yarn单个组件

    yarn --daemon start xxx
    yarn --daemon stop xxx

    2)整体启动停止

    整体启动停止hdfs

    start-dfs.sh
    stop-dfs.sh

    整体启动停止yarn

    start-yarn.sh
    stop-yarn.sh

    补充:集群有时网络出现错误,可能是NetworkManager与Network冲突,停止NetworkManager。

    配置历史服务器

    1)配置mapred.site.xml

    <!-- 历史服务器端地址 -->
    <property>
       <name>mapreduce.jobhistory.address</name>
       <value>hadoop102:10020</value>
    </property>
    <!-- 历史服务器web端地址 -->
    <property>
       <name>mapreduce.jobhistory.webapp.address</name>
       <value>hadoop102:19888</value>
    </property>

    2)分发配置

    xsync $HADOOP_HOME/etc/hadoop/mapred-site.xml

    3)启动历史服务器(NameNode节点)

    mapred --daemon start historyserver

    4)查看服务是否启动

    jps

    5)查看历史服务器web

    http://hadoop102:19888/jobhistory

     

    配置日志聚集

    1)配置yarn-site.xml

    <!-- 开启日志聚集  -->
    <property>
       <name>yarn.log-aggregation-enable</name>
       <value>true</value>
    </property>
    <!-- 访问路径-->
    <property>  
       <name>yarn.log.server.url</name>  
       <value>http://hadoop102:19888/jobhistory/logs</value>
    </property>
    <!-- 保存的时间7天 -->
    <property>
       <name>yarn.log-aggregation.retain-seconds</name>
       <value>604800</value>
    </property>

    2)分发配置

    xsync $HADOOP_HOME/etc/hadoop/yarn-site.xml

    3)关闭NodeManager、ResourceManager、HistoryServer

    (在ResourceManager所在节点)stop-yarn.sh
    (在NameNode所在节点)mapred --daemon stop historyserver

    4)启动NodeManager、ResourceManager、HistoryServer和Timelineserver

    (在ResourceManager所在节点)start-yarn.sh
    (在ResourceManager所在节点)yarn --daemon start timelineserver
    (在NameNode所在节点)mapred --daemon start historyserver

     

    配置集群时间同步

    1)关闭ntp服务和自启动

    sudo systemctl stop ntpd
    sudo systemctl disable ntpd

    2)修改ntp配置文件

    sudo vim /etc/ntp.conf

    3)修改如下配置

    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

    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

    3)当该节点丢失网络连接,依然可以采用本地时间作为时间服务器为集群中的其他节点提供时间同步
    添加
    server 127.127.1.0
    fudge 127.127.1.0 stratum 10

    4)修改ntpd文件

    sudo vim /etc/sysconfig/ntpd

    5)修改如下配置

    添加
    #让硬件时间与系统时间一起同步
    SYNC_HWCLOCK=yes

    6)重启ntpd服务与设置开机自启

    systemctl start ntpd
    systemctl enable ntpd

    7)在其他机器配置

    #在其他机器配置10分钟与时间服务器同步一次
    sudo crontab -e
    #编写定时任务
    */10 * * * * /usr/sbin/ntpdate hadoop102
    #修改任意机器时间
    date -s "2017-9-11 11:11:11"
    #十分钟后查看机器是否与时间服务器同步
    date

    #或者手动同步时间
    /usr/sbin/ntpdate hadoop102
  • 相关阅读:
    Codeforces 897 B.Chtholly's request-思维题(处理前一半)
    Codeforces 897 A.Scarborough Fair-字符替换
    51nod 1649.齐头并进-最短路(Dijkstra)
    牛客网 牛客练习赛7 B.购物-STL(priority_queue)
    牛客网 牛客练习赛7 A.骰子的游戏
    hdu 4737 A Bit Fun 尺取法
    Educational Codeforces Round 15 D. Road to Post Office 数学
    Educational Codeforces Round 15 A, B , C 暴力 , map , 二分
    tyvj 1402 乌龟棋 dp
    vijos 1057 盖房子 dp 最大子正方形
  • 原文地址:https://www.cnblogs.com/BookMiki/p/15003444.html
Copyright © 2011-2022 走看看