https://mp.weixin.qq.com/s/mN4eQklYJAy4qXK3vhWK3Q
对于任何一个分布式计算框架而言,如果数据和计算不在同一个节点,那么他们中间必须有一个需要移动到另一个所在的节点。如果把计算调度到数据所在节点,那就是调度计算,反之则是调度数据,SparkStreaming和Flink的实现是不同的。Spark的核心数据结构RDD包含几个关键信息,包括数据的分片(partitions)、依赖(dependencies)等,其中还有一个用于优化执行的信息就是preferred locations,这个信息提供了该分片数据的位置信息,即所在的节点,从而提高计算效率。调度计算的方式在批处理中有很大的优势,因为计算相比数据来讲一般信息量比较小,如果计算可以在数据所在的节点执行,会省去大量的网络传输,节省带宽的同时提高计算效率。但在流式计算中,SparkStreaming的调度由于需要频繁的调度计算导致一些效率上的损耗。首先计算调度是需要消耗一些时间的,比如计算信息序列化————>传输————>反序列化————>初始化资源————>计算执行————>执行完结果上报等都是一些损耗。另外用户的计算中一般会有一些资源的初始化逻辑,比如初始化外部系统的客户端(类似Kafka Producer或Consumer);每次计算的重复调度容易导致这些资源的重复初始化,需要用户对执行逻辑有一定了解才能合理初始化资源,避免资源的重复创建,这就提高了使用门槛。通过业务支持发现,在实际生产过程中,经常遇到大并发的SparkStreaming作业给Kafka和Hbase等存储系统带来巨大连接压力