之前分析过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设计便能够很快摸清楚整个网络通信的过程。

最新文章

  1. android下面使用SurfaceView+ mediaPlayer播放视频
  2. 代码规范、GitHub提交源码的标准 答题人-杨宇杰
  3. 【Flex学习】Flex4学习网站
  4. oracle连接错误
  5. Centos上Apache重启,mysql重启, nginx 重启方法
  6. 【线段树/数学/扩展欧几里得】 Bzoj 3913:奇数国
  7. 【Jsoup爬取网页内容】
  8. SPOJ 3937 - Wooden Sticks 最长上升子序列LIS
  9. Devexpress之barManager控件属性
  10. Centos7.3 安装Mysql5.7并修改初始密码
  11. pyhton购物程序
  12. sass 安装与使用
  13. matlab 将数字矩阵转换成图像
  14. C语言中的二维数组
  15. git本地仓库 push到远程仓库出现错误
  16. ASP.NET Core2利用MassTransit集成RabbitMQ
  17. Alpha发布评价
  18. HA_Snapshots 数据库快照
  19. python pandas.Series&&DataFrame&& set_index&reset_index
  20. Spring中依赖注入的四种方式

热门文章

  1. org.apache.flume.EventDeliveryException: NettyAvroRpcClient { host: hadoop1, port: 41414 }: Failed to send event
  2. Difference between exit() and sys.exit() in Python
  3. 传统maven项目创建
  4. 大O符号
  5. KbmMW资源汇总(特别是xalion的文章)
  6. (linux)likely和unlikely函数
  7. bzoj4103: [Thu Summer Camp 2015]异或运算
  8. HNOI2008 明明的烦恼 (purfer序列 + 组合数学)
  9. MYSQL数据库学习----MYSQL数据类型
  10. JAVA 布局控制