参考: https://www.jianshu.com/p/9c35da38a3c1
pyspark 默认使用 py4j 将数据由 python 变量传输给 spark。 这中间的过程中需要经过多次编解码.
如果使用PySpark,大概处理流程是这样的(注意,这些都是对用户透明的)
所以可以看到,前后需要四次编码/解码动作。序列化反序列化耗时应该占用额外耗时的70%左右。我们说,有的时候把序列化框架设置为Kyro之后,速度明显快了很多,可见序列化的额外耗时是非常明显的。
前面是一个点,第二个点是,数据是按行进行处理的,一条一条,显然性能不好。
第三个点是,Socket协议通讯其实还是很快的,而且不跨网络,只要能克服前面两个问题,那么性能就会得到很大的提升。 另外可以跟大家说的是,Python如果使用一些C库的扩展,比如Numpy,本身也是非常快的。
Arrow是如何加快速度的呢?主要是有两点:
序列化友好指的是,Arrow提供了一个内存格式,该格式本身是跨应用的,无论你放到哪,都是这个格式,中间如果需要网络传输这个格式,那么也是序列化友好的,只要做下格式调整(不是序列化)就可以将数据发送到另外一个应用里。这样就大大的降低了序列化开销。
向量化指的是,首先Arrow是将数据按block进行传输的,其次是可以对立面的数据按列进行处理的。这样就极大的加快了处理速度。
使用的时候,只需添加一个配置, 如下所示