1.Sparkä¸cacheåpersistçåºå«
2.图计算用spark+scala+graphx进行图计算?
3.关于笛卡尔积CartesianProduct
4.Spark源码解析2-YarnCluster模式启动
Sparkä¸cacheåpersistçåºå«
cache
ããé»è®¤æ¯å°æ°æ®åæ¾å°å åä¸ï¼ææ§è¡
ããdef cache(): this.type = persist()
ããpersist
ããå¯ä»¥æå®æä¹ åç级å«ã
ããæ常ç¨çæ¯MEMORY_ONLYåMEMORY_AND_DISKã
ããâ_2â表示æå¯æ¬æ°ãå°½éé¿å 使ç¨_2åDISK_ONLY级å«
ããcacheåpersistç注æç¹
ãã1.é½æ¯ææ§è¡(æçå«å»¶è¿æ§è¡)ï¼éè¦action触åæ§è¡ï¼æå°åä½æ¯partition
ãã2.对ä¸ä¸ªRDDè¿è¡cacheæè persistä¹åï¼ä¸æ¬¡ç´æ¥ä½¿ç¨è¿ä¸ªåéï¼å°±æ¯ä½¿ç¨æä¹ åçæ°æ®
ãã3.å¦æ使ç¨ç¬¬äºç§æ¹å¼ï¼ä¸è½ç´§è·actionç®å
图计算用spark+scala+graphx进行图计算?
EdgeRDD在Spark GraphX中作为核心类之一,用于存储和处理图的边数据,它扩展了RDD[Edge[ED]],通过列式格式在每个分区上存储边,以提高性能,并且可以额外存储与每条边关联的并肩平量柱源码顶点属性,以提供三元组视图。 EdgeRDD提供了一系列方法来操作和转换图的边数据,包括但不限于:mapValues:对边进行映射操作,将边属性转换为特定形式。
reverse:反转所有边的方向。
innerJoin:与另一个EdgeRDD进行内连接操作。
这些方法允许进行映射、反转和连接等操作,以满足不同的图计算需求。 示例中,aqs实现源码我们首先创建了一个包含边的RDD,然后通过EdgeRDD创建了对象。接着,使用mapValues方法将边属性转换为大写形式。随后,reverse方法用于反转所有边的方向。最后,innerJoin方法将原始EdgeRDD与反转后的EdgeRDD进行内连接操作,将两个边的属性拼接为新的字符串,得到了最终的结果EdgeRDD对象。 在示例中,我们使用foreach方法打印了每个EdgeRDD的结果。这展示了如何使用EdgeRDD对象操作图的边数据,包括映射、反转和连接等操作。新江湖源码你可以根据自己的需求使用其他EdgeRDD的方法来处理和操作边数据。 源代码定义了EdgeRDD类及其伴生对象,后者提供了辅助方法。EdgeRDD是对RDD[Edge[ED]]的扩展,用于存储边的列式格式,并可以额外存储边关联的顶点属性。它提供了一系列方法来操作和转换边数据,包括但不限于mapValues、reverse和innerJoin等。EdgeRDD还定义了其他方法,如withTargetStorageLevel、compute和getPartitions等,用于更改目标存储级别、计算和获取分区信息。 伴生对象中的approve授权源码fromEdges方法用于从一组边创建EdgeRDD,而fromEdgePartitions方法用于从已构造的边分区创建EdgeRDD。这段代码展示了EdgeRDD的主要实现和相关方法,为图计算中的边数据提供了高效的存储和处理能力。关于笛卡尔积CartesianProduct
关于笛卡尔积与shuffle的关系,结论是笛卡尔积不会产生shuffle。在分析笛卡尔积的源码后,我们发现其运行原理在map端执行,并未涉及shuffle过程。因此,从结果中得出,笛卡尔积操作不会引发数据重组现象。
至于窄依赖的定义,网上多数描述存在一定的混淆。窄依赖实际上指的是子RDD的每个分区依赖于父RDD的部分分区。在理解上,养家心法源码可以将窄依赖理解为一个父RDD的分区被多个子RDD的分区共享使用,但这些子RDD的分区仅依赖于父RDD的特定部分,而非整个分区。这种定义在Spark 1.0版本的注释中有所体现,强调了依赖的局部性。
关于join操作是否一定会产生shuffle,答案并非绝对。在某些特定场景下,如数据量较小、数据分布均匀且内存充足时,join操作可能不会导致数据shuffle。重要的是在实际编程和优化过程中积累经验,学习如何根据不同情况选择合适的join策略,从而提高效率。精读源码是一种有效的技能培养方式,能够帮助深入理解数据处理过程,提升解决问题的能力。
对于希望在职场中脱颖而出的个人,培养自己的优势是关键。无论是通过技术专长、项目管理能力还是团队协作,构建自己的独特竞争力是至关重要的。如果您对此有所兴趣,欢迎加入硬核源码学习社群(付费)。
社群提供每周六的直播课程,包含历史录屏资源,学员可以随到随学,并且有长期的指导陪伴。如果您对这个社群感兴趣,欢迎了解详情。
Spark源码解析2-YarnCluster模式启动
YARN 模式运行机制主要体现在Yarn Cluster 模式和Yarn Client 模式上。在Yarn Cluster模式下,SparkSubmit、ApplicationMaster 和 CoarseGrainedExecutorBackend 是独立的进程,而Driver 是独立的线程;Executor 和 YarnClusterApplication 是对象。在Yarn Client模式下,SparkSubmit、ApplicationMaster 和 YarnCoarseGrainedExecutorBackend 也是独立的进程,而Executor和Driver是对象。
在源码中,SparkSubmit阶段首先执行Spark提交命令,底层执行的是开启SparkSubmit进程的命令。代码中,SparkSubmit从main()开始,根据运行模式获取后续要反射调用的类名赋给元组中的ChildMainClass。如果是Yarn Cluster模式,则为YarnClusterApplication;如果是Yarn Client模式,则为主类用户自定义的类。接下来,获取ChildMainClass后,通过反射调用main方法的过程,反射获取类然后通过构造器获取一个示例并多态为SparkApplication,再调用它的start方法。随后调用YarnClusterApplication的start方法。在YarnClient中,new一个Client对象,其中包含了yarnClient = YarnClient.createYarnClient属性,这是Yarn在SparkSubmit中的客户端,yarnClient在第行初始化和开始,即连接Yarn集群或RM。之后就可以通过这个客户端与Yarn的RM进行通信和提交应用,即调用run方法。
ApplicationMaster阶段主要涉及开启一个Driver新线程、AM向RM注册、AM向RM申请资源并处理、封装ExecutorBackend启动命令以及AM向NM通信提交命令由NM启动ExecutorBackend。在ApplicationMaster进程中,首先开启Driver线程,开始运行用户自定义代码,创建Spark程序入口SparkContext,接着创建RDD,生成job,划分阶段提交Task等操作。
在申请资源之前,AM主线程创建了Driver的终端引用,作为参数传入createAllocator(),因为Executor启动后需要向Driver反向注册,所以启动过程必须封装Driver的EndpointRef。AM主线程向RM申请获取可用资源Container,并处理这些资源。ExecutorBackend阶段尚未完成,后续内容待补充。