美文网首页
初识Hadoop2.x

初识Hadoop2.x

作者: 谭英智 | 来源:发表于2020-08-13 23:25 被阅读0次

    Hadoop是一个能够对大量数据进行分布式处理的软件框架

    hadoop-overview

    术语

    HDFS: 分布式文件系统,解决海量数据存储

    YARN: 作业调度和集群资源管理的框架,解决资源任务调度

    MAPREDUCE: 分布式运算编程框架,解决海量数据计算

    特点

    高扩展性: 集群可以容易的扩展到数以千计的节点

    成本低:通过大量廉价的机器组成集群

    高效率:并发数据,并发处理

    高可靠:多份复制,任务失败后自动重新部署计算任务

    进程

    HDFS

    DataNode

    SecondaryNameNode

    NameNode

    YARN

    NodeManager

    ResourceManager

    配置

    hadoop-env.sh

    export JAVA_HOME=/root/apps/jdk1.8.0_65
    

    core-site.xml

    #可以选择tfs/file/gfs文件系统
    <property>
        <name>fs.defaultFS</name>
        <value>hdfs://node-1:9000</value>
    </property>
    #运行时产生文件的存储目录
    <property>
        <name>hadoop.tmp.dir</name>
        <value>/home/hadoop/tmp</value>
    </property>
    

    hdfs-site.xml

    <property>
        <name>dfs.replication</name>
        <value>2</value>
    </property>
    <property>
        <name>dfs.namenode.secondary.http-address</name>
        <value>node-2:50090</value>
    </property>
    

    mapred-site.xml

    #指定mr运行框架,默认local
    <property>
        <name>mapreduce.framework.name</name>
        <value>yarn</value>
    </property>
    
    

    yarn-site.xml

    <property>
        <name>yarn.resourcemanager.hostname</name>
        <value>node-1</value>
    </property>
    <property>
        <name>yarn.nodemanager.aux-services</name>
        <value>mapreduce_shuffle</value>
    </property>
    

    slaves

    node-1
    node-2
    node-3
    

    添加hadoop到环境变量

    scp所有配置文件到所有node

    格式化namenode

    #只能初始化一次,格式化是生成一些文件,在文件内有集群的唯一id,多次初始化会令id发生变化,导致整个集群不可用
    hdfs namenode -format
    or hadoop namenode -format
    

    启动

    hadoop-daemon.sh start namenode
    hadoop-daemon.sh start datanode
    hadoop-daemon.sh start resourcemanager
    hadoop-daemon.sh start nodemanager
    

    或者

    #配置了slaves和ssh免密登录
    start-dfs.sh
    start-yarn.sh
    start-all.sh
    

    停止

    stop-dfs.sh
    stop-yarn.sh
    stop-all.sh
    

    集群UI

    nameNode: http://nn_host:port 默认50070

    ResourceManager http://rm_host:port 默认8088

    操作hdfs

    hdfs dfs -ls /
    hdfs dfs -mkdir /hello
    hdfs dfs -put filename /hello
    

    运行mapreduce程序

    hadoop jar sample.jar <arg>
    

    HDFS

    • 文件分块存储

      解决上传下载耗时

      解决单机存储容量限制

    • 文件块多份复制

      解决分布式机器诺机

    • 使用NameNode来管理分块和副本位置

      解决文件元数据的管理

    设计目标

    • 硬件故障是常态,成百成千的机器,每个机器都可能出现故障,因此故障检测和自动快速恢复时HDFS的核心架构
    • 主要以流式方式读取数据,不适用交互式场景,反应时间长,更注重数据访问的高吞吐量
    • 大文件存储,GB/TB,不适用与小文件
    • 大部分的文件要求write-one-read-many。简化了数据一致性问题
    • 移动计算的代价比移动数据的代价低。把计算移动到数据近的机器,可以让大文件计算更高效
    • 可移植性,可以在不同的硬件和软件平台上运行

    特性

    • 目录树管理文件,与linux文件系统一致
    • 分布式
    • NameNode管理目录树,文件元数据
    • DataNode管理文件存储,定时向NameNode汇报信息
    • 文件分块存储
    • 副本机制
    • 一次写入多次读取,只支持整个文件覆盖或者追加,不支持部分修改,延迟大

    HA

    hdfs-nnha

    shell

    hadoop fs <args>
    hadoop fs -ls hdfs://namenode:host/dir/file
    hadoop fs -ls /dir/file
    #本地
    hadoop fs -ls file:///root/
    
    hadoop fs -ls [-h] [-R] <args>
    hadoop fs -mkdir [-p] <paths>
    hadoop fs -put [-f] [-p] <localfile> <dst>
    hadoop fs -get [ignorecrc] [-crc] [-p] [-f] <src> <localdst>
    hadoop fs -appendToFile <localfile> <dst>
    hadoop fs -cat [-ignoreCrc] URI
    hadoop fs -tail [-f] URI
    hadoop fs -chgrp [-R] GROUP URI
    hadoop fs -chmod 777 URI
    hadoop fs -chown user:grp URI
    hadoop fs -cp URI URIDst
    hadoop fs -mv URISrc URIDst
    hadoop fs -getmerge URI/* localfile
    hadoop fs -rm -r URI
    hadoop fs -df -h URI
    hadoop fs -du  URI
    hadoop fs -setrep -w num -R URI
    

    NameNode

    • 存储HDFS元数据(块列表/位置),目录树,和跟踪集群中的文件

    • 块信息在DataNode的位置在启动时,由DataNode上报

    • 单点

    • 数据存在内存,因此需要配置大内存的机器

    hadoop-namenode

    DataNode

    • 负责存储数据
    • NameNode和DataNode保持不断通讯
    • 启动时汇报自己持有的块列表
    • 关闭某个DataNode不会影响数据和集群的可用性,NameNode会安排其他DataNode进行副本复制和响应
    • 需要大量磁盘空间
    • 定期向NameNode发送心跳,默认3s,NameNode长时间没有收到心跳,会认为DataNode失效
    • DataNode定期汇报块信息,默认6h
    • 块大小默认128M

    工作机制

    hadoop-work
    • client请求上传文件
    • NameNode检查目录是否存在/文件是否存在
    • client请求第一个block该上传到些DataNode
    • NameNode返回副本个数的DataNode地址给client。策略为本地/同机架/不同机架/存储容量
    • client请求第一个DataNode建立pipeline,DataNode之间建立pipe,A->B->C
    • client向A上传第一个block,以packet上传,默认大小64k,package会从client->A->B->C流的方式传输
    • 确认后上传第二个block...
    • client向NameNode询问文件所在位置
    • NameNode返回文件部分或者全部的block列表,列表经过排序,策略为拓扑结构距离client近的靠前,心跳机制超时汇报的靠后
    • client选取靠前的DataNode读取block,为每个block启用一个线程下载
    • 读取完这批block,会请求下一批block读取
    • 读完一个block会进行checksum校验,出现错误时,client会通知NameNode,然后会从列表中的下一个DataNode请求block
    • 读完所有的block后,client合并成一个文件

    Java API

    • 提供跟shell类似的接口

    • 提供流式处理的接口

      效率更高

    YARN

    yarn-overview

    异常

    • RM出现异常,由备份RM结果,新RM通知AM重新启动
    • NM出现异常,RM通知AM,AM进行任务再调度
    • AM出现异常,RM重启AM,由于RM已经记录了AM任务状态信息,已完成的任务不会再运行
    yarn-rmha

    MapReduce

    核心思想:分而治之。把巨型任务切割成小任务,任务之间没有依赖关系,并对小文件进行分布式并行计算;再把小任务的结果进行汇总计算,并最终得出结果,根据块的多少来决定Map的数量,根据程序指定的数量来决定reduce的数量,多于一个reduce程序,会把结果切割成多个结果文件;多于一个reduce程序,map输出将根据key的hash,进行分区处理,先分区保存在本地,再发送给reduce,reduce收集完后,进行汇总并排序并进行处理

    hadoop-MR
    序列化和反序列化

    如果使用自定义类型,则需要实现hadoop提供的序列化和反序列接口,因为java的序列化效率低下

    相关文章

      网友评论

          本文标题:初识Hadoop2.x

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