Hadoop基础知识

一、Hadoop

定义

狭义上:以Hadoop软件本身(hadoop.apache.org),指一个用于大数据分布式存储(HDFS),分布式计算(MapReduce)和资源调度(YARN)的平台,这三样只能用来做离线批处理,不能用于实时处理,因此才需要生态系统的其他的组件。

广义上:指的是hadoop的生态系统,即其他各种组件在内的一整套软件(sqoop,flume,spark,flink,hbase,kafka,cdh环境等)。hadoop生态系统是一个很庞大的概念,hadoop只是其中最重要最基础的部分,生态系统的每一个子系统只结局的某一个特定的问题域。不是一个全能系统,而是多个小而精的系统。

组成

Hadoop common:提供一些通用的功能支持其他hadoop模块。

Hadoop Distributed File System:即分布式文件系统,简称HDFS。主要用来做数据存储,并提供对应用数据高吞吐量的访问。

Hadoop MapReduce:基于yarn的,能用来并行处理大数据集的计算框架。

Hadoop Yarn:用于作业调度和集群资源管理的框架。

二、HDFS概述

定义

Hdfs(hadoop distribute file system),他是一个文件系统,用于存储文件,通过目录树来定位文件:其次,他是分布式的,有很多服务器联合起来实现其功能,集群中的服务器有各自的角色。

Hdfs的使用场景,适合一次写入,多次读出的场景,且不支持文件的修改。适合用来做数据存放。

优点

  • 高容错性

    数据自动保存多个副本。 (默认是三分)通过增加副本的形式,提高容错性

    某一个副本丢失以后,它可以自动恢复

  • 适合大数据处理

    数据规模:能够处理数据规模达到GB、TB、甚至PB级别的数据

    文件规模:能够处理百万规模以上的文件数量,

  • 可构建在廉价机器上,通过多副本机制,提高可靠性

缺点

  • 不适合低延时数据访问,比如毫秒级的存储数据,是做不到的
  • 无法高效的对大量小文件进行存储
    • 存储大量小文件的话,它会占用NameNode大量的内存来存储文件目录和块信息。这样是不可取的,因为NameNode的内存总是有限的
    • 小文件存储的寻址时间会超过读取时间,它违反了HDFS的设计目标
  • 不支持并发写入、文件随机修改
    • 一个文件只能有一个写,不允许多个线程同时写(重点)
    • 仅支持数据append(追加),不支持文件的随机修改

hdfs支持的三种模式

  • Local (Standalone) Mode :本地模式,不启动进程,实际工作中从来没用过
  • Pseudo-Distributed Mode:伪分布式,启动单个进程(1大 小),应用场景:学习
  • Fully-Distributed Mode 集群模式,启动多个进程(2个大多个小),应用场景:生产(CDH,按量付费)

三、HDFS架构

img

1)NameNode(nn):Master,它是一个主管、管理者。

  • 管理HDFS的名称空间

    • 文件的名称、目录结构、权限、大小、所属用户用户组 时间
  • 处理客户端读写请求

  • 配置副本策略

  • 管理数据块(Block)映射信息

    • 文件被切割哪些块、块(块本身+2副本=3个块)分布在哪些DN节点上,blockmap 块映射。

    • 不会持久化存储这种映射关系,是通过集群启动运行时候,DN定期给NN汇报blockreport(BR),然后NN在内存中动态维护这种映射关系;

2)DataNode:Slave。NameNode下达命令,DataNode执行实际的操作

  • 存储实际的数据块和块的校验和

  • 执行数据块的读/写操作

  • 定期给NN发送块报告

    1
    2
    dfs.blockreport.intervalMsec  21600000=6h
    dfs.datanode.directoryscan.interval 21600s=6h

3)Client:客户端

  • 文件切分。文件上传HDFS的时候,Client将文件切分成一个一个的Block,然后进行上传
  • 与NameNode交互,获取文件的位置信息
  • 与DataNode交互,读取或者写入数据
  • Client提供一些命令来管理HDFS,比如NameNode格式化
  • Client可以通过一些命令来访问HDFS,比如对HDFS增删查改操作

4)Secondary NameNode:并非NameNode的热备。当NameNode挂掉的时候,它并不能马上替换NameNode并提供服务。

  • 辅助NameNode,分担其工作量,比如定期合并Fsimage和Edits,并推送给NameNode

    • edits 编辑日志文件

    • fsimage 镜像文件

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      22
      23
      24
      25
      26
      NN:
      -rw-rw-r-- 1 hadoop hadoop 42 Nov 28 08:07 edits_0000000000000000256-0000000000000000257
      -rw-rw-r-- 1 hadoop hadoop 42 Nov 28 09:07 edits_0000000000000000258-0000000000000000259
      -rw-rw-r-- 1 hadoop hadoop 1048576 Nov 28 09:07 edits_inprogress_0000000000000000260
      -rw-rw-r-- 1 hadoop hadoop 2874 Nov 28 08:07 fsimage_0000000000000000257
      -rw-rw-r-- 1 hadoop hadoop 62 Nov 28 08:07 fsimage_0000000000000000257.md5
      -rw-rw-r-- 1 hadoop hadoop 2874 Nov 28 09:07 fsimage_0000000000000000259
      -rw-rw-r-- 1 hadoop hadoop 62 Nov 28 09:07 fsimage_0000000000000000259.md5
      -rw-rw-r-- 1 hadoop hadoop 4 Nov 28 09:07 seen_txid
      -rw-rw-r-- 1 hadoop hadoop 219 Nov 26 22:01 VERSION
      [hadoop@hadoop001 current]$ pwd
      /home/hadoop/tmp/hadoop-hadoop/dfs/name/current

      SNN:
      -rw-rw-r-- 1 hadoop hadoop 42 Nov 28 08:07 edits_0000000000000000256-0000000000000000257
      -rw-rw-r-- 1 hadoop hadoop 42 Nov 28 09:07 edits_0000000000000000258-0000000000000000259
      -rw-rw-r-- 1 hadoop hadoop 2874 Nov 28 08:07 fsimage_0000000000000000257
      -rw-rw-r-- 1 hadoop hadoop 62 Nov 28 08:07 fsimage_0000000000000000257.md5
      -rw-rw-r-- 1 hadoop hadoop 2874 Nov 28 09:07 fsimage_0000000000000000259
      -rw-rw-r-- 1 hadoop hadoop 62 Nov 28 09:07 fsimage_0000000000000000259.md5

      将NN的
      fsimage_0000000000000000257
      edits_0000000000000000258-0000000000000000259
      拿到SNN,进行【合并】,生成fsimage_0000000000000000259文件,然后将此文件【推送】给NN;
      同时,NN在新的编辑日志文件edits_inprogress_0000000000000000260
  • 在紧急情况下,可辅助恢复NameNode

1
2
3
4
5
6
关于NN的补充:在大数据早期的时候,只有NN一个,假如挂了就真的挂了。
中期的时候,新增SNN来定期来合并、 备份 、推送,但是这样的也就是满足一定条件,如1小时,备份1次。例如,12点合并备份,但是12点半挂了,从SNN恢复到NN,只能恢复12点的时刻的元数据,丢了12点-12点半期间的元数据。

后期就取消SNN,新建一个实时NN,作为高可靠 HA。
NN Active
NN Standby 实时的等待active NN挂了,瞬间启动Standby-->Active,对外提供读写服务。

HDFS中的文件在物理上是分块存储,块的大小可以通过配置参数(dfs.Blocksize)来规定,默认大小在hadoop2.x版本中是128M,老版本是64M

思考:为什么块的大小不能设置太小,也不能设置太大?

(1)HDFS的块设置太小,会增加寻址时间,程序一直在找块的开始位置

(2)如果块设置的太大,从磁盘传输数据的时间会明显大于定位这个块开始位置所需的时间。导致程序在处理这块数据时,会非常慢。

总结:HDFS块的大小设置主要取决于磁盘传输速率

四、MapReduce on Yarn/Yarn的工作流程

MapReduce on Yarn

1.客户端client向ResourceManager提交应用程序/Application/作业JOB,包含application master程序,启动application master的命令等,并请求一个ApplicationMaster实例
2.RM为该job分配第一个container,与对应的NM通信,要求它在这个container启动作业的application master
3.application master向applications manager注册,这样用户就可以通过RM Web查看job的状态,一直到最后
4.application master采用轮询的方式通过【RPC】协议向resource scheduler申请和领取资源(哪台DN机器,领取多少内存 CPU)
5.一旦application master申请到资源后,与对应的NM通信,要求启动task
6.NM为任务设置好运行环境后,将任务的启动命令写到一个脚本中,并通过该脚本启动任务,运行任务
7.各个任务 task 通过【RPC】协议汇报自己的状态和进度,以让application master随时掌握各个任务的运行状态,从而在任务失败时,重启启动任务。
8.job运行完成后,application master向applications manager注销并关闭自己。

总结:
启动主程序,领取资源;1-4
运行任务,直到完成; 5-8

客户端提交job给 Applications Manager 连接Node Manager去申请一个Container的容器,这个容器运行作业的App Mstr的主程序,启动后向App Manager进行注册,然后可以访问URL界面,然后App Mastr向 Resource Scheduler申请资源,拿到一个资源的列表,和对应的NodeManager进行通信,去启动对应的Container容器,去运行 Reduce Task 和 Map Task (两个先后运行顺序随机运行),它们是向App Mstr进行汇报它们的运行状态, 当所有作业运行完成后还需要向Applications Manager进行汇报并注销和关闭

yarn中,它按照实际资源需求为每个任务分配资源,比如一个任务需要1GB内存,1个CPU,则为其分配对应的资源,而资源是用container表示的,container是一个抽象概念,它实际上是一个JAVA对象,里面有资源描述(资源所在节点,资源优先级,资源量,比如CPU量,内存量等)。当一个applicationmaster向RM申请资源时,RM会以container的形式将资源发送给对应的applicationmaster,applicationmaster收到container后,与对应的nodemanager通信,告诉它我要利用这个container运行某个任务。