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支持压缩
- HAR(Hadoop Archives)是用来减轻大量文件给NameNode内存带来的压力的。
满地都是六便士,她却抬头看见了月亮。
浙公网安备 33010602011771号