TransportContext用来创建TransportServer和TransportclientFactory,同时使用TransportChannelHandler用来配置channel的pipelines,TransportClient提供了两种传输协议,一个是数据层(fetch chunk),一个是控制层(rpc)。rpc的处理需要用户提供一个RpcHandler来处理,它负责建立一个用于传输的流, 使用zero-copy以块的形式进行数据传输。TransportServer和TransportClientFactory为每个channel都创建了一个TransportChannelHandler,每个TransportChannelHandler都包含一个TransportClient,这样服务端可以使用该client向客户端发送消息。

该类有两个主要方法一个是创建TransportChannelHandler一个是给channel配置处理器。
  1. privateTransportChannelHandler createChannelHandler(Channel channel,RpcHandler rpcHandler){
  2. TransportResponseHandler responseHandler =newTransportResponseHandler(channel);
  3. TransportClient client =newTransportClient(channel, responseHandler);
  4. TransportRequestHandler requestHandler =newTransportRequestHandler(channel, client,
  5. rpcHandler);
  6. returnnewTransportChannelHandler(client, responseHandler, requestHandler,
  7. conf.connectionTimeoutMs(), closeIdleConnections);
  8. }
这个可以看到TransportResponseHandler需要一个Channel,TransportClient需要channel和TransportResponseHandler,TransportRequestHandler需要channel, TransportClient和RpcHandler. TransportChannelHandler需要client,requestHandler,responseHandler. 这里发送channel,client被使用了多次。transportclient的channel可以从responseHandler中获取。这里挺乱的。
  1. publicTransportChannelHandler initializePipeline(
  2. SocketChannel channel,
  3. RpcHandler channelRpcHandler){
  4. try{
  5. TransportChannelHandler channelHandler = createChannelHandler(channel, channelRpcHandler);
  6. channel.pipeline()
  7. .addLast("encoder", encoder)
  8. .addLast(TransportFrameDecoder.HANDLER_NAME,NettyUtils.createFrameDecoder())
  9. .addLast("decoder", decoder)
  10. .addLast("idleStateHandler",newIdleStateHandler(0,0, conf.connectionTimeoutMs()/1000))
  11. // NOTE: Chunks are currently guaranteed to be returned in the order of request, but this
  12. // would require more logic to guarantee if this were not part of the same event loop.
  13. .addLast("handler", channelHandler);
  14. return channelHandler;
  15. }catch(RuntimeException e){
  16. logger.error("Error while initializing Netty pipeline", e);
  17. throw e;
  18. }
  19. }
用来给channel配置channelHandler.第一个是处理出通道的处理器,后面是处理进通道的处理器。
 
下面看看TransportServer。构建一个服务端。
  1. privatevoid init(String hostToBind,int portToBind){
  2. IOMode ioMode =IOMode.valueOf(conf.ioMode());
  3. EventLoopGroup bossGroup =
  4. NettyUtils.createEventLoop(ioMode, conf.serverThreads(),"shuffle-server");
  5. EventLoopGroup workerGroup = bossGroup;
  6. PooledByteBufAllocator allocator =NettyUtils.createPooledByteBufAllocator(
  7. conf.preferDirectBufs(),true/* allowCache */, conf.serverThreads());
  8. bootstrap =newServerBootstrap()
  9. .group(bossGroup, workerGroup)
  10. .channel(NettyUtils.getServerChannelClass(ioMode))
  11. .option(ChannelOption.ALLOCATOR, allocator)
  12. .childOption(ChannelOption.ALLOCATOR, allocator);
  13. if(conf.backLog()>0){
  14. bootstrap.option(ChannelOption.SO_BACKLOG, conf.backLog());
  15. }
  16. if(conf.receiveBuf()>0){
  17. bootstrap.childOption(ChannelOption.SO_RCVBUF, conf.receiveBuf());
  18. }
  19. if(conf.sendBuf()>0){
  20. bootstrap.childOption(ChannelOption.SO_SNDBUF, conf.sendBuf());
  21. }
  22. bootstrap.childHandler(newChannelInitializer<SocketChannel>(){
  23. @Override
  24. protectedvoid initChannel(SocketChannel ch)throwsException{
  25. RpcHandler rpcHandler = appRpcHandler;
  26. for(TransportServerBootstrap bootstrap : bootstraps){
  27. rpcHandler = bootstrap.doBootstrap(ch, rpcHandler);
  28. }
  29. context.initializePipeline(ch, rpcHandler);
  30. }
  31. });
  32. InetSocketAddress address = hostToBind ==null?
  33. newInetSocketAddress(portToBind):newInetSocketAddress(hostToBind, portToBind);
  34. channelFuture = bootstrap.bind(address);
  35. channelFuture.syncUninterruptibly();
  36. port =((InetSocketAddress) channelFuture.channel().localAddress()).getPort();
  37. logger.debug("Shuffle server started on port :"+ port);
  38. }
这块是netty中构建一个服务器的流程。配置的缓存生成器是内存池分配器。IO使用的是NIO(EPOLL不兼容windows),相关的配置参数看TransportConf
 
整个spark的network部分的common模块看完了。其余部分有时间在研究。
 
 
 

spark源码阅读之network(3)的更多相关文章

  1. spark源码阅读之network(1)

    spark将在1.6中替换掉akka,而采用netty实现整个集群的rpc的框架,netty的内存管理和NIO支持将有效的提高spark集群的网络传输能力,为了看懂这块代码,在网上找了两本书看< ...

  2. spark源码阅读之network(2)

    在上节的解读中发现spark的源码中大量使用netty的buffer部分的api,该节将看到netty核心的一些api,比如channel: 在Netty里,Channel是通讯的载体(网络套接字或组 ...

  3. Spark源码阅读之存储体系--存储体系概述与shuffle服务

    一.概述 根据<深入理解Spark:核心思想与源码分析>一书,结合最新的spark源代码master分支进行源码阅读,对新版本的代码加上自己的一些理解,如有错误,希望指出. 1.块管理器B ...

  4. win7+idea+maven搭建spark源码阅读环境

    1.参考. 利用IDEA工具编译Spark源码(1.60~2.20) https://blog.csdn.net/He11o_Liu/article/details/78739699 Maven编译打 ...

  5. spark源码阅读

    根据spark2.2的编译顺序来确定源码阅读顺序,只阅读核心的基本部分. 1.common目录 ①Tags②Sketch③Networking④Shuffle Streaming Service⑤Un ...

  6. emacs+ensime+sbt打造spark源码阅读环境

    欢迎转载,转载请注明出处,徽沪一郎. 概述 Scala越来越流行, Spark也愈来愈红火, 对spark的代码进行走读也成了一个很普遍的行为.不巧的是,当前java社区中很流行的ide如eclips ...

  7. spark源码阅读---Utils.getCallSite

    1 作用 当该方法在spark内部代码中调用时,会返回当前调用spark代码的用户类的名称,以及其所调用的spark方法.所谓用户类,就是我们这些用户使用spark api的类. 2 内部实现 2.1 ...

  8. spark源码阅读--SparkContext启动过程

    ##SparkContext启动过程 基于spark 2.1.0  scala 2.11.8 spark源码的体系结构实在是很庞大,从使用spark-submit脚本提交任务,到向yarn申请容器,启 ...

  9. Spark源码阅读(1): Stage划分

    Spark中job由action动作生成,那么stage是如何划分的呢?一般的解答是根据宽窄依赖划分.那么我们深入源码看看吧 一个action 例如count,会在多次runJob中传递,最终会到一个 ...

随机推荐

  1. BZOJ4832: [Lydsy2017年4月月赛]抵制克苏恩

    传送门 题目大意: 攻击k次,每次可攻击随从或英雄. 随从数不大于7个,且1滴血的a个,2滴b个,3滴c个. 攻击一次血-1,如果随从没死可以生成3滴血随从一个 题解: 概率/期望dp f[i][j] ...

  2. browser-sync 服务器使用

    1. 安装 npm install browser-sync or yarn add browser-sync 2. 使用(集成gulp) 备注: gulp 安装使用此处不介绍 默认的端口是3000, ...

  3. envoy  功能介绍

    L3/L4 filter architecture: At its core, Envoy is an L3/L4 network proxy. A pluggable filter chain me ...

  4. ansible命令应用示例

                                  ansible命令应用示例                             ping slave组 ansible slave -m ...

  5. Python--urllib3库

    Urllib3是一个功能强大,条理清晰,用于HTTP客户端的Python库,许多Python的原生系统已经开始使用urllib3.Urllib3提供了很多python标准库里所没有的重要特性:   1 ...

  6. FPGA前世今生(三)

    上期介绍了关于FPGA的IOB单元,这期我们介绍一下FPGA内部的其他资源,这些都是学好FPGA的基础.不管前世的沧桑,还是后世的风光,我们都要把我现在的时光,打好基础,学好FPGA. 大多数FPGA ...

  7. centos7防火墙 启动和关闭

    CentOS 7.0默认使用的是firewall作为防火墙,这里改为iptables防火墙.firewall:systemctl start firewalld.service   #启动firewa ...

  8. PHP生成唯一固定长度邀请码

    function create_invite_code() { $code = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'; $rand = $code[rand(0,25)] .str ...

  9. php去除html

    代码如下 //清除html function clearhtml($str){ $str = trim($str); $str = strip_tags($str,""); $st ...

  10. UE4事件相关总结

    转自:http://blog.ch-wind.com/ue4-event-overview/ 事件机制是实现游戏内逻辑的重要部分,在开始进行游戏逻辑的设计和实现之前,对UE4的事件机制进行理解是非常必 ...