Spark的常见困惑(1)

前言

已经很少写Spark的文章了,但是因为以前写的挺多的,所以还是有很多人会和我交流Spark相关的内容。这篇文章我会把我经常被问到的几个问题整理下,也可以避免以后反复讲,因为可以直接把这篇文章丢过去就行了。

我对Spark总体的看法

Spark是目前最全面的一款计算引擎,也就是属于综合实力最好的。其他引擎在其主打的一面可能会比Spark好不少,比如速度,或者在某个功能点上胜出,但是Spark无论在API设计,扩展性,多租户等等各个方面都已经做的很全面,加上后面开源的Delta让其在存储上也得到了极大的提升。另外经过这么多年的发展,Spark团队对于稳定性的要求也非常高,同时它也是当前对机器学习支持的最好的一个计算引擎。

Spark发行包只是一个提交程序

很多人使用了CDH,HDP等Hadoop发行包,然后里面预装了Spark, 然后就以为只能用上面的Spark。其实这是错误的。Spark发行包只是一个client/submitter,什么意思呢? 也就是说Spark发行包只是Yarn,K8s,Mesos等分布式系统里的一个提交程序。所以你完全可以自己下载一个Spark发行包,然后把自己写Spark程序用这个新下载的提交程序提交到分布式系统里。你在同一个yarn上使用不同版本的Spark发行包提交也是互不影响的,因为他们都是独立的Yarn程序。

所以,你可以在你的Hadoop集群上运行多个不同版本的Spark程序,是没有问题的。

使用这些CDH/HDP等唯一可能遇到的问题是,他会在Yarn上的应用程序偷偷加上了一些Jar包,导致可能和社区版的Spark的包冲突了。

Spark 会把数据都载入到内存么

我们知道Spark可以对接很多数据源,比如对接MySQL,用户就会想,是不是Spark会把MySQL的数据都加载过去计算。实际情况是,在某些场景下,确实是需要把数据都加载过去的,但是加载过去不意味着这些数据都要放内存或者放磁盘,Spark是一批一批的去拿,拿到后会根据算子做即时的处理。之后可能根据shuffle等需求写入到磁盘,在写磁盘的过程中尽可能先写到内存,再写磁盘,所以对内存要求比较高。另外对于transform/action以及这个问题更详细的阐述大家可以搜索[Spark sc.textFile(...).map(...).count() 执行完整流程] 和 [Spark会把数据都载入到内存么?] 这两篇文章。

今天就写到这,待续....

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章