Spark MapOutputTracker浅析

最近工作中踩到一个MapOutputTracker相关的坑 (SPARK-21444), troubleShooting的过程中阅读了MapOutputTracker的代码,在此做个整理。本文先概括性地介绍MapOutputTracker的功能和架构,然后根据源码分析其具体实现。

MapOutputTracker简介

MapOutputTracker是spark环境的主要组件之一,其功能是管理各个shuffleMapTask的输出数据。reduce任务就是根据MapOutputTracker提供的信息决定从哪些executor获取需要的map输出数据。MapOutputTracker的架构如下图所示:

Architecture of MapOutputTracker

如上图所示,MapOutputTracker在executor和driver端都存在。

1. MapOutputTrackerMaster和MapOutputTrackerMasterEndpoint存在于driver端

2. MapOutputTrackerMasterEndpoint是MapOutputTrackerMaster的RPC endpoint

3. MapOutputTrackerWorker存在于executor端

4. MapOutputTrackerMaster负责管理所有shuffleMapTask的输出数据,每个shuffleMapTask执行完后会把执行结果(MapStatus对象)注册到MapOutputTrackerMaster.

5. MapOutputTrackerMaster会处理executor发送的GetMapOutputStatuses请求,并返回serializedMapStatus给executor端

6. MapOutputTrackerWorker负责为reduce任务提供shuffleMapTask的输出数据信息(MapStatus对象)

7. 如果MapOutputTrackerWorker在本地没有找到请求的shuffle的mapStatuses,则会向MapOutputTrackerMasterEndpoint发送GetMapOutputStatuses请求获取对应的mapStatuses

MapStatus和ShuffleStatus

MapStatus用于表示ShuffleMapTask的运行结果, 包括map任务输出数据的location和size信息:

MapStatus

ShuffleStatus用于管理一个shuffle对应的所有ShuffleMapTask的运行结果,ShuffleStatus对象只存在于MapOutputTrackerMaster中。

每个ShuffleStatus对象都包含一个mapStatuses数组,该数组的元素类型为MapStatus,数组下标即shuffleMapTask的map id。

ShuffleStatus提供了一系列用于添加,移除,序列化,缓存和广播mapStatus的方法。比如:

1. invalidateSerializedMapOutputStatusCache方法用于清空mapStatuses的缓存,包括移除对应的广播变量。

2. serializeMapStatuses方法用于序列化并广播mapStatuses数组

MapOutputTrackerMaster

shuffleStatus映射和GetMapOutputMessage请求队列

MapOutputTrackerMaster是driver端用于管理所有shuffle的map任务输出数据的组件。MapOutputTrackerMaster维护了一个ShuffleStatus映射和一个GetMapOutputMessage请求队列:

ShuffleStatues和mapOutputRequests

GetMapOutputMessage由GetMapOutputStatuses转化而来,后面介绍MapOutputTrackerMasterEndpoint时会讲到。shuffleStatuses保存着shuffle id和shuffleStatus的mapping关系,而mapOutputRequests则保存着该MapOutputTrackerMaster所有未处理的GetMapOutputMessage请求。注意,这里使用了LinkedBlockingQueue进行存储,很容易想到,这个队列会被多个线程并发访问。

MessageLoop和请求处理线程池

MapOutputTrackerMaster用MessageLoop来处理mapOutputRequests队列中的请求:

MessageLoop in MapOutputTrackerMaster

messageLoop会循环地从mapOutputRequests队列中获取GetMapOutputMessage请求进行处理,处理完后会调用RpcCallContext的reply方法将序列化后的shuffleStatus返回给客户端。messageLoop会一直循环处理请求,直到获取到PoisonPill消息,而这个消息是MapOutputTrackerMaster的stop方法发出的。

上文提到mapOutputRequests队列会被多个线程并发访问,这是因为MapOutputTrackerMaster创建了一个线程池并发运行多个messageLoop. 线程池的大小由参数spark.shuffle.mapOutput.dispatcher.numThreads控制,默认为8 :

Thread pool for running messageLoop

添加/移除shuffle和mapOutput

MapOutputTrackerMaster中包含了一系列用于添加/移除,注册/注销shuffle和map output的方法:

Methods for adding/removing shuffle and map output in MapOutputTrackerMaster

MapOutputTrackerWorker

如上文所述,MapOutputTrackerWorker存在于executor端,其主要功能是从MapOutputTrackerMaster获取map output信息(mapStatuses):

MapOutputTrackerWorker

MapOutputTrackerWorker也维护了一个mapStatuses对象。注意,MapOutputTrackerWorker的mapStatuses和MapOutputTrackerMaster中shuffleStatus里面的mapStatuses是不同类型的。

shuffleStatus中mapStatuses的类型是Array[MapStatus],数组下标是shuffle中的map id.

而MapOutputTrackerWorker中mapStatuses的类型是Map[Int, Array[MapStatus]],key为shuffle id,value就是该shuffle对应的mapStatuses.

MapOutputTrackerMasterEndpoint

MapOutputTrackerMasterEndpoint是MapOutputTrackerMaster的RPC endpoint,只存在于driver端。所有发送给MapOutputTrackerMaster的GetMapOutputStatuses请求都由MapOutputTrackerMasterEndpoint接收,转化成GetMapOutputMessage并添加到MapOutputTrackerMaster的mapOutputRequests队列中等待messageLoop处理:

MapOutputTrackerMasterEndpoint

总结

本文先简单地介绍了MapOutputTracker的功能和架构,然后分别对MapOutputTrackerMaster,MapOutputTrackerWorker和MapOutputTrackerMasterEndpoint类及其主要相关组件进行了简单介绍和分析。

说明

1. 本文所涉及源码版本为2.4.0

2. 如有错误,敬请指出

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,117评论 4 360
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 66,963评论 1 290
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 107,897评论 0 240
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,805评论 0 203
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,208评论 3 286
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,535评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,797评论 2 311
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,493评论 0 197
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,215评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,477评论 2 244
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,988评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,325评论 2 252
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,971评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,055评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,807评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,544评论 2 271
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,455评论 2 266

推荐阅读更多精彩内容