大数据计算引擎(一)——Spark

介绍

Spark 实现了高效的 DAG执行引擎,可以通过基于内存,多线程来高效处理数据流,Spark 基于内存的运算要快 100 倍以上,基于硬盘的运算也要快10 倍以上。
Cluster Manager 是集群资源的管理者。 Spark 支持 3 种集群部署模式:Standalone、 Yarn Mesos
Worker Node 工作节点,管理本地资源;
Driver Program 。运行应用的 main() 方法并且创建了 SparkContext 。由 Cluster Manager分配资源, SparkContext 发送 Task Executor 上执行;
Executor :在工作节点上运行,执行 Driver 发送的 Task ,并向 Driver 汇报计算结果;

RDD(可分区的,可序列化的,可缓存,可容错,有依赖的,可广播的弹性分布式数据集)

序列化

在实际开发中会自定义一些对 RDD 的操作,此时需要注意的是
  •         初始化工作是在Driver端进行的
  •         实际运行程序是在Executor端进行的
这就涉及到了进程通信,是需要序列化的。

依赖

Lineage(血统)是RDD(弹性分布式数据集)之间依赖关系的完整记录‌。它如同一个族谱,精确记录了数据如何通过一系列转换操作从原始状态演变为最终结果。

Lineage的核心作用

  1. 容错恢复‌:当节点故障导致数据丢失时,Spark根据Lineage重新计算丢失的数据

  2. 执行优化‌:Spark利用Lineage创建高效的执行计划(DAG)

  3. 惰性计算‌:Spark延迟执行直到需要结果,Lineage记录所有待执行操作

  4. 高效存储‌:不需要复制数据,只需记录转换关系

Lineage的两种依赖关系

依赖类型

特点

图示

例子

窄依赖

每个父RDD分区最多被一个子RDD分区使用

父分区 → 子分区

map()filter()union()

宽依赖

每个父RDD分区被多个子RDD分区使用(需要Shuffle)

父分区 → 多个子分区

groupByKey()reduceByKey()join()

缓存

persist cache unpersist

容错

checkpoint 是把 RDD 保存在 HDFS中,是多副本可靠存储,此时依赖链可以丢掉,斩断了依赖链

分区

本地模式:spark-shell --master local[N] spark.default.parallelism = N

伪分布式:spark-shell --master local-cluster[x,y,z]   spark.default.parallelism = x * y

分布式模式:spark.default.parallelism = max(应用程序持有executorcore总数, 2)

经过上面的规则,就能确定了 spark.default.parallelism 的默认值(配置文件 spark-default.conf中没有显示的配置。如果配置了,则 spark.default.parallelism = 配置的值)
SparkContext 初始化时,同时会生成两个参数,由上面得到的spark.default.parallelism推导出这两个参数的值:
// 从集合中创建 RDD 的分区数
sc . defaultParallelism = spark . default . parallelism
// 从文件中创建 RDD 的分区数
sc . defaultMinPartitions = min ( spark . default . parallelism , 2 )
// 查看rdd分区数
rdd . getNumPartitions

分区器

只有 Key-Value 类型的 RDD 才可能有分区器, Value 类型的 RDD 分区器的值是 None

HashPartitioner :最简单、最常用,也是默认提供的分区器。对于给定的 key ,计算其hashCode ,并除以分区的个数取余,如果余数小于 0 ,则用 余数 + 分区的个数,最后返回的值就是这个key 所属的分区 ID 。该分区方法可以保证 key 相同的数据出现在同一个分区中。
用户可通过 partitionBy 主动使用分区器,通过 partitions 参数指定想要分区的数量。

RangePartitioner :简单的说就是将一定范围内的数映射到某一个分区内。在实现中,分界的算法尤为重要,用到了水塘抽样算法。sortByKey 会使用RangePartitioner。

自定义分区器:

class MyPartitioner(n: Int) extends Partitioner{
override def numPartitions: Int = n
override def getPartition(key: Any): Int = {
val k = key.toString.toInt
k / 100
}
}

广播

广播变量将变量在节点的 Executor 之间进行共享 ( Driver 广播出去 )
广播变量用来高效分发较大的对象。向所有工作节点 (Executor) 发送一个较大的只读
值,以供一个或多个操作使用。 使用广播变量的过程如下:
  • 对一个类型 T 的对象调用 SparkContext.broadcast 创建出一个 Broadcast[T]对象。 任何可序列化的类型都可以这么实现(在 Driver 端)
  • 通过 value 属性访问该对象的值(在 Executor 中)
  • 变量只会被发到各个 Executor 一次,作为只读值处理
val productBC = sc . broadcast ( productRDD . collectAsMap ())
val productInfo = productBC . value

累加器

累加器的作用:可以实现一个变量在不同的 Executor 端能保持状态的累加;
累计器在 Driver 端定义,读取;在 Executor 中完成累加;
累加器也是 lazy 的,需要 Action 触发; Action 触发一次,执行一次,触发多次,执行多次;
累加器一个比较经典的应用场景是用来在 Spark Streaming 应用中记录某些事件的数量;
LongAccumulator 用来累加整数型
DoubleAccumulator 用来累加浮点型
CollectionAccumulator 用来累加集合元素
val acc1 = sc.longAccumulator("totalNum1")
val acc2 = sc.doubleAccumulator("totalNum2")
val acc3 = sc.collectionAccumulator[String]("allWords")
val rdd = data.map { word =>
acc1.add(word.length)
acc2.add(word.length)
acc3.add(word)
word
}
rdd.count
rdd.collect
println(acc1.value)
println(acc2.value)
println(acc3.value)

作业提交

spark-submit \ --master yarn \ --deploy-mode cluster \ --name my-spark-job \ --class com.example.MyApp \ --executor-memory 4g \ --driver-memory 2g \ --executor-cores 2 \ --num-executors 10 \ --queue production \ --conf spark.yarn.maxAppAttempts=3 \ my-application.jar \ arg1 arg2

作业提交原理

  1. 客户端提交作业‌:spark-submit --master yarn --deploy-mode cluster --class ...  客户端将作业提交给 YARN ResourceManager(RM)。
  2. RM 在集群的某个 NodeManager(NM)上启动一个容器(Container),并在此容器中运行 ‌ApplicationMaster‌(即 Spark Driver)。
  3. Driver 在容器内启动,并向 RM ‌申请资源‌(Executor 容器)。
  4. RM 分配多个容器给 AM。
  5. AM 与 NodeManagers 通信,在分配的容器中启动 ‌Executor 进程‌。
  6. Executors 向 Driver 注册。(反向注册)
  7. Driver 将任务分发给 Executors 执行。
  8. 客户端可断开连接,作业在集群内独立运行。
  9. 作业完成后,AM 释放资源并退出。

Shuffle原理

Shuffle MapReduce 计算框架中的一个特殊的阶段,介于 Map Reduce 之间。当Map 的输出结果要被 Reduce 使用时,输出结果需要按 key 排列,并且分发到Reducer上去,这个过程就是 shuffle
  1. Hash Shuffle V1:每个Shuffle Map Task需要为每个下游的Task创建一个单独的文件;Shuffle过程中会生成海量的小文件。同时打开过多文件、低效的随机IO
  2. Hash Base Shuffle V2 核心思想:允许不同的task复用同一批磁盘文件,有效将多个 task的磁盘文件进行一定程度上的合并,从而大幅度减少磁盘文件的数量,进而提升 shuffle write的性能。一定程度上解决了Hash V1中的问题,但不彻底。
  3. Sort Base Shuffle大大减少了shuffle过程中产生的文件数,提高Shuffle的效率;

调优

RDD复用,缓存/持久化,巧用filter,使用高性能算子,设置合理并行度,广播大变量;

SQL

DataFrame = RDD[Row] + Schema

Dataset(Dataset = RDD[case class].toDS)
sql语句:SparkSQL更简洁。
val ds: Dataset[Info] = spark.createDataset(rdd)
ds.createOrReplaceTempView("t1")
spark.sql(
"""
|select id, tag
| from t1
| lateral view explode(split(tags, ",")) t2 as
tag
|""".stripMargin).show
感谢阅读!!!
### 回答1: 好的,下面是对大数据面试题——spark面试题()的回答: 1. 什么是Spark?它与Hadoop有什么区别? Spark个快速、通用、可扩展的大数据处理引擎,它可以在内存中进行数据处理,因此比Hadoop更快。与Hadoop相比,Spark的优点在于它可以在内存中进行数据处理,因此速度更快,而且它支持更多的数据处理方式,例如流处理、图形处理等。 2. Spark的核心组件有哪些? Spark的核心组件包括Spark Core、Spark SQL、Spark Streaming、MLlib和GraphX。 3. 什么是RDD?它有哪些特点? RDD是Spark中的个基本概念,它代表个不可变的分布式数据集合。RDD具有以下特点: - 可以在内存中进行计算,因此速度快; - 支持多种操作,例如map、reduce、filter等; - 可以进行持久化,以便在后续计算中重复使用。 4. Spark中的map和flatMap有什么区别? map和flatMap都是RDD中的转换操作,它们的区别在于: - map操作对每个元素进行转换,返回个新的元素; - flatMap操作对每个元素进行转换,返回个包含多个元素的序列。 5. 什么是Spark的shuffle操作? Spark的shuffle操作是指将数据重新分区的操作,它通常发生在reduce操作之前。Shuffle操作会将数据从多个节点上收集到个节点上,然后重新分区,以便进行后续的计算。 6. Spark中的cache和persist有什么区别? cache和persist都是将RDD持久化到内存中,以便在后续计算中重复使用。它们的区别在于: - cache操作默认将数据持久化到内存中,而persist操作可以指定将数据持久化到内存、磁盘或者其他存储介质中; - cache操作是persist操作的种简化形式,它默认将数据持久化到内存中,并且只能持久化到内存中。 7. Spark中的reduceByKey和groupByKey有什么区别? reduceByKey和groupByKey都是对键值对RDD进行操作的函数,它们的区别在于: - reduceByKey操作会在每个分区内先进行本地聚合,然后再进行全局聚合,因此效率更高; - groupByKey操作会将所有的键值对都进行网络传输,然后在个节点上进行聚合,因此效率较低。 8. Spark中的broadcast变量有什么作用? broadcast变量是种只读的变量,它可以在所有节点上共享,以便在计算过程中使用。使用broadcast变量可以避免在网络上传输大量的数据,从而提高计算效率。 9. 什么是Spark的checkpoint操作? Spark的checkpoint操作是将RDD持久化到磁盘上,以便在后续计算中重复使用。与cache和persist不同的是,checkpoint操作会将数据持久化到磁盘上,以便在内存不足时可以从磁盘上恢复数据。 10. Spark中的Task是什么? Task是Spark中的个基本概念,它代表个可以在个节点上执行的计算任务。Spark个RDD分成多个分区,每个分区对应个Task,这些Task可以并行执行,以提高计算效率。 ### 回答2: 今天我们来讨论下关于Spark大数据面试的些常见问题。Spark种基于Hadoop的开源计算系统,它能够快速处理大规模数据,并且支持多种编程语言,包括Java、Scala和Python等。以下是Spark面试题及其答案: 1. Spark有哪几种部署模式? Spark有三种部署模式,分别是本地模式、集群模式和分布式模式。本地模式指的是在本地运行Spark应用程序,不需要连接到外部计算机。集群模式指的是单个Spark集群环境,它由Spark节点组成,可以在数据中心或云中运行。分布式模式指的是使用多个Spark集群并行处理大规模数据。 2. Spark和Hadoop的区别是什么? Spark和Hadoop都是处理大规模数据的工具,但它们有些区别。首先,Spark处理数据速度快,因为它将数据存储在内存中,而Hadoop则将数据存储在磁盘中。其次,Spark支持更多的编程语言,包括Java、Scala和Python等,而Hadoop只支持Java。此外,Spark具有更好的机器学习和图形处理功能,可以更好地支持大规模数据分析。 3. Spark的RDD是什么? RDD是Spark中重要的概念,全称为Resilient Distributed Dataset。它是个不可变的分布式数据集合,可以分区存储在不同节点上,并且每个分区都可以在并行处理中进行处理。RDD支持两种操作,即转化操作和行动操作。转化操作将个RDD转换为另个RDD,而行动操作返回个结果或将结果输出至外部系统。 4. Spark的优化技术有哪些? Spark优化技术包括数据本地化、共享变量、宽依赖和窄依赖、缓存和持久化,以及数据分区等技术。数据本地化将数据存储在尽可能接近计算节点的位置,以减少网络传输的开销。共享变量将常用的变量通过广播或累加器的方式在节点中共享,从而减少网络传输量。宽依赖和窄依赖指的是在转化操作中RDD之间的依赖关系,窄依赖表示每个父分区最多与个子分区有关联,而宽依赖则表示多个子分区可能与多个父分区关联。缓存和持久化技术可将RDD保存在内存中,从而加速访问速度。数据分区可以将数据划分为较小的块进行并行处理。 5. Spark Streaming是什么? Spark Streaming是Spark个扩展模块,它支持实时数据流处理。Spark Streaming可以将实时数据流以微批次方式处理,每个批次的数据处理平均耗时只有几秒钟。Spark Streaming可以将数据存储在内存或磁盘中,同时支持多种数据源和数据输出方式。 以上是关于Spark大数据面试题的些回答,希望能够对大家有所帮助。如果你想深入学习Spark大数据处理技术,可以考虑参加相关的培训课程或在线课程。 ### 回答3: Spark分布式计算框架,它可以使大规模数据处理更加高效和便捷。因此,在企业招聘大数据领域的人才时,对Spark的技术能力要求越来越高。以下是Spark面试题的回答: 1. Spark有哪些组件? Spark框架由三个核心组件组成:Spark Core、Spark SQL和Spark Streaming。此外,还有Spark MLlib、Spark GraphX、Spark R等个别不同的子组件。 2. 什么是RDD?与Dataframe有什么区别? RDD(弹性分布式数据集)是Spark的核心数据抽象,是不可变的分布式对象集合。RDD可以从文件中读取数据、从内存中读取数据、并行修改数据等。而Dataframe和RDD类似,但是Dataframe更加强大,因为它是带有结构化的RDD。Dataframe在处理大规模结构化数据时非常有效和便捷。 3. Spark如何处理缺失数据? Spark提供了两种处理缺失数据的方法:第种是使用DataFrame API中的na函数,可以删除或替换缺失值;第二种是使用MLlib中的Imputer类,可以将缺失值替换为均值或中位数。 4. 什么是Spark的任务(task)? 个任务是Spark作业中的最小执行单位。Spark集群上的作业被划分为多个任务,这些任务可以并行执行。 5. Spark的shuffle操作是什么?它为什么是昂贵的? Spark的shuffle操作是将组数据重新分配到不同计算节点上的操作。Shuffle操作可能会导致大量数据的磁盘写入、网络传输和数据重组,这些都是非常昂贵的操作。因此,它在Spark集群中是个相当昂贵的操作。 6. Spark中的Partition有什么作用? Partition是Spark中的数据划分单位。它可以将数据分成多个块并对每个块进行处理。Partition 可以提高 Spark 的并行度和运行效率,因为它可以将大规模数据分成多个小块,并在集群的多个计算节点上并行处理数据。 总而言之,Spark大数据领域中使用最广泛的计算引擎,其技术理念和应用场景非常广泛。对于求职者而言,掌握 Spark 的基本概念和技术特点,提高对 Spark 的理解和应用能力,将有助于更好地处理和分析大规模数据集。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值