作者回复: 实验做的非常细致,有观察、有思考、思考很深入,赞👍,置顶🔝 先说Task串行、并行的问题,Task与Task之间,是并行的,Task内部,是串行。这个其实好理解,毕竟,一个Task占用一个CPU core,不存在并发上的物理条件~ 再者,特别同意你说的FAAS和打开视野,我对此深有同感~ 用你的话说,是Spark对于序列化和反序列化的支持。对我来说,Spark的调度系统,对我个人影响巨大,让我真正认识到分布式系统的玩法、特色和核心。在我看来,调度系统是学习Spark最应该学的部分,没有之一~ 当然,仁者见仁,大家的喜好和偏好都不同~ 就打开视野这方面,确实调度系统对于我个人的提升,或者说给我个人留下的印象,非常非常的深刻。 广播变量答的也很好~ RDD需要先collect,这一点其实想吐槽社区,完全可以做得跟DataFrame一样,直接封装就好了,非要开发者自行collect一波,然后再封装,麻烦!DataFrame就比较直接,Spark在背后帮开发者做了collect这一步,就开发者使用体验来说,还是要好些~
作者回复: 没错,满分💯~
作者回复: 继承AccumulatorV2也是个方法,其实还蛮高级的~
作者回复: 赞👍,满分💯,又收获一份Python代码,感谢老弟!后续我们一起把代码整理到Github~
作者回复: 非常赞~ 完美地复现了问题~ 这正是我想要的,哈哈~ 关于第一题,代码写的没有任何问题,就是想让大家对比这里的 var n: Long = _ // 全局变量,与累加器的区别所在。你的执行结果,完全符合预期,即本机跑,完全OK,但是,分布式环境就不行。这里我先不给老弟回复,老弟不妨花时间想想,没想明白的话,说明这一讲累加器没有吃透,再想想哈~ 想不清楚也不要紧,我们留言区继续讨论~ 第二个问题的话,广播变量是read-only的,只能读,不能写,其实这里的问题,不是想问它和累加器的区别,而是想问,广播变量能不能封装RDD、DataFrame这种分布式数据集,答案是肯定的哈~ 除了普通变量,分布式数据集之上,也可以创建广播变量~
作者回复: 哈哈,先赞👍一下老弟爱钻研的精神!!! 不过呢,所谓的漏洞说法有问题,证明更有问题,哈哈。根本原因还是,你的环境是单机、local,所以你怎么玩儿,都是单机的玩儿法。你比如这句: bufferBroad.value.append("test") 推广到分布式的环境,肯定会报错的。所以说做实验的话,建议还是在分布式下去做,这样很多结论,才站得住脚~
作者回复: idea其实就是单机,单机上,用普通变量,和用累加器,效果是一样的。但是在分布式的环境下,高下立现