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 ...
随机推荐
- 手游服务器php架构比较
从swoole项目开始到现在,一直有人在问这个问题.今天来抽空讲一下它.为什么swoole非要使用纯C来写而不是PHP代码来实现,核心的原因有2点: 1. PHP无法直接调用操作系统API 如send ...
- ABAP range 用法
转自http://www.sapjx.com/abap-range-table.html 1. Range Table 概述 Range Table 为 SAP R/3系统标准内表的一种,结构与 Se ...
- Centos6.8更好yum源
第一步:备份你的原镜像文件,以免出错后可以恢复. mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.back ...
- JQuery树形插件Dynatree的包装对象
这是JQuery Dynatree插件的包装对象,做了些改进和增强,增加了右键菜单,以及相应事件等扩展1. [代码]MagicDTree的基本使用 <SCRIPT type=text/javas ...
- highchart学习网址
http://www.highcharts.me/api/index.html
- Intel® Media Server Studio Support
复制自网址:https://software.intel.com/en-us/intel-media-server-studio-support/code-samples Code Samples M ...
- JS DOM1核心概要1
节点:XML和HTML文档都是有节点构成的结构,每段标记都可以通过节点来表示: 节点类型: 元素节点(常用) 属性节点(常用) 文本节点 注释节点 文档节点 进程节点 文档类型节点 等... 了解节点 ...
- java 后台的学习步骤
一.JavaWeb部分 第一阶段:JavaWeb前端技术 web前端技术 HTML, CSS, JavaScript基础, jQuery基础, BootStrap. 第二阶段:服务器端技术 Mysql ...
- kafka实时流数据架构
初识kafka https://www.cnblogs.com/wenBlog/p/9550039.html 简介 Kafka经常用于实时流数据架构,用于提供实时分析.本篇将会简单介绍kafka以及它 ...
- U3D Navigation
让我们来一起粗步认识一下NavMesh的简单使用 首先我们建立一个新场景,在新场景我们创建 一个地形或者创建一个Plane, 然后在其上面用Cube或者其它的建立一些障碍物 再创建自己需要为其设置自动 ...