MapReduce-编程模型

  • MapReduce核心思想就是分而治之。[背后的思想其实是把一些数据通过map来归类,通过reducer来把同一类数据进行处理]

处理流程

  • 每个map任务都有一个环形内存缓冲区,用于存储任务输出。
  • 缓冲区达到80%阈值时,会将数据spill溢写到磁盘
  • 写磁盘之前要partition,sort,还要进行combine(if have)。[memory中会进行内排序]
  • spill是先进行分区,然后对每个分区进行合并,最后它会将数据合并成一个大文件,相同分区号的数据进行合并,合并完成后每个分区内的数据再按照key2(if have)进行合并。【因为会有多个spill文件,所以每个map side都需要合并】
  • map side进行分区文件合并时,如果spill文件个数大于min.num.spills.for.combine个spill file时,也会执行combiner。 
  • 合并完成后,向taskTracker进行汇报,然后reducer就知道这个文件的映射关系了。
  • 接下来reducer通过HTTP方式来下载数据,下载很多小文件,接着会进行合并排序(感觉可能类似归并排序),然后作为reduce输入,最后写入HDFS。

combiner调用时机

  • map side内存缓冲区spill到磁盘之前
  • map side合并spill文件时,如果文件个数超过min.num.spills.for.combine也会进行combiner
  • reduce side进行文件合并时
  • --> combiner核心就是减少磁盘写入的数据量以及网络传输的数据量

MR优化

  • 避免处理大批的小文件:对小文件的处理。
  • 数据压缩,减少数据传输和 I/O 开销。 (LZO, splittable)
  • 设置combiner,减少Map Task中间输出的结果,进而减少写磁盘以及网络传输。
  • 启动推测执行:推测执行是Hadoop对“拖后腿”的任务的一种优化机制,当一个作业的某些任务运行速度明显低于其他作业时,Hadoop会在另一个节点上为“慢任务”启动一个备份任务

数据倾斜

  • 采样 + 自定义partitioner

 

容错处理

 

Yarn

  • MRv1的不足
    • JobTracker:资源管理 & 作业控制
      • JobTracker是MR框架的中心,存在单点故障。它需要与集群中的机器定时通信(heartbeat),需要管理哪些程序应该运行在哪些机器上,管理所有job失败重启等。
      • --> MRv2的思想是分离JobTracker --> 资源管理 + 任务调度
    • TaskTracker端:
      • TaskTracker端,把资源强制划分为map task slot & reduce task slot
      • --> 仅仅以map/reduce task数目作为资源的表示过于简单,未考虑到cpu & 内存的占用情况。(比如当两个大内存消耗的task被调度到一块的话,很容易出现OOM。反之,内存可能极大浪费)。
      • --> MRv2基于此的改进就是,基于container划分资源,考虑内存,CPU,磁盘,网络等待。

Yarn架构

  • client:提交分布式程序的客户端,上传资源文件和JAR包到HDFS集群
  • ResourceManager:负责将集群的资源分配给各个应用使用。[RM是一个中心的服务,它调度、启动每一个Job所属的AM,监控AM的存在情况。]
  • Container:资源分配和调度的基本单元,其中封装了的资源如内存、CPU、磁盘、网络带宽等。
  • NodeManager:计算节点,负责启动container。同时通过心跳不断地与RM通信,描述该worker节点的资源(CPU,内存,硬盘和网络带宽等)状况。[NM的功能比较单一,即负责container状态的维护,并向RM保持心跳。]
  • ApplicationMaster:对于client提交的一个应用。client每提交一个应用,RM会在worker节点上给它分配一个全局唯一的 App Master。AM负责管理作业的整个生命周期,包括通知NM创建container,管理container等。 [AM负责一个Job生命周期内的所有工作。]
  • --> Yarn分离出AM,还使得AM变成一个灵活可变更的部分,用户可以对不同的编程模型写自己的AM,让更多类型的编程模型可以跑在Hadoop集群上。

工作流程

  • RM收到client请求后,会在全局查看资源,如果哪台worker合适,其上运行的NM就为该作业生成container实例。生成的第一个Container实例内运行的就是AppMaster。AppMaster运行成功的时候要向RM进行注册。
  • AppMaster向RM申请资源(eg:10个Container),得到消息反馈后,控制NM启动Container并运行任务,Container启动后直接对App Master负责(作业的调度中心是App Master,极大的减轻的RM的负担)。
  • Tip:如果没有足够的container可以被申请,则会进行等待其他作业完成任务,空出Container后进行分配。
  • App Master监控容器上任务的执行情况,反馈作业的执行状态信息和完成状态。

Resource Manager

  • 在YARN中,ResourceManager负责集群中所有资源的统一管理和分配,它接收来自各个节点(NodeManager)的资源汇报信息,并把这些信息按照一定的策略分配给各个应用程序(实际上是ApplicationManager)。
  • RM主要由以下几个部分组成:
    • 用户交互:
    • NM管理:
      • NMLivelinessMonitor:监控NM是否alive。若一个NM在一定时间内(默认10min)未汇报信条信息,则认为NM dead,将其移除集群。
      • NodesListManager:维护正常节点和异常节点列表,管理exlude(类似于黑名单)和inlude(类似于白名单)节点列表,这两个列表均是在配置文件中设置的,可以动态加载。
      • ResourceTackerService:处理来自NM的请求,主要包括两种请求:注册和心跳。其中,注册是NodeManager启动S时发生的行为,请求包中包含节点ID,可用的资源上限等信息,而心跳是周期性行为,包含各个Container运行状态,运行的Application列表、节点健康状况(可通过一个脚本设置),而ResourceTrackerService则为NM返回待释放的Container列表、Application列表等。
    • AM管理:
      • AMLivelinessMonitor监控AM是否alive,如果一个ApplicationMaster在一定时间(默认为10min)内未汇报心跳信息,则认为它dead,它上面所有正在运行的Container将被认为死亡,AM本身会被重新分配到另外一个节点上(用户可指定每个ApplicationMaster的尝试次数,默认是1次)执行。
      • ApplicationMasterLauncher与NodeManager通信,要求它为某个应用程序启动ApplicationMaster。
      • ApplicationMasterService:处理来自ApplicationMaster的请求,主要包括两种请求:注册和心跳,其中,注册是ApplicationMaster启动时发生的行为,包括请求包中包含所在节点,RPC端口号和tracking URL等信息,而心跳是周期性 行为,包含请求资源的类型描述、待释放的Container列表等,而AMS则为之返回新分配的Container、失败的Container等信息。
    • TBD...

 

作业调度

 

 

HDFS

  • 设计目标:
    • HDFS is a filesystem designed for storing very large files with streaming or sequential data access patterns.
    • That's to say, "Hadoop is good for sequential data access"
    • HDFS is append only. (To modify any portion of a file that is already written, one must rewrite the entire file and replace the old file.)

小文件问题

  • 小文件引出的问题:
    • Namenode内存压力
    • MR输入size小 --> 运行时间长
  • 可能存在的solution:
    • 这些小文件是一个大的logical file 的pieces: 通过写一个程序来连接这些小文件
    • 这些小文件是inherently small: 需要某种容器按某种方式来group这些文件
  • solutions in Hadoop:
    • HAR(Hadoop Archives)是用来减轻大量文件给NameNode内存带来的压力的。
      • 可以把多个文件归档成一个文件,归档后还可以透明地访问每一个文件,并且可以作为MR的输入
      • HAR是特殊的档案格式
      • 一个HAR对应一个文件系统目录
    • SequenceFile:
      • 概念就是将每个小文件放到一个更大的single file中
      • 实际上是Hadoop API提供的一种二进制文件,它将数据以 <key, value> 形式序列化到文件中
      • 比如,有10,000,100KB文件,那么可以写一个程序将他们放到一个单一的SeqFile中,其中你可以使用filename作为key,内容作为value。
      • 好处是:
        • NameNode占用更少的内存
        • SeqFile是splittable的,因此适合MR
        • SeqFile支持压缩