之前分析过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网络通信分析的更多相关文章

  1. Spark源代码分析之六:Task调度(二)

    话说在<Spark源代码分析之五:Task调度(一)>一文中,我们对Task调度分析到了DriverEndpoint的makeOffers()方法.这种方法针对接收到的ReviveOffe ...

  2. Spark原理分析目录

    1 Spark原理分析 -- RDD的Partitioner原理分析 2 Spark原理分析 -- RDD的shuffle简介 3 Spark原理分析 -- RDD的shuffle框架的实现概要分析 ...

  3. 从0到1进行Spark history分析

    一.总体思路 以上是我在平时工作中分析spark程序报错以及性能问题时的一般步骤.当然,首先说明一下,以上分析步骤是基于企业级大数据平台,该平台会抹平很多开发难度,比如会有调度日志(spark-sub ...

  4. Spork: Pig on Spark实现分析

    介绍 Spork是Pig on Spark的highly experimental版本号,依赖的版本号也比較久,如之前文章里所说.眼下我把Spork维护在自己的github上:flare-spork. ...

  5. hive Spark SQL分析窗口函数

    Spark1.4发布,支持了窗口分析函数(window functions).在离线平台中,90%以上的离线分析任务都是使用Hive实现,其中必然会使用很多窗口分析函数,如果SparkSQL支持窗口分 ...

  6. Spark案例分析

    一.需求:计算网页访问量前三名 import org.apache.spark.rdd.RDD import org.apache.spark.{SparkConf, SparkContext} /* ...

  7. Spark源代码分析之中的一个:Job提交执行总流程概述

    Spark是一个基于内存的分布式计算框架.执行在其上的应用程序,依照Action被划分为一个个Job.而Job提交执行的总流程.大致分为两个阶段: 1.Stage划分与提交 (1)Job依照RDD之间 ...

  8. spark job分析

    spark job spark job提交 三级调度框架, DagSch,计算stage,提交阶段,将stage映射成taskset,提交taskset给tasksch. TaskSch Backen ...

  9. spark复习笔记(4):spark脚本分析

    1.[start-all.sh] #!/usr/bin/env bash # # Licensed to the Apache Software Foundation (ASF) under one ...

随机推荐

  1. CodeForces 24D Broken robot(期望+高斯消元)

    CodeForces 24D Broken robot 大致题意:你有一个n行m列的矩形板,有一个机器人在开始在第i行第j列,它每一步会随机从可以选择的方案里任选一个(向下走一格,向左走一格,向右走一 ...

  2. spin_lock、spin_lock_irq、spin_lock_irqsave区别

    void spin_lock(spinlock_t *lock); void spin_lock_irq(spinlock_t *lock); void spin_lock_irqsave(spinl ...

  3. 详解likely和unlikely函数【转】

    本文转载自:http://blog.csdn.net/npy_lp/article/details/7175517 内核源码:Linux-2.6.38.8.tar.bz2 参考文档:http://gc ...

  4. codeforces C. Magic Formulas 解题报告

    题目链接:http://codeforces.com/problemset/problem/424/C 题目意思:给出 n 个数:p1, p2, ..., pn,定义: q1 = p1 ^ (1 mo ...

  5. C#在一段数字区间内随机生成若干个互不相同的随机数

    /// <summary>        /// Random ra=new Random();  系统自动选取当前时前作随机种子:        /// Random ra=new Ra ...

  6. codeforces 672A A. Summer Camp(水题)

    题目链接: A. Summer Camp time limit per test 1 second memory limit per test 256 megabytes input standard ...

  7. 实现自定义xib和storyboard的加载,

    一:加载xib 1.分别创建xib,.h  .m文件继承自UIView. 在xib上绑定类名. 或者创建文件的时候直接勾选xib 2.在控制器中调用类方法 jyq52787网盘/ios/潭州学院/iO ...

  8. 【伪题解】 [Offer收割]编程练习赛58

    [A:最大的K-偏差排列]: 第一次在hiho卡一题,所以暴力了搜索了一下,70分,后面回来打表找规律,规律是有和K有关的周期. 当K<=N/2时,成周期交叉变化,最后尾部部分单独考虑. 当K& ...

  9. 「 LuoguT37042」 求子序列个数

    Description 给定序列 A, 求出 A 中本质不同的子序列 (包含空的子序列) 个数模 10^9+ 7 的结果. 一个序列 B 是 A 的子序列需要满足 A 删掉某些元素后能够得到 B. 两 ...

  10. 使用Pycharm官方统计代码行插件统计代码总行数

    最近有需求,需要统计项目代码的总行数,首先想到了使用Pycharm官方的统计行数插件,发现效果还不错. 官方代码统计插件指导:https://plugins.jetbrains.com/plugin/ ...