Spark SQL cache 相关参数
spark.sql.inMemoryColumnarStorage.compressed 为true来设置内存中的列存储是否需要压缩。
spark.sql.inMemoryColumnarStorage.batchSize 来设置一次处理多少row
spark.sql.defaultSizeInBytes 来设置初始化的column的bufferbytes的默认大小,这里只是其中一个参数。
本地化级别
spark.locality.wait 数据本地化等待时间
为什么会有这个参数呢?
spark在driver上,对application的每个state的task分配之前,会先计算出每个task要计算的是哪个分片数据(RDD上的某个partition),spark分配的task的算法,优先希望每个task签好分配到它所要计算的数据的节点上,这样就尽可能的避免了网络间数据传输。
但实际上,有时候 ,task并没有分配到它所要计算的数据的节点上,因为有可能那个节点的计算资源和计算能力满了,因为task处理数据是需要计算资源的,所以通常来说spark会等待一段时间,看是否能将task分配到它要处理数据所在节点上,这个等待时长默为3s(3s不是绝对的,针对不同的本地化级别可以设置不同等待时长)。如果超过等待时长,无法计算等待,就会选择一个性能比较差的本地化级别,比如:task分配到距离它所要处理数据节点比较近的一个节点上,然后传输数据进行计算。
而对于我们来说最好是,task正好分配到它要处理数据所在节点上,这样直接从本地executor对应的blockManager中获取数据,纯内存传出数据,或带有部分磁盘IO。
本地化级别:
本地化就是指task被分配要处理部分数据,task和它要处理的数据可能会在不同的节点位置。
根据这种位置关系又5种不同的本地化级别:
- PROCESS_LOCAL:进程本地化,计算数据的task由某个executor执行,数据也就在这个executor对应的BlockManager。这种本地化级别 性能最好
- NODE_LOCAL:节点本地化。第一种情况,数据作为HDFS block数据块就在节点上, 而task节点是在某个executor上运行;第二种情况,task和它要处理的数据,在同一节点的不同executor上,数据需要在进程之间传输
- NO_PREF: 对于task来说,数据在哪里获取都一样,无好坏之分
- RACK_LOCAL:机架本地化,task和它要处理的数据在同一机架的不同节点上, 数据需要通过网络在节点之间传输
- ANY:task和它要处理的数据可能在集群的任何地方,而且不在同一机架上(RACK),数据要跨机架传输,性能最差。