zoukankan      html  css  js  c++  java
  • Hadoop

    hadoop搭建
    1. 环境搭建:利用分发脚本在所有服务器上部署java和hadoop
    2. 组件部署:三个重要组件分别部署在三台服务器上,并修改配置文件
    3. 启动集群并测试功能:格式化后分别启动组件并上传文件,配置历史服务器和日志功能
     
    服务器相关概念
    类型:文件服务器、数据库服务器、WEB服务器
    特点:高处理能力、高扩展性、高可靠性
    服务器磁盘
    机械硬盘:
    SCSI接口硬盘,早期使用,已停售,1w转/min
    SAS接口硬盘:提升,1.5w转/min
    STAT硬盘:串口硬盘,主流硬盘带纠错、降噪功能,7200转/min
    固态硬盘:
    SSD硬盘:贵,性能高
    交换机:
    存储转发设备,交换式集线器,扩展端口功能、物理编址……
    网卡:
    以太网网卡,PCI总线接口服务器一般使用千兆网卡
    机架:
    存储服务器主机的机柜。通信使用交换机
    IDC数据中心:
    电信部门为企业做托管
    Radi磁盘阵列:
    独立磁盘冗余阵列,最新的Raid5,将校验的数据分布在所有磁盘上,基本满足大部分需求,主流用品
     
    Hadoop
    概念:分布式系统基础架构,主要解决海量数据的存储和分析计算,广义上指的是Hadoop生态圈
     
    三大发行版本
    Apache:基础版本(2006)
    Cloudera:继承大数据框架,产品CDH(2008)
    Hortonworks:文档较好,HDP(2011)
     
    优势
    高可靠性,底层多个数据副本,某计算单元故障不会丢失
    高扩展性,集群间分配任务数据,动态扩展节点
    高效性,Hadoop是并行工作,加快任务处理速度
    搞容错性,自动将失败的任务重新分配
     
    Hadoop 1.x、2.x和3.x
    1.x:MapReduce(计算+资源调度);HDFS(数据存储);Common(辅助工具)
    2.x:MapReduce(计算);Yarn(资源调度);HDFS(数据存储);Common(辅助工具)
    3.x:在组成上和2代没有区别,有其他区别
     
     
    HDFS架构
    NameNode(nn):存储文件的元数据,如文件名、目录结构、文件属性,以及每个文件的块列表和块所在的DataNode
    DataNode(dn):在本地文件系统存储文件块数据,以及块数据的校验和
    Secondary NameNode(2nn):每隔一段时间对nn元数据备份
     
    YARN架构概述
    另一种资源协调者,是Hadoop的资源管理器
    Resourceanager(RM):整个集群资源(内存CPU等)的总管,存在多个客户端提交job让其运行
    NodeManager(NM):单个节点服务器的资源老大,一个节点可有多个Container
    ApplicationMaster(AM):单个任务运行的老大
    Container:容器,相当于一台独立的服务器,封装了任务运行所需的内存CPU磁盘网络等
     
    MapReduce架构
    MapReduce将计算分为两个阶段:Map和Reduce,Map阶段是并行处理输入数据,Redce是对Map结果进行汇总
     
    HDFS、YARN、MapReduce三者关系
    HDFS是基础的架构,NameNode记录元数据,DataNode是存储单元,2nn负责备份数据。客户端向集群提交一个任务,YARN中的ResourceManager会寻找其中一个节点服务器的NodeManager,开启一个Container,将任务放在ApplicationMaster中运行,AM向RM申请运行资源,在节点中寻找到合适资源后开启资源,由AM开启MapTask,这就是Map阶段,每一个MapTask独立工作,检索后返回结果写入磁盘上,形成一个ReduceTask,NameNode再次进行记录操作
     
    大数据生态体系
     
    数据来源层:数据库(结构化)、文件日志(半结构化)、视频、PPT等(非结构化)
    数据传输层:Sqoop数据传递、Flime日志收集、Kafka消息队列(也可整理结构化与非结构化)
    数据存储层:HDFS文件存储(结构、非结构)、HBase(非结构)
    资源管理层:YRAN资源管理
    数据计算层:MapReduce(离线计算、Hive数据查询)、SparkCore(内存计算、SparkMlib数据挖掘、SparkSql数据查询、SparkStreaming、Flink实时计算)
    任务调度:Oozie任务调度、Azkaban任务调度器
    整个数据平台的调度者:Zookeeper
    业务层:叶树模型、数据可视化、业务应用
     
    案例:在电商购买推荐的商品:用户操作——Nginx埋点获取访问日志——产生数据存储至文件日志——Flume日志收集——Kafka进行缓冲——Flink云计算并返回结果至数据库——后台读取分析数据,并返回推荐页给用户
     
    前置工作:
    VM虚拟机、linux初始化、XShell远程等
    磁盘分区:/boot分1G,/swap分4G,/分45G,装好之后给虚拟机创建初始快照
     
    设置固定IP网关DNS:
    vi /etc/sysconfig/network-scripts/ifcfg-ens33
    将DHCP改成static
    末尾添加
    IPADDR=192.168.200.10x
    GATWAT=192.169.200.2
    NDS1=192.168.200.2
     
    vi /etc/hosts 末尾添加:
    192.168.200.100 hadoop100
    192.168.200.101 hadoop101
    192.168.200.102 hadoop102
    192.168.200.103 hadoop103
    192.168.200.104 hadoop104
    192.168.200.105 hadoop105
    ------------------------------------虚拟机快照由此结束-------------------------------------
     
    虚拟机基础工具:
    yum install -y epel-release安装应用商店
    yum install -y net-tools安装工具包
    yum install -y vim 安装vim
     
    添加部署java和hadoop
    tar -zxvf jdk-8u212-linux-x64.tar.gz  -C /opt/module解压java
    tar -zxvf hadoop-3.1.3.tar.gz -C /opt/module/解压hadoop
     
    前往/etc/profile.d新建my_env.sh脚本,脚本中加入java、hadoop环境变量
     
    export JAVA_HOME=/opt/module/jdk1.8.0_212
    export PATH=$PATH:$JAVA_HOME/bin
    #HADOOP_HOME
    export HADOOP_HOME=/opt/module/hadoop-3.1.3
    export PATH=$PATH:$HADOOP_HOME/bin
    export PATH=$PATH:$HADOOP_HOME/sbin
    添加后source /etc/profile即可
     
    hadoop文件分析
    hadoop/bin目录中存储和HDFS、Yran、Mapred相关执行文件
    hadoop/etc/hadoop目录中存储的xx-site.xml、workers相关
    hadoop/sbin目录中一些集群功能开关相关脚本
    hadoop/lib/native目录中存储的本地动态链接库,压缩功能会需要
     
    hadoop运行模式
    • Local (Standalone) Mode linux本地存储模式,一般测试用,企业不会用
    • Pseudo-Distributed Mode 伪分布式模式,数据存储在HDFS上
    • Fully-Distributed Mode 完全分布式模式,公司一般使用的
     
    scp拷贝文件至其他服务器,首次迁移使用
    基本语法:
    scp:命令,实现服务器与服务器之间的拷贝
     -r :递归
    $pdir/$fname:源文件地址路径/名称
    $user@$host:$pdir/$fname:目的地用户@主机:目的地路径/名称
    例如:
    scp -r ./jdk1.7/ root@hadoop103:/opt/module(将102本地推送至103),或
    scp -r root@hadoop103:/opt/module/jdk1.7/ ./module(将远端102拉取至103)
    rsync同步文件至其他服务器,速度较快,修改文件后使用
    基本语法:
    rsync:命令,实现服务器与服务器之间的文件同步
     -av:归档拷贝并显示复制过程
    例如:
    rsync -av hadoop-3.1.3/ root@hadoop103:/opt/module/hadoop-3.1.3/  将本地hadoop文件同步至103上
    注意:需要双方同时安装了rsync才可以执行操作
     
    利用rsync实现同步分发 格式:xsync xxx,即可分发至所有指定服务器
    注意:想要全局使用xsync必须满足以下条件:
    1. 文件为可执行文件,即授权777
    2. 将xsync上层路径添加至全局环境变量中,即/etc/profile,但这个文件千万不能乱改,否则出了cd其他命令都会失效,补救方法如下:
      1. 初始化path:export PATH=/usr/bin:/usr/sbin:/bin:/sbin:/usr/X11R6/bin
      2. 使用vi重新修改PATH,将错误的地方改掉:/bin/vi /etc/profile  ,并重新source /etc/profile
    脚本代码:
    #!/bin/bash
    #1. 判断参数个数
    if [ $# -lt 1 ]
    then
        echo Not Enough Arguement!
        exit;
    fi
    #2. 遍历集群所有机器
    for host in hadoop102 hadoop103 hadoop104
    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
    该脚本缺陷:ssh时需要重复验证密码,不能一次到位,相当麻烦。因此需要使用ssh免登录
     
    ssh免密登录
        普通情况下通过ssh其他服务器需要输入目标服务器密码,但也可以通过密钥来实现免密登录(注:未主动使用ssh命令的机器没有.ssh文件)
    1. 在当前用户下的.ssh/下输入ssh-keygen -t rsa注册密钥,则在.ssh/下生成id_rsa私钥和id_rsa.pub公钥,还有一个存放目标节点的公钥集合文件known_hosts
    2. 输入ssh-copy-id xxxx将公钥拷贝至目标服务器,首次需要输入密码,以后即可无密访问。若想访问服务器本身,也许这样操作
    • 被无密访问过的服务器会在.ssh/生成一个authorized_keys文件,存放允许访问它的服务器;而known_hosts存放着它能够无密访问的其他服务器
    • 主动无密访问其他节点的服务器才会有密钥
    注意:防火墙关闭(centOS7):
    查看防火墙状态: systemctl status firewalld
    永久关闭防火墙: systemctl disable firewalld
    重启防火墙: systemctl enable firewalld
    关闭防火墙开机自启: systemctl disable firewalld.service
     
    集群部署规划
    原则:NameNode、SecondaryNameNode和ResourceManager很耗内存,不要安装在同一个台机器上
     
     
    hadoop102
    hadoop103
    hadoop104
    HDFS
    NameNode
    DataNode
    DataNode
    SecondaryNameNode
    DataNode
    YARN
    NodeManager
    ResourceManager
    NodeManager
    NodeManager
    默认配置文件:官网下载,存放在Hadoop的jar包中
    自定义配置文件:$HADOOP_HOME/etc/hadoop位置下的core-site.xml、hdfs-site.xml、yarn-site.xml、mapred-site.xml文件
    根据自己需要,参照默认配置文件,将自定义配置文件修改
     
    配置集群
    • 核心配置文件core-site.xml
    <!-- 指定NameNode的地址 -->
        <property>
            <name>fs.defaultFS</name>
            <value>hdfs://hadoop102:8020</value>
        </property>
        <!-- 指定hadoop数据的存储目录 -->
        <property>
            <name>hadoop.tmp.dir</name>
            <value>/opt/module/hadoop-3.1.3/data</value>
        </property>
        <!-- 配置HDFS网页登录使用的静态用户为root -->
        <property>
            <name>hadoop.http.staticuser.user</name>
            <value>root</value>
        </property>
    • HDFS配置文件 hdfs-site.xml
    <!-- nn web端访问地址-->
        <property>
            <name>dfs.namenode.http-address</name>
            <value>hadoop102:9870</value>
        </property>
        <!-- 2nn web端访问地址-->
        <property>
            <name>dfs.namenode.secondary.http-address</name>
            <value>hadoop104:9868</value>
        </property>
    • YARN配置文件yarn-site.xml
    <!-- 指定MR走shuffle -->
        <property>
            <name>yarn.nodemanager.aux-services</name>
            <value>mapreduce_shuffle</value>
        </property>
        <!-- 指定ResourceManager的地址-->
        <property>
            <name>yarn.resourcemanager.hostname</name>
            <value>hadoop103</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>
    • MapReduce配置文件 mapred-site.xml
    <!-- 指定MapReduce程序运行在Yarn上 -->
        <property>
            <name>mapreduce.framework.name</name>
            <value>yarn</value>
        </property>
    • $HADOOP_HOME/etc/hadoop/woekers中的localhost改成
    hadoop102
    hadoop103
    hadoop104
    • 使用分发脚本xsync将当前改动分发至所有服务器
    启动集群
    首次启动集群需要使用hdfs namenode -format进行格式化,注意格式化必须停止所有进程(stop-all.sh)并删除所有机器的data和logs目录,再进行格式化
     
    • 启动HDFS:sbin/start-dfs.sh
    此处教程是用子用户操作的,而我这边直接用在root下操作,所以有些地方需要修改
    针对root用户的问题,在start-dfs.sh,stop-dfs.sh中分别添加
    HDFS_DATANODE_USER=root
    HDFS_DATANODE_SECURE_USER=hdfs
    HDFS_NAMENODE_USER=root
    HDFS_SECONDARYNAMENODE_USER=root
     
    使用jps查看当前java相关的进程:
    7281 Jps
    6948 DataNode
    6812 NameNode
    浏览器输入hadoop102:9870 查看HDFS上存储的数据信息
     
    • 在配置了ResourceManager的服务器中启动YARN:sbin/start-yarn.sh
    同样针对root用户,在start-yarn.sh和stop-yarn.sh中添加
    YARN_RESOURCEMANAGER_USER=root
    HADOOP_SECURE_DN_USER=yarn
    YARN_NODEMANAGER_USER=root
    用jps查看yarn节点中的进程
    2609 DataNode
    3089 NodeManager
    3420 Jps
    2958 ResourceManager
    浏览器中输入hadoop103:8088 查看YARN运行的job信息 
     
    集群基本测试
    • 上传文件到集群
            hadoop fs -mkdir /input 在/目录下创建一个input文件夹
            hadoop fs -put $HADOOP_HOME/wcinput/word.txt /input  将word.txt上传到/input下
    • 查看HDFS文件存储路径
            不太清楚是什么原因,教程中的文件在102、103和104中都各自存了一份,而我的文件却只有在104是完整的,103是不完整的,102就压根没有这个文件夹。在103和104中,在104确实是能够cat出来看到源文件的上传的文件分成多个文件块存储在一起,文本文件可直接cat查看,gz压缩包则需要使用cat输出重定向至当前文件夹,然后才可正常解压:cat xxx>> xxx.tar.gz
     
    问题:web端尝试删除上传的文件时,出现“Permission denied: user=dr.who, access=READ_EXECUTE, inode="/user":root:supergroup:drwx-wx-wx”。这样的话直接在core-site.xml中添加以下配置即可
    <!-- 当前用户全设置成root -->
    <property>
       <name>hadoop.http.staticuser.user</name>
       <value>root</value>
    </property>
    <!-- 不开启权限检查 -->
    <property>
      <name>dfs.permissions.enabled</name>
      <value>false</value>
    </property>
     
    问题警告:
    1. 存储位置会跳来跳去,不是固定是3等份!!!!但是删除后又好了,原因不明,新问题是元数据重新压缩后解压出现错误,原因不明
    2. 有出现过上传的文件只在102中有,103和104找不到的情况,还有web页面打不开(已解决,防火墙的问题,关闭后需要重启)。
     
    • 运行hadoop自带的hadoop-mapreduce-examples.jar来测试,将文件上传后预览
    hadoop jar ./share/hadoop/mapreduce/hadoop-mapreduce-examples-3.1.3.jar wordcount /wcinput /wcoutput
    注意:
    此处的wordcount是类似结果的变量(但在HDFS内没看到这个名字)
    这里填写的是输入输出地址,即/wcinput 和 /wcoutput。其中wcinput需要已存在于HDFS上,而wxoutput不能提前创建,否则会报错。这个逻辑很奇怪,后面再看看什么原因,并且由于我分配的内存过小,在计算时有杀掉一些其他进程,导致无法预览,这个现在也不看,评论区有加内存的博客地址,需要的话随时去看
     
     
    集群崩溃处理办法
    先停止yarn和hdfs,再将所有集群节点的$HADOOP_HOME下的/data和/logs文件夹删除,最后重新格式化HDFS即可
    sbin/stop-yarn.sh
    sbin/stop-dfs.sh
    rm -rf data/ logs/
    hdfs namenode -format
    注意:DataNode版本号相关,没听懂,与数据版本相关
     
    配置历史服务器与日志聚集功能
    历史服务器配置成功后,在程序运行完成后的yarn前端页面可查看其历史运行情况
    日志功能配置成功后,可在历史运行情况页面打开logs,方便分析运行情况
     
    在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>
     
    在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>
    开启历史服务器和日志聚集功能之前,先将HDFS和YARN重启一遍,再在102中启动。启动后即可在jps中查看历史服务器进程,日志聚集不会产生进程,会从下次任务开始生成日志:
    $HADOOP_HOME/bin/mapred --daemon start historyserver
     
    HDFS/YARN的两种开关方式
    • 整体开关:start/stop-dfs.sd;start/stop-yarn.sh
    • 单节点开关:hdfs --daemon start/stop namenode/datanode/secondarynamenode;yarn ==daemon start/stop resourcemanager/nodemanager
    hadoop集群常用脚本
    • 集群组件开关脚本:统一开关HDFS、YARN、historyserver、logs
    #!/bin/bash
    if [ $# -lt 1 ]
    then
        echo "No Args Input..."
        exit ;
    fi
    case $1 in
    "start")
            echo " =================== 启动 hadoop集群 ==================="
            echo " --------------- 启动 hdfs ---------------"
            ssh hadoop102 "/opt/module/hadoop-3.1.3/sbin/start-dfs.sh"
            echo " --------------- 启动 yarn ---------------"
            ssh hadoop103 "/opt/module/hadoop-3.1.3/sbin/start-yarn.sh"
            echo " --------------- 启动 historyserver ---------------"
            ssh hadoop102 "/opt/module/hadoop-3.1.3/bin/mapred --daemon start historyserver"
    ;;
    "stop")
            echo " =================== 关闭 hadoop集群 ==================="
            echo " --------------- 关闭 historyserver ---------------"
            ssh hadoop102 "/opt/module/hadoop-3.1.3/bin/mapred --daemon stop historyserver"
            echo " --------------- 关闭 yarn ---------------"
            ssh hadoop103 "/opt/module/hadoop-3.1.3/sbin/stop-yarn.sh"
            echo " --------------- 关闭 hdfs ---------------"
            ssh hadoop102 "/opt/module/hadoop-3.1.3/sbin/stop-dfs.sh"
    ;;
    *)
        echo "Input Args Error..."
    ;;
    esac
    • 统一查看集群服务器状态
    分发到各节点上之后,就可在任意一台节点查看各节点进程情况
    #!/bin/bash
    for host in hadoop102 hadoop103 hadoop104
    do
            echo =============== $host ===============
            ssh $host jps
    done
     
    hadoop常见端口号
     
    端口名称
    Hadoop2.x
    Hadoop3.x
    NameNode内部通信端口
    8020 / 9000
    8020 / 9000/9820
    NameNode HTTP UI
    50070
    9870
    MapReduce查看执行任务端口
    8088
    8088
    历史服务器通信端口
    19888
    19888
    常用配置文件
    hadoop3.x:core-site.xml  hdfs-site.xml yarn-site.xml  mapred-site.xml  workers
    hadoop2.x:core-site.xml  hdfs-site.xml yarn-site.xml  mapred-site.xml  slaves
     
     
     
     
     
     
     
     
  • 相关阅读:
    构建之法阅读笔记05
    构建之法阅读笔记04
    大二上学期软件工程概论学习进度表(第十二周)
    构建之法阅读笔记03
    四则运算二
    GCD
    Category的使用
    适配6 、6P 来源互联网
    UIView阴影和圆角的关系
    NSSet类型 以及与NSArray区别
  • 原文地址:https://www.cnblogs.com/yuan-zhou/p/15382613.html
Copyright © 2011-2022 走看看