作者回复: 老弟谦虚啦!到目前为止,你的回答最为精彩,每次都让我印象很深,真的很棒👍!老弟得空可以加我微信,搜索“方块K”或是“rJunior”,我把你拉进读者群~ 在那里可以跟更多的同学探讨,分享你对于技术的理解和把握~ LinkedHashMap分析的非常到位,很深入,满分💯,置顶🔝。不过,提醒一点,LinkedHashMap的采用,很重要的一点,是用来实现RDD Cache的LRU机制,老弟不妨就这一点,再展开思考,我们评论区继续讨论~
作者回复: 分析得很透彻,memoryStore缓存数据、evict数据的过程说得很清楚~ 赞👍!!!
作者回复: 首先明确一点哈,Spark是纯粹的计算引擎,它本身是没有存储引擎的。当然,它有自己的存储系统(BlockManager那一套体系),但是这个存储系统跟存储引擎(比如S3、HDFS)有着本质的区别,Spark需要外部存储引擎来获取数据源,Spark自己的BlockManager仅仅是为了更好地辅助分布式计算。 老弟说的MySQL数据,我理解是物化到磁盘的数据记录。要把MySQL的数据,dump到S3,或是HDFS,其实有很多方法。这个过程,可以通过Spark来做,也可以用其他大数据组件来做,比较MapReduce或是早期的Sqoop,当然,现在Sqoop逐渐退出历史舞台。 如果要用Spark做的话,也就是把MySQL数据dump到HDFS或是S3,其实就是read API + write API这么简单,中间都没啥计算逻辑其实,就是纯粹的读 + 写,搞定~ 不知道问题我理解的对不对哈,咱们评论区继续讨论~
作者回复: 好问题~ 2.0之前,spark用akka来实现不同组件之间的通信。2.0以后,spark抛弃akka,基于netty实现了自己的rpc系统,主要对象有: rpcEndpoint,对标akka的actor rpcEndpointRef,对标akk的actorRef rpcEnv,对标akka的actorSystem Spark RPC解耦了Spark Core和底层通信系统,让spark不同组件之间(包括存储系统,blockmanager,等)实现高效异步通信
作者回复: 正解,满分💯~
作者回复: 并不是哈,shuffle中间文件是物化到spark.local.dir这个配置项设置的地址,主要是磁盘中的文件系统目录,当然,也可以是Ramdisk(把内存当磁盘用,开辟内存文件系统)。总之,具体存在哪里,是由spark.local.dir决定的,而这个配置项,往往是磁盘
作者回复: 可以参考qinsi的回复~ LinkedHashMap特有的结构,Spark主要利用它实现LRU
作者回复: blockid是对数据块的统一封装(类),可以代表rdd cache block、广播变量block、shuffle block。是否为shuffle block这个字段,就是用来判断封装的数据块是不是用于shuffle的~