Adaptive Execution如何让Spark SQL更高效更好用?

2023-11-14

文章目录

背景

动态设置 Shuffle Partition

Spark Shuffle 原理

原有 Shuffle 的问题

自动设置 Shuffle Partition 原理

使用与优化方法

动态调整执行计划

固定执行计划的不足

SortMergeJoin 原理

BroadcastJoin 原理

动态调整执行计划原理

使用与优化方法

自动处理数据倾斜

解决数据倾斜典型方案

自动解决数据倾斜

使用与优化方法



本文转发自技术世界,原文链接  http://www.jasongj.com/spark/adaptive_execution/

 

导读:本文所述内容均基于 2018 年 9 月 17 日 Spark 最新 Spark Release 2.3.1 版本,以及截止到 2018 年 10 月 21 日 Adaptive Execution 最新开发代码。自动设置 Shuffle Partition 个数已进入 Spark Release 2.3.1 版本,动态调整执行计划与处理数据倾斜尚未进入 Spark Release 2.3.1

背景

Spark SQL / Catalyst 和 CBO 的优化,从查询本身与目标数据的特点的角度尽可能保证了最终生成的执行计划的高效性。但是

  • 执行计划一旦生成,便不可更改,即使执行过程中发现后续执行计划可以进一步优化,也只能按原计划执行;
  • CBO 基于统计信息生成最优执行计划,需要提前生成统计信息,成本较大,且不适合数据更新频繁的场景;
  • CBO 基于基础表的统计信息与操作对数据的影响推测中间结果的信息,只是估算,不够精确。

本文介绍的 Adaptive Execution 将可以根据执行过程中的中间数据优化后续执行,从而提高整体执行效率。核心在于两点:

  • 执行计划可动态调整
  • 调整的依据是中间结果的精确统计信息

动态设置 Shuffle Partition

Spark Shuffle 原理

Spark Shuffle 一般用于将上游 Stage 中的数据按 Key 分区,保证来自不同 Mapper (表示上游 Stage 的 Task)的相同的 Key 进入相同的 Reducer (表示下游 Stage 的 Task)。一般用于 group by 或者 Join 操作。
在这里插入图片描述
如上图所示,该 Shuffle 总共有 2 个 Mapper 与 5 个 Reducer。每个 Mapper 会按相同的规则(由 Partitioner 定义)将自己的数据分为五份。每个 Reducer 从这两个 Mapper 中拉取属于自己的那一份数据。

原有 Shuffle 的问题

使用 Spark SQL 时,可通过spark.sql.shuffle.partitions指定 Shuffle 时 Partition 个数,也即 Reducer 个数。

该参数决定了一个 Spark SQL Job 中包含的所有 Shuffle 的 Partition 个数。如下图所示,当该参数值为 3 时,所有 Shuffle 中 Reducer 个数都为 3。
在这里插入图片描述
这种方法有如下问题:

  • Partition 个数不宜设置过大;
  • Reducer(代指 Spark Shuffle 过程中执行 Shuffle Read 的 Task) 个数过多,每个 Reducer 处理的数据量过小。大量小 Task 造成不必要的 Task 调度开销与可能的资源调度开销(如果开启了 Dynamic Allocation);
  • Reducer 个数过大,如果 Reducer 直接写 HDFS 会生成大量小文件,从而造成大量 addBlock RPC,Name node 可能成为瓶颈,并影响其它使用 HDFS 的应用;
  • 过多 Reducer 写小文件,会造成后面读取这些小文件时产生大量 getBlock RPC,对 Name node 产生冲击;
  • Partition 个数不宜设置过小
    • 每个 Reducer 处理的数据量太大,Spill 到磁盘开销增大;
    • Reducer GC 时间增长;
    • Reducer 如果写 HDFS,每个 Reducer 写入数据量较大,无法充分发挥并行处理优势;
  • 很难保证所有 Shuffle 都最优
    • 不同的 Shuffle 对应的数据量不一样,因此最优的 Partition 个数也不一样。使用统一的 Partition 个数很难保证所有 Shuffle 都最优;
    • 定时任务不同时段数据量不一样,相同的 Partition 数设置无法保证所有时间段执行时都最优;

自动设置 Shuffle Partition 原理

如 Spark Shuffle 原理 一节图中所示,Stage 1 的 5 个 Partition 数据量分别为 60MB,40MB,1MB,2MB,50MB。其中 1MB 与 2MB 的 Partition 明显过小(实际场景中,部分小 Partition 只有几十 KB 及至几十字节)。

开启 Adaptive Execution 后:

  • Spark 在 Stage 0 的 Shuffle Write 结束后,根据各 Mapper 输出,统计得到各 Partition 的数据量,即 60MB,40MB,1MB,2MB,50MB;
  • 通过 ExchangeCoordinator 计算出合适的 post-shuffle Partition 个数(即 Reducer)个数(本例中 Reducer 个数设置为 3);
  • 启动相应个数的 Reducer 任务;
  • 每个 Reducer 读取一个或多个 Shuffle Write Partition 数据(如下图所示,Reducer 0 读取 Partition 0,Reducer 1 读取 Partition 1、2、3,Reducer 2 读取 Partition 4)。
    在这里插入图片描述
  • targetPostShuffleInputSize 默认为 64MB,每个 Reducer 读取数据量不超过 64MB;
  • 如果 Partition 0 与 Partition 2 结合,Partition 1 与 Partition 3 结合,虽然也都不超过 64 MB。但读完 Partition 0 再读 Partition 2,对于同一个 Mapper 而言,如果每个 Partition 数据比较少,跳着读多个 Partition 相当于随机读,在HDD 上性能不高;
  • 目前的做法是只结合相临的 Partition,从而保证顺序读,提高磁盘 IO 性能;
  • 该方案只会合并多个小的 Partition,不会将大的 Partition 拆分,因为拆分过程需要引入一轮新的 Shuffle;
  • 基于上面的原因,默认 Partition 个数(本例中为 5)可以大一点,然后由 ExchangeCoordinator 合并。如果设置的 Partition 个数太小,Adaptive Execution 在此场景下无法发挥作用。

由上图可见,Reducer 1 从每个 Mapper 读取 Partition 1、2、3 都有三根线,是因为原来的 Shuffle 设计中,每个 Reducer 每次通过 Fetch 请求从一个特定 Mapper 读数据时,只能读一个 Partition 的数据。也即在上图中,Reducer 1 读取 Mapper 0 的数据,需要 3 轮 Fetch 请求。对于 Mapper 而言,需要读三次磁盘,相当于随机 IO。

为了解决这个问题,Spark 新增接口,一次 Shuffle Read 可以读多个 Partition 的数据。如下图所示,Task 1 通过一轮请求即可同时读取 Task 0 内 Partition 0、1 和 2 的数据,减少了网络请求数量。同时 Mapper 0 一次性读取并返回三个 Partition 的数据,相当于顺序 IO,从而提升了性能。
在这里插入图片描述
由于 Adaptive Execution 的自动设置 Reducer 是由 ExchangeCoordinator 根据 Shuffle Write 统计信息决定的,因此即使在同一个 Job 中不同 Shuffle 的 Reducer 个数都可以不一样,从而使得每次 Shuffle 都尽可能最优。

上文 原有 Shuffle 的问题 一节中的例子,在启用 Adaptive Execution 后,三次 Shuffle 的 Reducer 个数从原来的全部为 3 变为 2、4、3。
在这里插入图片描述

使用与优化方法

可通过spark.sql.adaptive.enabled=true启用 Adaptive Execution 从而启用自动设置 Shuffle Reducer 这一特性。

通过spark.sql.adaptive.shuffle.targetPostShuffleInputSize可设置每个 Reducer 读取的目标数据量,其单位是字节,默认值为 64 MB。上文例子中,如果将该值设置为 50 MB,最终效果仍然如上文所示,而不会将 Partition 0 的 60MB 拆分。具体原因上文已说明。

动态调整执行计划

固定执行计划的不足

在不开启 Adaptive Execution 之前,执行计划一旦确定,即使发现后续执行计划可以优化,也不可更改。如下图所示,SortMergJoin 的 Shuffle Write 结束后,发现 Join 一方的 Shuffle 输出只有 46.9KB,仍然继续执行 SortMergeJoin。
在这里插入图片描述
此时完全可将 SortMergeJoin 变更为 BroadcastJoin 从而提高整体执行效率。

SortMergeJoin 原理

SortMergeJoin 是常用的分布式 Join 方式,它几乎可使用于所有需要 Join 的场景。但有些场景下,它的性能并不是最好的。

SortMergeJoin 的原理如下图所示:

  • 将 Join 双方以 Join Key 为 Key 按照 HashPartitioner 分区,且保证分区数一致;
  • Stage 0 与 Stage 1 的所有 Task 在 Shuffle Write 时,都将数据分为 5 个 Partition,并且每个 Partition 内按 Join Key 排序;
  • Stage 2 启动 5 个 Task 分别去 Stage 0 与 Stage 1 中所有包含 Partition 分区数据的 Task 中取对应 Partition 的数据。(如果某个 Mapper 不包含该 Partition 的数据,则 Redcuer 无须向其发起读取请求);
  • Stage 2 的 Task 2 分别从 Stage 0 的 Task 0、1、2 中读取 Partition 2 的数据,并且通过 MergeSort 对其进行排序;
  • Stage 2 的 Task 2 分别从 Stage 1 的 Task 0、1 中读取 Partition 2 的数据,且通过 MergeSort 对其进行排序;
  • Stage 2 的 Task 2 在上述两步 MergeSort 的同时,使用 SortMergeJoin 对二者进行 Join。

在这里插入图片描述

BroadcastJoin 原理

当参与 Join 的一方足够小,可全部置于 Executor 内存中时,可使用 Broadcast 机制将整个 RDD 数据广播到每一个 Executor 中,该 Executor 上运行的所有 Task 皆可直接读取其数据。(本文中,后续配图,为了方便展示,会将整个 RDD 的数据置于 Task 框内,而隐藏 Executor)。

对于大 RDD,按正常方式,每个 Task 读取并处理一个 Partition 的数据,同时读取 Executor 内的广播数据,该广播数据包含了小 RDD 的全量数据,因此可直接与每个 Task 处理的大 RDD 的部分数据直接 Join。
在这里插入图片描述
根据 Task 内具体的 Join 实现的不同,又可分为 BroadcastHashJoin 与 BroadcastNestedLoopJoin。后文不区分这两种实现,统称为 BroadcastJoin。

与 SortMergeJoin 相比,BroadcastJoin 不需要 Shuffle,减少了 Shuffle 带来的开销,同时也避免了 Shuffle 带来的数据倾斜,从而极大地提升了 Job 执行效率。

同时,BroadcastJoin 带来了广播小 RDD 的开销。另外,如果小 RDD 过大,无法存于 Executor 内存中,则无法使用 BroadcastJoin。

对于基础表的 Join,可在生成执行计划前,直接通过 HDFS 获取各表的大小,从而判断是否适合使用 BroadcastJoin。但对于中间表的 Join,无法提前准确判断中间表大小从而精确判断是否适合使用 BroadcastJoin。

《Spark SQL 性能优化再进一步 CBO 基于代价的优化》一文介绍的 CBO 可通过表的统计信息与各操作对数据统计信息的影响,推测出中间表的统计信息,但是该方法得到的统计信息不够准确。同时该方法要求提前分析表,具有较大开销。

而开启 Adaptive Execution 后,可直接根据 Shuffle Write 数据判断是否适用 BroadcastJoin。

动态调整执行计划原理

如上文 SortMergeJoin 原理 中配图所示,SortMergeJoin 需要先对 Stage 0 与 Stage 1 按同样的 Partitioner 进行 Shuffle Write。

Shuffle Write 结束后,可从每个 ShuffleMapTask 的 MapStatus 中统计得到按原计划执行时 Stage 2 各 Partition 的数据量以及 Stage 2 需要读取的总数据量。(一般来说,Partition 是 RDD 的属性而非 Stage 的属性,本文为了方便,不区分 Stage 与 RDD。可以简单认为一个 Stage 只有一个 RDD,此时 Stage 与 RDD 在本文讨论范围内等价)。

如果其中一个 Stage 的数据量较小,适合使用 BroadcastJoin,无须继续执行 Stage 2 的 Shuffle Read。相反,可利用 Stage 0 与 Stage 1 的数据进行 BroadcastJoin,如下图所示。
在这里插入图片描述
具体做法是:

  • 将 Stage 1 全部 Shuffle Write 结果广播出去
  • 启动 Stage 2,Partition 个数与 Stage 0 一样,都为 3
  • 每个 Stage 2 每个 Task 读取 Stage 0 每个 Task 的 Shuffle Write 数据,同时与广播得到的 Stage 1 的全量数据进行 Join

注:广播数据存于每个 Executor 中,其上所有 Task 共享,无须为每个 Task 广播一份数据。上图中,为了更清晰展示为什么能够直接 Join 而将 Stage 2 每个 Task 方框内都放置了一份 Stage 1 的全量数据。

虽然 Shuffle Write 已完成,将后续的 SortMergeJoin 改为 Broadcast 仍然能提升执行效率:

  • SortMergeJoin 需要在 Shuffle Read 时对来自 Stage 0 与 Stage 1 的数据进行 Merge Sort,并且可能需要 Spill 到磁盘,开销较大;
  • SortMergeJoin 时,Stage 2 的所有 Task 需要取 Stage 0 与 Stage 1 的所有 Task 的输出数据(如果有它要的数据 ),会造成大量的网络连接。且当 Stage 2 的 Task 较多时,会造成大量的磁盘随机读操作,效率不高,且影响相同机器上其它 Job 的执行效率;
  • SortMergeJoin 时,Stage 2 每个 Task 需要从几乎所有 Stage 0 与 Stage 1 的 Task 取数据,无法很好利用 Locality;
  • Stage 2 改用 Broadcast,每个 Task 直接读取 Stage 0 的每个 Task 的数据(一对一),可很好利用 Locality 特性。最好在 Stage 0 使用的 Executor 上直接启动 Stage 2 的 Task。如果 Stage 0 的 Shuffle Write 数据并未 Spill 而是在内存中,则 Stage 2 的 Task 可直接读取内存中的数据,效率非常高。如果有 Spill,那可直接从本地文件中读取数据,且是顺序读取,效率远比通过网络随机读数据效率高。

使用与优化方法

该特性的使用方式如下:

  • 当spark.sql.adaptive.enabled与spark.sql.adaptive.join.enabled都设置为true时,开启 Adaptive Execution 的动态调整 Join 功能;
  • spark.sql.adaptiveBroadcastJoinThreshold设置了 SortMergeJoin 转 BroadcastJoin 的阈值。如果不设置该参数,该阈值与spark.sql.autoBroadcastJoinThreshold的值相等;
  • 除了本文所述 SortMergeJoin 转 BroadcastJoin,Adaptive Execution 还可提供其它 Join 优化策略。部分优化策略可能会需要增加 Shuffle。spark.sql.adaptive.allowAdditionalShuffle参数决定了是否允许为了优化 Join 而增加 Shuffle。其默认值为 false。

自动处理数据倾斜

解决数据倾斜典型方案

《Spark 性能优化之道——解决 Spark 数据倾斜(Data Skew)的 N 种姿势》一文讲述了数据倾斜的危害,产生原因,以及典型解决方法。

  • 保证文件可 Split 从而避免读 HDFS 时数据倾斜;
  • 保证 Kafka 各 Partition 数据均衡从而避免读 Kafka 引起的数据倾斜;
  • 调整并行度或自定义 Partitioner 从而分散分配给同一 Task 的大量不同 Key;
  • 使用 BroadcastJoin 代替 ReduceJoin 消除 Shuffle 从而避免 Shuffle 引起的数据倾斜;
  • 对倾斜 Key 使用随机前缀或后缀从而分散大量倾斜 Key,同时将参与 Join 的小表扩容,从而保证 Join 结果的正确性。

自动解决数据倾斜

目前 Adaptive Execution 可解决 Join 时数据倾斜问题。其思路可理解为将部分倾斜的 Partition (倾斜的判断标准为该 Partition 数据是所有 Partition Shuffle Write 中位数的 N 倍) 进行单独处理,类似于 BroadcastJoin,如下图所示。
在这里插入图片描述
在上图中,左右两边分别是参与 Join 的 Stage 0 与 Stage 1 (实际应该是两个 RDD 进行 Join,但如同上文所述,这里不区分 RDD 与 Stage),中间是获取 Join 结果的 Stage 2。

明显 Partition 0 的数据量较大,这里假设 Partition 0 符合“倾斜”的条件,其它 4 个 Partition 未倾斜。

以 Partition 对应的 Task 2 为例,它需获取 Stage 0 的三个 Task 中所有属于 Partition 2 的数据,并使用 MergeSort 排序。同时获取 Stage 1 的两个 Task 中所有属于 Partition 2 的数据并使用 MergeSort 排序。然后对二者进行 SortMergeJoin。

对于 Partition 0,可启动多个 Task:

  • 在上图中,启动了两个 Task 处理 Partition 0 的数据,分别名为 Task 0-0 与 Task 0-1
  • Task 0-0 读取 Stage 0 Task 0 中属于 Partition 0 的数据
  • Task 0-1 读取 Stage 0 Task 1 与 Task 2 中属于 Partition 0 的数据,并进行 MergeSort
  • Task 0-0 与 Task 0-1 都从 Stage 1 的两个 Task 中所有属于 Partition 0 的数据
  • Task 0-0 与 Task 0-1 使用 Stage 0 中属于 Partition 0 的部分数据与 Stage 1中属于 Partition 0 的全量数据进行 Join

通过该方法,原本由一个 Task 处理的 Partition 0 的数据由多个 Task 共同处理,每个 Task 需处理的数据量减少,从而避免了 Partition 0 的倾斜。

对于 Partition 0 的处理,有点类似于 BroadcastJoin 的做法。但区别在于,Stage 2 的 Task 0-0 与 Task 0-1 同时获取 Stage 1 中属于 Partition 0 的全量数据,是通过正常的 Shuffle Read 机制实现,而非 BroadcastJoin 中的变量广播实现。

使用与优化方法

开启与调优该特性的方法如下:

  • 将spark.sql.adaptive.skewedJoin.enabled设置为 true 即可自动处理 Join 时数据倾斜;
  • spark.sql.adaptive.skewedPartitionMaxSplits控制处理一个倾斜 Partition 的 Task 个数上限,默认值为 5;
  • spark.sql.adaptive.skewedPartitionRowCountThreshold设置了一个 Partition 被视为倾斜 Partition 的行数下限,也即行数低于该值的 Partition 不会被当作倾斜 Partition 处理。其默认值为 10L * 1000 * 1000 即一千万;
  • spark.sql.adaptive.skewedPartitionSizeThreshold设置了一个 Partition 被视为倾斜 Partition 的大小下限,也即大小小于该值的 Partition 不会被视作倾斜 Partition。其默认值为 64 * 1024 * 1024 也即 64MB;
  • spark.sql.adaptive.skewedPartitionFactor该参数设置了倾斜因子。如果一个 Partition 的大小大于spark.sql.adaptive.skewedPartitionSizeThreshold的同时大于各 Partition 大小中位数与该因子的乘积,或者行数大于spark.sql.adaptive.skewedPartitionRowCountThreshold的同时大于各 Partition 行数中位数与该因子的乘积,则它会被视为倾斜的 Partition。
  •  
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Adaptive Execution如何让Spark SQL更高效更好用? 的相关文章

  • 数据倾斜

    数据倾斜发生时的现象 1 绝大多数task执行得都非常快 但个别task执行的极慢 2 原本能正常执行的Spark作业 某天突然爆出OOM 内存溢出 异常 观察异常栈 是我们写的业务代码造成的 数据倾斜发生的原理 在进行shuffle的时候
  • 任务长期不释放和占用单节点持续的cpu,导致hivesever2本身内存泄漏造成

    任务长期不释放和占用单节点持续的cpu 导致hivesever2本身内存泄漏造成 产生的原因在于 查询过于复杂或者数据量过大 当有复杂的查询或处理大量数据的请求时 HiveServer2可能会出现高负载 这可能涉及大量的计算 IO操作或涉及
  • spark集群搭建与mysql元数据管理

    找个spark集群搭建是针对于上一篇hadoop的基础上搭建的 所以spark的版本也是要按照着hadoop版本进行下载 1 解压spark 修改spark的 etc profile的home目录 2 安装SCALA 并配置SCALA HO
  • Spark(七)——累加器和广播变量

    5 累加器 通过在驱动器中调用SparkContext accumulator initialValue 方法 创建出存有初始值的累加器 返回值为org apache spark Accumulator T 对象 其中 T 是初始值 ini
  • Spark基础知识(个人总结)

    声明 1 本文为我的个人复习总结 并非那种从零基础开始普及知识 内容详细全面 言辞官方的文章 2 由于是个人总结 所以用最精简的话语来写文章 3 若有错误不当之处 请指出 一 Spark概述 Spark模块 Core SQL Streami
  • spark-shell 加载本地文件报错 java.io.FileNotFoundException

    学习spark shell 时候发现一个问题 从本地文件加载数据生成RDD 报错 文件找不到 原因 spark shell 如果启动了集群模式 真正负责计算的executor会在 该executor所在的 worker节点上读取文件 并不是
  • 【pyspark】DataFrame基础操作(二)

    介绍一下 pyspark 的 DataFrame 基础操作 一 选择和访问数据 PySpark DataFrame 是惰性计算的 简单地选择一列不会触发计算 但它会返回一个 Column 实例 并且 大多数按列操作都返回 Column 实例
  • pyspark 连接远程hive集群配置

    今天本地spark连接远程hive集群 直接把配置导入进去 本地直接应用远程环境 1 安装spark 设置spark环境变量 2 拿到远程集群配置文件 将配置文件放在spark conf 目录下 xml 一共五个文件 3 将mysql co
  • spark dataframe 数据类型转换

    文章目录 1 spark sql数据类型 数字类型 日期类型 复杂类型 2 spark sql和scala数据类型对比 3 spark sql数据类型转换示例 代码 输出 1 spark sql数据类型 数字类型 ByteType 代表一个
  • Kafka/Spark消费topic到写出到topic

    1 Kafka的工具类 1 1 从kafka消费数据的方法 消费者代码 def getKafkaDStream ssc StreamingContext topic String groupId String consumerConfigs
  • 浅谈Hadoop体系和MPP体系

    浅谈Hadoop体系和MPP体系 引言 如题 在大数据发展至今 为了应对日益繁多的数据分析处理 和解决客户各种奇思妙 怪 想需求 形形色色的大数据处理的框架和对应的数据存储手段层出不穷 有老当益壮的Hadoop体系 依靠Hadoop巨大的社
  • 【Apache Spark 】第 1 章Apache Spark 简介:统一分析引擎

    大家好 我是Sonhhxg 柒 希望你看完之后 能对你有所帮助 不足请指正 共同学习交流 个人主页 Sonhhxg 柒的博客 CSDN博客 欢迎各位 点赞 收藏 留言 系列专栏 机器学习 ML 自然语言处理 NLP 深度学习 DL fore
  • spark报Got an error when resolving hostNames. Falling back to /default-rack for all

    一 报错代码如下 21 06 01 20 13 36 INFO yarn SparkRackResolver Got an error when resolving hostNames Falling back to default rac
  • 基于Spark的电商用户行为实时分析可视化系统(Flask-SocketIO)

    基于Spark的电商用户行为实时分析可视化系统 Flask SocketIO 项目简介 该项目已上线蓝桥课程 有需要的可凭邀请码 UB5mdLbl 学习哦 有优惠 课程地址 https www lanqiao cn courses 2629
  • Spark Job写文件个数的控制以及小文件合并的一个优化

    文章目录 背景说明 通过引入额外Shuffle对写入数据进行合并 EnsureRepartitionForWriting Rule CoalesceShufflePartitions Rule OptimizeShuffleWithLoca
  • 大数据开发必备面试题Spark篇合集

    1 Hadoop 和 Spark 的相同点和不同点 Hadoop 底层使用 MapReduce 计算架构 只有 map 和 reduce 两种操作 表达能力比较欠缺 而且在 MR 过程中会重复的读写 hdfs 造成大量的磁盘 io 读写操作
  • 大数据—— Flink 的优化

    目录 一 Flink内存优化 1 1 Flink 内存配置 二 配置进程参数 2 1 场景 2 2 操作步骤 三 解决数据倾斜 3 1 场景描述 3 2 解决方式 3 2 1 数据源的消费不均匀 调整并发度 3 2 2 数据分布不均匀 四
  • spark groupByKey和groupBy,groupByKey和reduceByKey的区别

    1 groupByKey Vs groupBy 用于对pairRDD按照key进行排序 author starxhong object Test def main args Array String Unit val sparkConf n
  • Spark 【分区与并行度】

    RDD 并行度和分区 SparkConf setMaster local 我们在创建 SparkContext 对象时通常会指定 SparkConf 参数 它包含了我们运行时的配置信息 如果我们的 setMaster 中的参数是 local
  • 大数据手册(Spark)--Spark基本概念

    文章目录 Spark 基本概念 Hadoop 生态 Spark 生态 Spark 基本架构 Spark运行基本流程 弹性分布式数据集 RDD Spark安装配置 Spark基本概念 Spark基础知识 PySpark版 Spark机器学习

随机推荐

  • VMware安装Android x86_64 8.1 虚拟机

    Vmware 安装 Android 虚拟机 原文摘录于 https www bbsmax com A kvJ3eg7Adg https blog csdn net Iamzhouyd article details 122796439 ht
  • 启动容器启动gpu报错

    sudo docker run itd name joint train p 9090 22 shm size 32G gpus all env DISPLAY v tmp X11 unix tmp X11 unix 10e7a6213e2
  • buck同步整流sw点负压问题

    buck同步整流sw点负压问题 1 前言 2 产生原因 3 影响 4 解决方法 5 buck同步整流逆流问题 5 1 产生原因 5 2 影响 5 3 解决方案 1 前言 有人突然问我一个专业问题 我以为我知道 结果并没有 尴尬 不过我也挺喜
  • Mybatis开发环境搭建

    Mybatis开发环境搭建 一 创建web工程并导入jar包 1 创建一个web工程 2 创建classes与lib文件夹 设置编译输出路径与测试路径 设置依赖的jar包目录 3 导入jar包 并设置add as library 二 编写M
  • mysql教程 新建连接_七、MySQL 创建连接

    连接到 MySQL 服务器由三种办法 使用 mysql 命名 使用 Navicat MySQL 客户端和使用各种开发语言连接 使用 mysql 命令连接 mysql 命令一般会随着 MySQL 安装而自带 这是最基本的也是最容易连接到 My
  • 好简单的RabbitMQ安装(Windows)

    目录 Windows下安装RabbitMQ需要以下几个步骤 1 安装erlang语言环境 下载erlang 设定环境变量 验证安装环境结果 2 下载并安装RabbitMQ 下载 安装主文件 安装RabbitMQ Plugins插件 登入管理
  • 代码审计方法与步骤

    代码审计方法与步骤 一 审计前的准备 1 获得源码 大多数PHP程序都是开源的 找到官网下载最新的源码包 2 安装网站 在本地搭建网站 一边审计一边调试 实时跟踪各种动态变化 二 把握大局 1 网站结构 浏览源码文件夹 了解该程序的大致目录
  • react滚动到指定位置_react 中 scrollTo 引发的思考

    如何在 React 中实现 scrollTo 效果 之前考虑过用scrollInToView 但是由于这个 API 实现的场景不能控制元素在屏幕上的显示位置遂选择其他出路 scrollTo 当只有一个元素需要直接滚动时 可以在 useEff
  • 一个插件,让你的 ChatGPT 不再报错!

    最近几天 相信大家都发现了 ChatGPT 一个问题 就是官网报错越来越频繁了 当你需用 ChatGPT 来处理一些比较琐碎的任务时 一旦你离开页面时间比较久 再度返回跟它进行对话 就会出现如下报错 虽然这个报错信息也曾有过 但没这么频繁
  • vscode 批量格式化

    今天推荐一个 vscode 批量格式化的扩展 Format Files 这个插件会依次打开需要格式化的文件进行格式化 使用方法很简单 在需要格式的文件夹右键 就可以看到开始格式化的操作 按照步骤进行即可 当然使用的前提 vscode 已经配
  • vue实现侧边栏导航和滚动定位

  • 计算机丢失msvcp90dll怎么办,msvcp90.dll

    msvcp90 dll官方版 msvcp90 dll官方版是电脑系统中不可缺少的dll文件 msvcp90 dll可以解决系统提示 找不到msvcp90 dll 或 msvcp90 dll 或者 msvcp90 dll 等情况 msvcp9
  • Win10家庭中文版开机后弹窗无法登录到你的账户点注销没用(解决过程记录)

    问题 之前一切正常 用完电脑后关机 没有提示有更新 也没更改系统设置 注册表什么的 时隔两天后开机就直接进入了临时账户 并弹窗 无法登录到你的账户 下面提示 通常可以通过从你的账户注销 然后重新登录来解决此问题 如果不立即注销 你创建的任何
  • Ubuntu系统配置花生壳内网穿透

    前言 本文档是基于被访问主机已经安装ssh服务 并且在内网已经确定ssh可用的情况下 做的穿透配置流程 一 被访问主机准备工作 被访问主机上下载花生壳并安装 我的是Ubuntu 1 Ubuntu安装包的下载命令如下 wget https d
  • 宏定义报重载错误

    我写了一个宏定义 define SWAP a b swap a a b b swap 然后在函数中进行引用 for i 1 i lt ma i SWAP covar k i covar j i 在编译过程中出现如下错误 error over
  • [Leetcode] 747. 至少是其他数字两倍的最大数

    题目描述 在一个给定的数组nums中 总是存在一个最大元素 查找数组中的最大元素是否至少是数组中每个其他数字的两倍 如果是 则返回最大元素的索引 否则返回 1 示例 1 输入 nums 3 6 1 0 输出 1 解释 6是最大的整数 对于数
  • FAST CGI的配置

    试着写一点fast cgi 查了一下 中文关于fast cgi的安装发现就一个文章 大家都是抄那个文章 那个文章写的还是不错 就是比较简单 只能指导大概的方法和方向 配置那个地方写的非常粗略 E文有一个文章写的非常详细 地址在这里 如果E文
  • wsl下ubuntu20.04配合clion编译openjdk8并运行

    起因 最近 看synchronized的锁的底层原理 其中有一个涉及底层C 部分的objectMonitor对象 在进一步了解的过程中 以及之前看深入理解java虚拟机中第一部分 自己编译jdk的触发 开始考虑本地编译jdk 在jdk上进行
  • cookie 相关

    https blog csdn net sinat 36594453 article details 88870899
  • Adaptive Execution如何让Spark SQL更高效更好用?

    文章目录 背景 动态设置 Shuffle Partition Spark Shuffle 原理 原有 Shuffle 的问题 自动设置 Shuffle Partition 原理 使用与优化方法 动态调整执行计划 固定执行计划的不足 Sort