要了解 splitLocalRemoteBlocks方法需要先知道什么?
splitLocalRemoteBlocks方法用于划分哪些Block从本地获取,哪些需要远程拉取,是获取中间计算结果的关键。为便于描述,先解释以下定义:
targetRequestSize:每个远程请求的最大尺寸。 totalBlocks:统计Block总数。 localBlocks:ArrayBuffer[BlockId],缓存可以在本地获取的Block的blockId。 remoteBlocks:HashSet[BlockId]j,缓存需要远程获取的Block的blockId。 curBlocks:ArrayBuffer[(BlockId, Long)],远程获取的累加缓存,用于保证每个远程请求的尺寸不超过targetRequestSize。为什么要累加缓存?如果向一个机器节点频繁地请求字节数很小的Block,那么势必造成网络拥塞并增加节点负担。将多个小数据量的请求合并为一个大的请求将避免这些问题,提高系统性能。 curRequestSize:当前累加到curBlocks中的所有Block的大小之和,用于保证每个远程请求的尺寸不超过targetRequestSize。 remoteRequests:new ArrayBuffer[FetchRequest],缓存需要远程请求的FetchRequest对象。
numBlocksToFetch:一共要获取的Block数量。 maxBytesInFlight:单次航班请求的最大字节数。什么叫航班?其实就是一批请求,这批请求的字节总数不能超过maxBytesInFlight,而且每个请求的字节数不能超过maxBytesInFilght的五分之一。可以通过参数spark.reducer.maxMbInFlight来控制大小。为什么每个请求的字节数不能超过maxBytesInFlight的五分之一?这样做是为了提高请求的并发度,允许5个请求分别从5个节点获取数据,最大限度利用各节点的资源。
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。