下面这段在网上拷贝的
宽依赖 和窄依赖 说明该操作是 是否有shuffler 操作 成长(lineage )的来源
最有趣的部分是DAGScheduler。下面详解它的工作过程。RDD的数据结构里很重要的一个域是对父RDD的依赖。如图3所示,有两类依赖:窄(Narrow)依赖和宽(Wide)依赖。
图3 窄依赖和宽依赖
窄依赖指父RDD的每一个分区最多被一个子RDD的分区所用,表现为一个父RDD的分区对应于一个子RDD的分区,和两个父RDD的分区对应于一个子RDD 的分区。图3中,map/filter和union属于第一类,对输入进行协同划分(co-partitioned)的join属于第二类。
宽依赖指子RDD的分区依赖于父RDD的所有分区,这是因为shuffle类操作,如图3中的groupByKey和未经协同划分的join。
窄依赖对优化很有利。逻辑上,每个RDD的算子都是一个fork/join(此join非上文的join算子,而是指同步多个并行任务的barrier): 把计算fork到每个分区,算完后join,然后fork/join下一个RDD的算子。如果直接翻译到物理实现,是很不经济的:一是每一个RDD(即使 是中间结果)都需要物化到内存或存储中,费时费空间;二是join作为全局的barrier,是很昂贵的,会被最慢的那个节点拖死。如果子RDD的分区到 父RDD的分区是窄依赖,就可以实施经典的fusion优化,把两个fork/join合为一个;如果连续的变换算子序列都是窄依赖,就可以把很多个 fork/join并为一个,不但减少了大量的全局barrier,而且无需物化很多中间结果RDD,这将极大地提升性能。Spark把这个叫做流水线 (pipeline)优化。
transfer action 设计来源是 lazy evaluation 另外 scala 空间和rrd 空间的限制
这里有两个设计要点。首先是lazy evaluation。熟悉编译的都知道,编译器能看到的scope越大,优化的机会就越多。Spark虽然没有编译,但调度器实际上对DAG做了线性复 杂度的优化。尤其是当Spark上面有多种计算范式混合时,调度器可以打破不同范式代码的边界进行全局调度和优化。下面的例子中把Shark的SQL代码 和Spark的机器学习代码混在了一起。各部分代码翻译到底层RDD后,融合成一个大的DAG,这样可以获得更多的全局优化机会。
另一个要点是一旦行动算子产生原生数据,就必须退出RDD空间。因为目前Spark只能够跟踪RDD的计算,原生数据的计算对它来说是不可见的(除非以后 Spark会提供原生数据类型操作的重载、wrapper或implicit conversion)。这部分不可见的代码可能引入前后RDD之间的依赖,如下面的代码:
这里容易受到mr 模型的理解限制,直观上以为要shuffer 了就一定要执行,但实际是只有 action 方法 (要输出到rdd 以外的域(输出不是rdd) ,和要不要shuffer,要不要reduce没有关系,这里ACTION 的方法的reduce 和MR reduce 不是同一个东西 )才会导致提交作业并执行。
相关推荐
在Java的持久化框架Hibernate中,懒加载(Lazy Loading)是一种优化策略,它允许我们推迟对关联对象的加载,直到真正需要它们的时候。标题“hibernate在集合上的lazy策略”指的是Hibernate如何处理与实体相关的集合...
在Java的持久化框架Hibernate中,懒加载(Lazy Loading)是一种重要的对象关系映射策略,用于提高应用程序的性能。懒加载的基本思想是延迟加载,即当真正需要数据时,才去数据库加载。在这个场景中,我们关注的是...
标题中的“hibernate在单端关联上的lazy策略”指的是Hibernate框架中的一种对象关系映射(ORM)技术,用于优化数据加载效率。在Hibernate中,懒加载(Lazy Loading)是一种延迟加载策略,它允许我们在需要时才加载...
- **划分原则**:基于RDD间的依赖关系,特别是宽依赖和窄依赖的不同,来决定阶段的边界。 ##### 5. Partition - **定义**:数据分区(Partition),是RDD的基本单元,每个RDD都可以被划分为多个分区。 - **作用**:...
标题提到的"LazyUI-dependency"表明这是一个关于懒加载用户界面(LazyUI)的依赖集合,可能是为了帮助开发者更方便地集成到自己的项目中,尤其是对于那些不熟悉或者不喜欢使用Maven进行依赖管理的开发者。...
在PHP世界里,依赖注入框架可以帮助开发者更方便地管理类之间的依赖关系,减少硬编码,使得代码更加灵活。本篇文章将深入探讨这个名为"iiDestiny依赖注入框架"的轻量级PHP实现。 首先,让我们理解依赖注入的基本...
此外,使用宽依赖而非窄依赖可以减少任务数量,提升并行度。 资源管理对性能优化也有直接影响。Spark原生支持YARN和Mesos,也可以在Kubernetes上运行。理解并合理配置Executor的数量、内存大小和CPU核心数,可以...
Spark RDD(弹性分布式数据集)是Apache Spark框架中的核心组件,它是Spark处理大规模数据的核心抽象。RDD代表了一种可容错、只读、分片的数据集合,这些分片可以分布在Spark集群的不同节点上。RDD的设计目标是提供...
MyBatis中延迟加载Lazy策略是一个非常重要的概念,它可以帮助开发者提高数据库查询的效率和性能。在MyBatis中,延迟加载Lazy策略的方法主要有两种:一对一延迟加载和一对多延迟加载。 一对一延迟加载 一对一延迟...
RDD具有两种类型的依赖关系:窄依赖(Narrow Dependency)和宽依赖(Wide Dependency)。窄依赖指的是每个父分区最多被一个子分区所依赖,而宽依赖则意味着多个子分区可能会依赖于多个父分区的数据,这通常意味着跨...
在Spring Boot应用中,...通过理解循环依赖的原理,以及利用如重构、`@Lazy`注解和setter注入等解决方案,我们可以有效地避免和解决这类问题。在设计系统时,尽量减少或避免循环依赖,可以提高系统的可维护性和稳定性。
RDD的依赖关系分为窄依赖和宽依赖两种: - **窄依赖**:每个父RDD分区仅被一个子RDD分区使用,可并行计算且易于容错。 - **宽依赖**:一个父RDD分区可能被多个子RDD分区使用,需要shuffle数据,容错成本较高。 ...
1. **设置图片宽高**:由于`lazyload.js`默认使用一像素的占位符,如果未设置图片的实际宽高,浏览器可能会认为所有图片都是1像素大小。因此,为了防止图片在滚动时提前加载,每个图片元素应预设正确的宽度和高度。...
"lazy-dependable" 是一个专为前端设计的开源库,它的核心理念是“懒惰可靠”,即延迟加载和按需解析依赖,以提高应用性能并优化资源管理。 一、懒加载(Lazy Loading) 懒加载是一种优化技术,它只在用户实际需要...
Gilead,全称为Hibernate for Flex,是用于Flex和Hibernate之间的数据绑定工具,它提供了一种在Flex客户端和Hibernate服务端之间通信的方法,使得Flex应用程序可以利用Hibernate的懒加载功能。然而,由于历史原因,...
在实际开发中,Lazy Loading特别适用于大型应用,尤其是那些具有复杂关系模型和大量数据的情况。通过合理配置,可以显著提升应用的响应速度和用户体验,同时降低服务器负载。然而,也需要注意,懒加载并非万能药,...
Lazy
依赖注入是一种设计模式,它允许我们在不直接创建对象的情况下使用它们,而是将依赖关系的创建和管理交给了一个外部容器(在Angular中就是注入器)。在Angular6中,依赖注入通过元数据(metadata)来配置,这些元...
循环依赖问题是 Spring 框架中的一种常见问题,解决这种问题需要对 Bean 之间的依赖关系进行重新设计和优化。在本文中,我们探讨了循环依赖问题的成因、解决方案和实现方法,并提供了一些常见的解决方案和实现方法。
标题"**C#使用Lazy延迟加载**"所涉及的知识点主要围绕`Lazy<T>`类和延迟加载的概念: 1. **延迟加载(Lazy Loading)**:延迟加载是一种设计模式,其核心思想是推迟对某些对象或数据的初始化,直到它们被实际需要时...