What’s new in Spark 1.2.0
1.2.0 was released on 12/18, 2014
在2014年5月30日发布了Spark 1.0 和9月11日发布了Spark1.1.后,Spark 1.2 终于在12月18日发布。作为1.X时代的第三个release,它有什么重要更新呢?
1. Spark Core:性能和易用性的改进
对于超大规模的Shuffle,Spark Core在性能和稳定性方面做了两个重要的更新:
一) Communication Manager使用Netty实现
在1.1 之前,对于Shuffle的结果回传,有两种方式,对于较小的结果,直接使用akka的消息传递机制;对于较大的结果,则采用BlockManager。采用BlockManager是不错的设计,可以避免Driver占用过多的内存而OOM并且减少了GC的风险。但是,BlockManger的处理是低效的:它先从Disk中将结果读取到kernel的buffer,然后到用户空间的buffer,然后又到了kernel的send buffer,这期间有多次的内存拷贝和kernel space到user space的切换代价。着不单单是占用了JVM的不必要的内存,而且还增加了GC的频率。不过,使用FileChannel.transferTo,可以做到zero copy。具体可见http://www.ibm.com/developerworks/library/j-zerocopy/
其中一种实现就是Netty,1.2中,使用Netty 重写了Communication Manager。实际上,在org.apache.spark.network.netty中已经实现了netty得网络模块,但是由于不完善而这个选项默认是没有打开的。
而且,使用Netty已经是默认的了。spark.shuffle.blockTransferService 已经从1.1的nio变成1.2 中新增的netty了。关于这个PR的详情可见 https://issues.apache.org/jira/browse/SPARK-2468
二) Shuffle的默认机制从hashbased 转化为sort based
MapReduce被人诟病之一就是不管sort是否必要,都需要排序。Spark在1.1之前,都是hash based Shuffle。但是hash based会占用大量的内存,当然了在内存不够用时,也会spill到disk,然后最后再做一次merge。对于比较大的数据集,因为有disk IO,因此性能也会有所下降。Shuffle的性能的好坏可以说直接影响整个job的性能也不为过。在1.1的时候,引入了sort based shuffle。在1.2的时候,这个已经能够成熟并且成为默认的选项:
spark.shuffle.manager 从hash 变为sort。
并且从作者Reynold Xin的测试来看,sort 在速度和内存使用方面优于hash:“sort-based shuffle has lower memory usage and seems to outperformhash-based in almost all of our testing.”
2. MLlib: 扩充了Python API
3. Spark Streaming:实现了基于WriteAhead Log(WAL)的HA,避免因为Driver异常退出导致的数据丢失
4. GraphX: 性能和API的改进(alpha)
Spark 1.2 是来自60多家企业,学校等研究机构的172位贡献者的一次重要发布。从Contributor的数量看,Spark社区依然是最活跃的开源社区之一。
从Spark的历次更新都可以看出,快速迭代是互联网的王道。Spark发展到现在,虽然依然有这样的那样的问题,但是依靠不断的迭代,各大厂商的支持和各位contributor的不断付出,相信社区会持续快速发展。虽然商业软件可能几年前就已经解决了这些问题,商业软件可能在某个应用场景已经有了最佳的实现。但是互联网的禀赋就在于不求最优,只求合适。而且对于各个中小型的互联网公司来说,场景不断在变,需要一个自己可以掌控的架构,随着自身的发展不断的在这个架构上做快速的迭代。而Spark,或许就是这个适合大家的架构。
后记:虽然没有几个小时,发现体力完全不行了。以后还是需要锻炼身体,锻炼身体啊。