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. 也谈TDD,以及三层架构、设计模式、ORM……没有免费的午餐,选择了,必付出代价

    想在园子里写点东西已经很久了,但一直没有落笔,忙着做 一起帮 的开发直播,还有些软文做推广,还要做奶爸带孩子,还要……好吧,我承认,真正的原因是: 太特么的难写了! 但再难写也要写啊,要等到“能写好了 ...

  2. FastAdmin + uni-app

    FastAdmin + uni-app FastAdmin https://www.FastAdmin.net uni-app http://uniapp.dcloud.io/ 自己先挖个坑.

  3. yii2史上最简单式安装教程,没有之一(转)

    测试说明:按照文章下载文件,虽然是tgz文件,用winrar解压,在CMD中运行init.bat文件. 既然是安装Yii,我们先去官网下载一份Yii的高级模版,什么,你说打开页面乱七八糟的英文字母你看 ...

  4. jquery 实现点击颜色切换

    <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content ...

  5. Models-详细操作

    # 单表简单查询13种方法 1.all(): 查询所有结果 all: models.表名.objects.all() book_all=models.Book.objects.all() # 结果是q ...

  6. mongoDB的了解

    一.什么是mongoDB? 1.MongoDB 是由C++语言编写的,是一个基于分布式文件存储的开源数据库系统.在高负载的情况下,添加更多的节点,可以保证服务器性能. 2.MongoDB 旨在为WEB ...

  7. rainyday.js

    /** * Defines a new instance of the rainyday.js. * @param options options element with script parame ...

  8. js的console你知道多少

    js的console你知道多少? 列出所有的console属性 console.dir(console) 或者 console.dirxml(console) 记录代码执行时间 console.tim ...

  9. windows下使用nginx

    本文介绍如何在windows下使用nginx 起步 下载安装 将nginx安装成windows服务 常用命令 构建服务 静态服务 代理服务器 http配置文件转移 负载均衡 负载均衡配置 负载均衡方法 ...

  10. 第十三章 Spring消息(待续)

    ···············