Spark网络通信分析
之前分析过spark RPC的基本流程(spark RPC详解),其实无论是RPC还是Spark内部的数据(Block)传输,都依赖更底层的网络通信,本文将对spark的网络通信做一下剖析。
1,概要
对于大数据相关的基础组件(Hadoop,HBase,Spark,Kafka),网络通信部分主要有两类:Java NIO和Netty。对于Hadoop,Spark,HBase以及kafka具体使用情况如下表:
|
大数据组件
|
Java NIO
|
Netty
|
|---|---|---|
| Hadoop | ✔️ | |
| Spark | ✔️ | |
| HBase | ✔️(2.0之前) | ✔️(2.0之后) |
| Kafka | ✔️ |
Hadoop和Kafka是基于Java NIO的,Spark之前是基于Akka,1.6之后全面改成了Netty。而HBase 2.0之前的实现是借鉴Hadoop也是基于Java NIO,2.0之后才有了Netty实现。无论是基于Netty框架还是Java NIO,网络通信的线程模型都是基于React。只不过Java NIO是显示的(从代码中可以直接看到Acceptor, Listener,Reader,Responder等相关组件),而Netty是隐形。总的来说, Netty提供了更抽象的封装,在易用性以及性能上会比Java NIO好一些(通过HBase来看,好像性能提升也不是特别明显)。
2,Spark实现
Spark网络通信实现所涉及的主要类图及之间的关系如下图所示:

要点如下:
1,TransportContext是入口,通过TransportContext可以创建TransportServer和TransportClientFactory,而TransportClientFactory可以创建TransportClient。这样负责发送数据的TransportClient和接收请求的TransportServer便创建完毕。
2,TransportClientFactory的作用不仅仅是创建TransportClient,同时它还含有一个缓存池,用来缓存到各个不同远端的TransportClient对象。如果获取不到,则基于Netty创建Bootstrap,设置相关参数,对应的Handler,最终创建TransportClient对象。
3,TransportServer和TransportClient都使用TransportContext中的initializePipeline来初始化一系列的handler。这些handler包括编解码器,以及TransportChannelHandler。TransportChannelHandler是一个处理输入消息的handler(Inbound),将根据不同的请求(RequestMessage or ResponseMessage)交由对应的handler(TransportRequestHandler or TransportResponseHandler)进行处理。
4,在以上图中,有一个非常重要的类RpcHandler。RpcHandler有很多不同的具体实现(如NettyRpcHandler主要实现基于Netty的Rpc实现,ExternalShuffleBlockHandler主要用来在External Shuffle service中发送和接收数据 )。可以看到不同的RpcHandler经过TransportContext→TransportChannelHandler→TransprotRequestHandler嵌入到上面的通信框架中,从而使得该框架能够适应不同的网络通信需求。总的来说:整体通信框架不变,但是通过RpcHandler让不同网络通信场景很好的融入了。
除此之外,网络通信过程中还涉及到了一些列的不同的消息,以及编码等,由于比较简单,不再做深入介绍。
3,小结
在以上基于Netty实现的网络通信中,应用主要的逻辑都封装在不同的handler中,然后通过层次感的handler设计便能够很快摸清楚整个网络通信的过程。
Spark网络通信分析的更多相关文章
- Spark源代码分析之六:Task调度(二)
话说在<Spark源代码分析之五:Task调度(一)>一文中,我们对Task调度分析到了DriverEndpoint的makeOffers()方法.这种方法针对接收到的ReviveOffe ...
- Spark原理分析目录
1 Spark原理分析 -- RDD的Partitioner原理分析 2 Spark原理分析 -- RDD的shuffle简介 3 Spark原理分析 -- RDD的shuffle框架的实现概要分析 ...
- 从0到1进行Spark history分析
一.总体思路 以上是我在平时工作中分析spark程序报错以及性能问题时的一般步骤.当然,首先说明一下,以上分析步骤是基于企业级大数据平台,该平台会抹平很多开发难度,比如会有调度日志(spark-sub ...
- Spork: Pig on Spark实现分析
介绍 Spork是Pig on Spark的highly experimental版本号,依赖的版本号也比較久,如之前文章里所说.眼下我把Spork维护在自己的github上:flare-spork. ...
- hive Spark SQL分析窗口函数
Spark1.4发布,支持了窗口分析函数(window functions).在离线平台中,90%以上的离线分析任务都是使用Hive实现,其中必然会使用很多窗口分析函数,如果SparkSQL支持窗口分 ...
- Spark案例分析
一.需求:计算网页访问量前三名 import org.apache.spark.rdd.RDD import org.apache.spark.{SparkConf, SparkContext} /* ...
- Spark源代码分析之中的一个:Job提交执行总流程概述
Spark是一个基于内存的分布式计算框架.执行在其上的应用程序,依照Action被划分为一个个Job.而Job提交执行的总流程.大致分为两个阶段: 1.Stage划分与提交 (1)Job依照RDD之间 ...
- spark job分析
spark job spark job提交 三级调度框架, DagSch,计算stage,提交阶段,将stage映射成taskset,提交taskset给tasksch. TaskSch Backen ...
- spark复习笔记(4):spark脚本分析
1.[start-all.sh] #!/usr/bin/env bash # # Licensed to the Apache Software Foundation (ASF) under one ...
随机推荐
- 关闭mongodb 集群
[root@hadoop1 ~]# ps -aux | grep mongodb; root ? Sl : : /usr/local/mongodb/bin/mongod -f /usr/local/ ...
- android支付
这里不讲具体的某个平台的支付使用,在工作中,公司使用到了ping++支付,使用它的好处是可以不用关心某个平台的支付了,例如:微信支付.支付宝支付等,太多的平台有个整合,是一个很好的事情,当然这也减轻了 ...
- C++使用模板、函数指针、接口和lambda表达式这四种方法做回调函数的区别比较
在C++中,两个类之间存在一种关系,某个类需要另外一个类去完成某一个功能,完成了之后需要告知该类结果,这种最普通最常见的需求,往往使用回调函数来解决. 如题,我总结下来有这么四种方式可以完成这项功能, ...
- 几个 PHP 的"魔术常量"
__LINE__ 文件中的当前行号. __FILE__ 文件的完整路径和文件名.如果用在被包含文件中,则返回被包含的文件名.自 PHP 4.0.2 起,__FILE__ 总是包含一个绝对路径(如果是符 ...
- linux内核的三种主要调度策略
linux内核的三种主要调度策略: 1,SCHED_OTHER 分时调度策略, 2,SCHED_FIFO实时调度策略,先到先服务 3,SCHED_RR实时调度策略,时间片轮转 实时进程将得到优先调用, ...
- bzoj5328: [Sdoi2018]物理实验
果然我还是太菜了,爆了一天才过....隔壁肉丝都不知道喊了多少句哎╮(╯▽╰)╭我又A了什么傻逼题(然鹅就是wf和国集的题QWQ) 其实这个题就是个裸题,但是我就是不会... 这个题第一步就是明显的旋 ...
- [Selenium] 如何绕过 IE 的安全模式
自从 IE7 引入 Protected Mode 以来, IE 浏览器的安全性的确得到了一定程度的提高.其原理从本质来讲,在浏览某些需要启用保护模式的页面时,会开启一个新的浏览器会话以完成任务,而此时 ...
- Python3中使用PyMongo的方法详解
前言 本文主要给大家介绍的是关于在Python3使用PyMongo的方法,分享出来供大家参考学习,下面话不多说了,来一起看看详细介绍: MongoDB存储 在这里我们来看一下Python3下Mongo ...
- UVA 11174 Stand in a Line 树上计数
UVA 11174 考虑每个人(t)的所有子女,在全排列中,t可以和他的任意子女交换位置构成新的排列,所以全排列n!/所有人的子女数连乘 即是答案 当然由于有MOD 要求逆. #include & ...
- bzoj1207 [HNOI2004]打鼹鼠——LIS
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1207 这题和求LIS有点像,打这一只鼹鼠一定可以从打上一只鼹鼠转移过来: 所以不用考虑机器人 ...