spark基础理论及优化思路

spark 有哪些组件?

  • master:管理集群和节点,不参与计算。
  • worker:计算节点,进程本身不参与计算,和 master 汇报。
  • Driver:运行程序的 main 方法,创建 spark context 对象。
  • spark context:控制整个 application 的生命周期,包括 dagsheduler 和 task scheduler 等组件。
  • client:用户提交程序的入口。

spark 工作机制?

  • 用户在 client 端提交作业后,会由 Driver 运行 main 方法并创建 spark context 上下文。
    执行 add 算子,形成 dag 图输入 dagscheduler,按照 add 之间的依赖关系划分 stage 输入 task
    scheduler。 task scheduler 会将 stage 划分为 task set 分发到各个节点的 executor 中执行。

shuffle优化?

程序调优

  • 首次尽量减少shuffle的次数:
    Rdd.map().repartition(3000).reduceByKey(+).
  • 必要时主动 shuffle,通常用于改变并行度,提高后续分布式运行速度:
    rdd.repartition(largerNumPartition).map()
  • 使用 treeReduce&treeAggregate 替换 reduce&aggregate:
    reduce&aggregate 一次性聚合,shuffle 量太大,而 treeReduce&treeAggregate
    是分批聚合,更为保险。

参数调优

  • spark.shuffle.file.buffer:map task 到 buffer 到磁盘
    默认值:32K
  • 调优建议:如果作业可用的内存资源较为充足的话,可以适当增加这个参数
    的大小(比如 64k),从而减少 shuffle write 过程中溢写磁盘文件的次数,也就可
    以减少磁盘 IO 次数,进而提升性能。在实践中发现,合理调节该参数,性能会
    有 1 到 5%的提升。
  • spark.reducer.maxSizeFlight:reduce task 去磁盘拉取数据
    默认值:48m
  • 调优建议:如果作业可用的内存资源较为充足的话,可以增加这个参数的大
    小(比如 96M),从而减少拉取数据的次数,也就可以减少网络传输的次数,进而
    提升性能。在实践中发现,合理调节该参数,性能会有 1 到 5%的提升。

spark 如何保证宕机迅速恢复?

  • 适当增加 spark standby master
  • 编写 shell 脚本,定期检测 master 状态,出现宕机后对 master 进行重启操作

Spark Streaming 和 Storm 有何区别?

  • Spark Streaming与Storm都可以用于进行实时流计算;
  • Storm 的优势:
    • Spark Streaming 是基于 RDD 的,因此需要将一小段时间内的,比如 1 秒内的数据,
      收集起来,作为一个 RDD,然后再针对这个 batch 的数据进行处理。而 Storm 却可以做到每
      来一条数据,都可以立即进行处理和计算
    • Storm 支持在分布式流式计算程
      序运行过程中,可以动态地调整并行度,从而动态提高并发处理能力。而 Spark Streaming
      是无法动态调整并行度的;
  • Spark Streaming 的优势:
    • 由于 Spark Streaming 是基于 batch 进行处理的,
      因此相较于 Storm 基于单条数据进行处理,具有数倍甚至数十倍的吞吐量
    • Spark
      Streaming 由于身处于 Spark 生态圈内,因此可以和 Spark Core、Spark SQL、Spark MLlib、
      Spark GraphX 进行无缝整合。流式处理完的数据,可以立即进行各种 map、reduce 转换操作,
      可以立即使用 sql 进行查询,甚至可以立即使用 machine learning 或者图计算算法进行处理。
      这种一站式的大数据处理功能和优势,
  • 通常在对实时性要求特别高,而且实时数据量不稳定,比如在白天有高
    峰期的情况下,可以选择使用 Storm。但是如果是对实时性要求一般,允许 1 秒的准实时处
    理,而且不要求动态调整并行度的话,选择 Spark Streaming 是更好的选择.

Spark streaming 以及基本工作原理?

  • 用于进行大规模、高吞吐量、容错
    的实时数据流的处理。它支持从多种数据源读取数据,比如 Kafka、Flume、Twitter 和 TCP
    Socket,并且能够使用算子比如 map、reduce、join 和 window 等来处理数据,处理后的数据
    可以保存到文件系统、数据库等存储中。
  • 工作原理是:接受实时输入数据流,然后将数据拆分成 batch,
    比如每收集一秒的数据封装成一个 batch,然后将每个 batch 交给 spark 的计算引擎进行处理,
    最后会生产处一个结果数据流,其中的数据也是一个一个的 batch 组成的。

spark宽依赖和窄依赖?

  • 宽依赖:shuffle dependency,本质就是 shuffle。父 RDD 的每一个 partition 中的数据,
    都可能会传输一部分到下一个子 RDD 的每一个 partition 中,此时会出现父 RDD 和子 RDD
    的 partition 之间具有交互错综复杂的关系,这种情况就叫做两个 RDD 之间是宽依赖。
  • 窄依赖:narrow dependency,父 RDD 和子 RDD 的 partition 之间的对应关系是一对一的

spark 常用的计算框架?

  • Spark Core 用于离线计算
  • Spark SQL 用于交互式查询
  • Spark Streaming 用于实时流式计算.
  • Spark MLlib 用于机器学习
  • Spark GraphX 用于图计算

spark 整体架构?

SparkSQL SparkStreaming GraphXMLlib
Spark RDD
Spark Engine
Yarn,Mesos,AWS HDFS,S3,Cassandra

Spark 的特点是什么?

  • 速度快:Spark 基于内存进行计算(当然也有部分计算基于磁盘,比如 shuffle)。
  • 容易上手开发:Spark 的基于 RDD 的计算模型,比 Hadoop 的基于 Map-Reduce
    的计算模型要更加易于理解,更加易于上手开发,实现各种复杂功能,比如二次
    排序、topn 等复杂操作时,更加便捷
  • 超强的通用性:Spark 提供了 Spark RDD、Spark SQL、Spark Streaming、Spark
    MLlib、Spark GraphX 等技术组件,可以一站式地完成大数据领域的离线批处理、
    交互式查询、流式计算、机器学习、图计算等常见的任务。
  • 集成 Hadoop:Spark 并不是要成为一个大数据领域的“独裁者”,一个人霸占
    大数据领域所有的“地盘”,而是与 Hadoop 进行了高度的集成,两者可以完美
    的配合使用。Hadoop 的 HDFS、Hive、HBase 负责存储,YARN 负责资源调度;
    Spark 复杂大数据计算。实际上,Hadoop+Spark 的组合,是一种“double win”
    的组合。
  • 极高的活跃度:Spark 目前是 Apache 基金会的顶级项目,全世界有大量的优
    秀工程师是 Spark 的 committer。并且世界上很多顶级的 IT 公司都在大规模地使
    用 Spark。

Spark 的三种提交模式是什么?

  • Spark 内核架构,即 standalone 模式,基于 Spark 自己的 Master-Worker 集群;
  • 基于 Yarn 的 yarn-cluster 模式;
  • 基于 Yarn 的 yarn-client 模式。
  • 要切换到第二种和第三种模式,将之前提交 spark 应用程序的
    spark-submit 脚本,加上–master 参数,设置为 yarn-cluster,或 yarn-client 即可。
    如果没设置就是 standalone 模式。

Spark内存溢出问题?

Spark内存模型

  • 存储内存:用于在集群中持久化和广播内部数据
  • 执行内存:用于shuffle、join、排序、聚合等计算
  • 系统预留:用于存储数据结构,Spark中内部的元数据
  • 存储内存执行内存可以互相借用内存空间

map执行后的内存溢出

  • 场景:reduce task 去map一边拉取数据,一边聚合。reduce端有一块聚合内存,executor memeory * 0.2

  • 解决方案:

    • 增加reduce聚合内存的比例 Spark.shuffle.memory.fraction
    • 增加executor memory 的大小
    • 减少reduce task 每次拉取的数据量 spark.reducer.maxSizeFlight 24m

shuffle后内存溢出

  • 场景:reduce task 去map一边拉取数据,一边聚合。reduce端有一块聚合内存,executor memeory * 0.2

  • 解决方案:

    • 增加reduce聚合内存的比例 Spark.shuffle.memory.fraction
    • 增加executor memory 的大小
    • 减少reduce task 每次拉取的数据量 spark.reducer.maxSizeFlight 24m

    shuffle file not found

    • 产生这个报错的原因可能是最后一个stage的task 从 上一个stage所在的executor拉取数据,但是上一个stage正在执行GC,导致数据没有拉取到。
    • 解决办法:通过调整拉取的次数和时间间隔来避免此类事件的发生

spark 支持故障恢复的方式?

  • 主要包括两种方式:一种是通过血缘关系 lineage,当发生故障的时候通过血缘关系,再执行一遍来一层一层恢复数据;
  • 另一种方式是通过 checkpoint()机制,将数据存储到持久化存储中来恢复数据。

Spark 提交的 job 的工作流程?

  • 用户提交一个任务。 入口是从 sc 开始的。 sc 会去创建一个 taskScheduler。根据不同的提
    交模式, 会根据相应的 taskchedulerImpl 进行任务调度。
  • 同时会去创建 Scheduler 和 DAGScheduler。DAGScheduler 会根据 RDD 的宽依赖或者窄依赖,
    进行阶段的划分。划分好后放入 taskset 中,交给 taskscheduler 。
  • appclient 会到 master 上注册。
    • 首先会去判断数据本地化,尽量选最好的本地化模式去执行。打 散 Executor 选 择 相 应 的 Executor 去 执 行 。
    • ExecutorRunner 会 去 创 建CoarseGrainerExecutorBackend 进程。 通过线程池的方式去执行任务。
  • 反向:
    • Executor 向 SchedulerBackend 反向注册
    • Spark On Yarn 模式下。 driver 负责计算调度。appmaster 负责资源的申请。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值