admin管理员组

文章数量:1032178

Spark技术中最常见的面试问题

Apache Spark是一种基于Hadoop和MapReduce技术的开源,支持各种计算技术,以实现快速高效的处理。Spark 以其内存中集群计算而闻名,这是提高 Spark 应用程序处理速度的主要贡献功能。Spark是Matei Zaharia于2009年在加州大学伯克利分校的AMPLab作为Hadoop子项目的一部分开发的。它后来在2010年以BSD许可证开源,然后在2013年捐赠给Apache软件基金会。从2014年开始,Spark在Apache基金会承担的所有项目中占据了顶级位置。

Spark面试问题

1. 你能告诉我什么是Apache Spark吗?

Apache Spark是一个开源框架引擎,以其在大数据处理和分析领域的速度,易于使用的性质而闻名。它还具有用于图形处理,机器学习,流式传输,SQL等的内置模块。Spark 执行引擎支持内存计算和循环数据流,它可以在集群模式或独立模式下运行,并且可以访问各种数据源,如 HBase、HDFS、Cassandra 等。

2. Apache Spark的特点是什么?

  • 高处理速度:Apache Spark通过减少对磁盘的读写操作来帮助实现非常高的数据处理速度。执行内存计算时,速度几乎快 100 倍,执行磁盘计算时速度快 10 倍。
  • 动态性质:Spark提供了80个高级运算符,有助于轻松开发并行应用程序。
  • 内存中计算:Spark 的内存中计算功能由于其 DAG 执行引擎提高了数据处理速度。这也支持数据缓存,并减少了从磁盘获取数据所需的时间。
  • 可重用性:Spark 代码可以重用于批处理、数据流、运行即席查询等。
  • 容错:Spark支持使用RDD的容错。Spark RDD是旨在处理工作节点故障的抽象,可确保零数据丢失。
  • 流处理:Spark 支持实时流处理。早期MapReduce框架的问题在于它只能处理已经存在的数据。
  • 延迟评估:使用 Spark RDD 完成的 Spark 转换是惰性的。这意味着,它们不会立即生成结果,但它们会从现有的RDD创建新的RDD。这种惰性计算提高了系统效率。
  • 支持多种语言:Spark支持多种语言,如R,Scala,Python,Java,它提供了动态性,并有助于克服仅使用Java进行应用程序开发的Hadoop限制。
  • Hadoop Integration:Spark还支持Hadoop YARN集群管理器,从而使其变得灵活。
  • 支持Spark GraphX用于图形并行执行,Spark SQL,用于机器学习的库等。
  • 成本效率:与Hadoop相比,Apache Spark被认为是更具成本效益的解决方案,因为Hadoop在数据处理和复制时需要大型存储和数据中心。
  • 活跃的开发者社区:Apache Spark拥有庞大的开发人员基础,涉及持续开发。它被认为是Apache社区承担的最重要的项目。

3. 什么是RDD?

RDD 代表 弹性分布数据集。它是并行运行操作元素的容错集合。RDD的分区数据是分布式的,不可变的。有两种类型的数据集:

  • 并行化集合:用于并行运行。
  • Hadoop数据集:这些数据集在HDFS或其他存储系统上的文件记录系统上执行操作。

4. DAG 在 Apache Spark 中指的是什么?

DAG 代表 没有有向循环的有向无环图。会有有限的顶点和边。从一个顶点的每个边都按顺序定向到另一个折点。顶点表示Spark的RDD,边缘表示要在这些RDD上执行的操作。

5. 列出 Spark 中的部署模式类型。

Spark 中有 2 种部署模式。它们是:

  • 客户端模式:当 Spark 驱动程序组件在提交 Spark 作业的计算机节点上运行时,部署模式称为客户端模式。
    • 此模式的主要缺点是,如果计算机节点发生故障,则整个作业将失败。
    • 此模式同时支持交互式 shell 或作业提交命令。
    • 此模式的性能最差,在生产环境中不是首选。
  • 群集模式:如果 Spark 作业驱动程序组件未在已从中提交 Spark 作业的计算机上运行,则表示部署模式处于群集模式。
    • Spark 作业在群集中启动驱动程序组件,作为 ApplicationMaster 子进程的一部分。
    • 此模式仅支持使用 spark-submit 命令进行部署(不支持交互式 shell 模式)。
    • 在这里,由于驱动程序在 ApplicationMaster 中运行,因此如果程序失败,驱动程序将重新实例化。
    • 在这种模式下,有一个专用的集群管理器(例如独立、YARN、Apache Mesos、Kubernetes 等)用于分配运行作业所需的资源,如以下架构所示。

除了上述两种模式之外,如果我们必须在本地机器上运行应用程序进行单元测试和开发,则部署模式称为“本地模式”。在这里,作业在一台机器的单个 JVM 上运行,这使得它的效率非常低,因为在某些时候或另一个时候会出现资源短缺,从而导致作业失败。由于内存和空间有限,也无法在此模式下纵向扩展资源。

6. Apache Spark Streaming中的接收器是什么?

接收方是那些使用来自不同数据源的数据,然后将其移动到 Spark 进行处理的实体。它们是使用长时间运行的任务形式的流式处理上下文创建的,这些任务计划以循环方式运行。每个接收器配置为仅使用一个内核。接收器可以在各种执行器上运行,以完成数据流的任务。有两种类型的接收器,具体取决于数据发送到 Spark 的方式:

  • 可靠的接收方:在这里,接收方在成功接收数据并在 Spark 存储空间上复制数据后向数据源发送确认。
  • 不可靠的接收方:此处没有向数据源发送确认。

7. 重新分区和合并有什么区别?

重新分区

合并

使用情况重新分区可以增加/减少数据分区的数量。

Spark 合并只能减少数据分区的数量。

重新分区创建新的数据分区,并对均匀分布的数据执行完全随机排序。

Coalesce 利用现有的分区来减少不均匀的随机数据量。

内部重新分区调用使用随机参数合并,从而使其比合并慢。

合并比重新分区更快。但是,如果存在大小不等的数据分区,则速度可能会稍慢。

8. Spark支持哪些数据格式?

Spark 支持原始文件和结构化文件格式,以实现高效的读取和处理。Spark支持Parquet,JSON,XML,CSV,RC,Avro,TSV等文件格式。

9. 你对Spark中的Shuffling有什么理解?

在不同分区之间重新分发数据的过程可能会导致也可能不会导致数据在 JVM 进程或单独机器上的执行程序之间移动,这称为Shuffling/重新分区。分区只不过是数据的较小逻辑划分。

需要注意的是,Spark无法控制数据分布在哪个分区。

10. 什么是Spark中的YARN?

  • YARN 是 Spark 提供的关键功能之一,它提供了一个中央资源管理平台,用于在整个集群中提供可扩展的操作。
  • YARN是一种集群管理技术,Spark是一种数据处理工具。

11. Apache Spark与MapReduce有何不同?

MapReduce

阿帕奇Spark

MapReduce只对数据进行批量处理。

Apache Spark可以实时和批量处理数据。

MapReduce确实会减慢处理大数据的速度。

Apache Spark在大数据处理方面的运行速度比MapReduce快约100倍。

MapReduce将数据存储在HDFS(Hadoop分布式文件系统)中,这使得获取数据需要很长时间。

Spark 将数据存储在内存 (RAM) 中,从而可以在需要时更轻松、更快速地检索数据。

MapReduce高度依赖于磁盘,这使得它成为一个高延迟的框架。

Spark 支持内存数据存储和缓存,使其成为低延迟计算框架。

MapReduce需要一个外部调度程序来处理作业。

由于内存中的数据计算,Spark 有自己的作业调度程序。

12. 谈谈Spark 工作原理。

Spark应用程序以独立进程的形式运行,这些进程由驱动程序通过SparkSession对象进行良好协调。Spark 的群集管理器或资源管理器实体根据每个分区一个任务原则将运行 Spark 作业的任务分配给工作器节点。有各种迭代算法重复应用于数据,以跨各种迭代缓存数据集。每个任务都会将其操作单元应用于其分区中的数据集,并生成新的分区数据集。这些结果将发送回主驱动程序应用程序进行进一步处理或将数据存储在磁盘上。

13. DAG在Spark中的工作是什么?

DAG 代表直接无环图,它具有一组有限的顶点和边。顶点表示RDD,边表示要按顺序对RDD执行的操作。创建的 DAG 将提交到 DAG 计划程序,该计划程序根据应用于数据的转换将图形拆分为任务阶段。阶段视图包含该阶段的 RDD 的详细信息。

DAG 在 Spark 中的工作按照下面的工作流图定义:

  • 第一个任务是在解释器的帮助下解释代码。如果您使用 Scala 代码,则 Scala 解释器会解释代码。
  • 然后,Spark 会在 Spark 控制台中输入代码时创建一个运算符图。
  • 在 Spark RDD 上调用操作时,运算符图将提交到 DAG 计划程序。
  • 运算符由 DAG 计划程序划分为任务的各个阶段。该阶段包括对输入数据的详细分步操作。然后将这些运算符流水线连接在一起。
  • 然后将阶段传递给任务计划程序,任务计划程序通过集群管理器启动任务以独立工作,而无需阶段之间的依赖关系。
  • 然后,工作器节点执行任务。

每个RDD都会跟踪指向一个或多个父RDD的指针及其与父RDD的关系。例如,考虑对RDD的操作,然后我们有RDD子B跟踪其父A,称为RDD谱系。val childB=parentA.map()

14. 在什么情况下使用客户端和群集模式进行部署?

  • 如果客户端计算机不靠近群集,则应使用群集模式进行部署。这样做是为了避免在客户端模式下执行程序之间的通信时导致网络延迟。此外,在客户端模式下,如果计算机脱机,整个过程将丢失。
  • 如果我们在群集中有客户端计算机,则可以使用客户端模式进行部署。由于计算机位于群集内,因此不会出现网络延迟问题,并且由于群集的维护已经处理完毕,因此在发生故障时无需担心。

15. 什么是Spark Streaming,它是如何在Spark中实现的?

Spark Streaming是Spark提供的最重要的功能之一。它只不过是一个Spark API扩展,用于支持来自不同来源的数据的流处理。

  • 来自Kafka,Kinesis,Flume等来源的数据被处理并推送到各种目的地,如数据库,仪表板,机器学习API,或像文件系统一样简单。数据被分成各种流(类似于批处理)并相应地进行处理。
  • Spark 流支持高度可扩展、容错的连续流处理,主要用于欺诈检测、网站监控、网站点击诱饵、IoT(物联网)传感器等情况。
  • Spark 流式处理首先将数据流中的数据分成 X 秒的批次,称为 Dstreams 或离散化流。它们在内部只不过是多个RDD的序列。Spark 应用程序使用各种 Spark API 执行处理这些 RDD 的任务,并且此处理的结果再次作为批处理返回。下图说明了Spark流式处理过程的工作流。

16. 编写一个 Spark 程序来检查给定的关键字是否存在于一个巨大的文本文件中?

代码语言:javascript代码运行次数:0运行复制
```scala
import org.apache.spark.{SparkConf, SparkContext}

object KeywordSearch {
  def main(args: Array[String]): Unit = {
    // 创建Spark配置
    val conf = new SparkConf().setAppName("Keyword Search").setMaster("local[*]")
    val sc = new SparkContext(conf)

    // 读取文本文件
    val textFile = sc.textFile("path/to/textfile.txt")

    // 指定要查找的关键字
    val keyword = "example"

    // 使用filter操作筛选包含关键字的行
    val filteredLines = textFile.filter(line => line.contains(keyword))

    // 输出包含关键字的行数
    val count = filteredLines.count()
    println(s"Number of lines containing the keyword '$keyword': $count")

    // 关闭SparkContext
    sc.stop()
  }
}
```

在上面的代码中,我们首先创建了一个SparkConf对象,并设置了应用程序的名称和运行模式。然后,我们创建了一个SparkContext对象,它是与Spark集群通信的入口点。

接下来,我们使用`textFile`方法从文本文件中读取数据,并将其加载到RDD(弹性分布式数据集)中。

然后,我们指定要查找的关键字,并使用`filter`操作筛选包含关键字的行。这将返回一个新的RDD,其中只包含满足条件的行。

最后,我们使用`count`方法计算包含关键字的行数,并将结果打印出来。

请将上述代码中的"path/to/textfile.txt"替换为实际的文本文件路径,然后您就可以运行该程序来检查关键字是否存在于文本文件中了。

代码语言:javascript代码运行次数:0运行复制

17.谈谈你对Spark数据的认识?

Spark 数据集是 SparkSQL 的数据结构,它为 JVM 对象提供了 RDD 的所有好处(例如使用 lambda 函数的数据操作)以及 Spark SQL 优化的执行引擎。这是从 1.6 版开始作为 Spark 的一部分引入的。

  • Spark 数据集是表示结构化查询及其编码器的强类型结构。
  • 它们为数据提供类型安全,并提供面向对象的编程接口。
  • 数据集更加结构化,并具有有助于触发操作的延迟查询表达式。数据集具有RDD和数据帧的组合功能。在内部,每个数据集都符号化了一个逻辑计划,该计划通知计算查询有关数据生成的需求。分析和解析逻辑计划后,将形成执行实际查询执行的物理查询计划。

数据集具有以下功能:

  • 优化查询功能:Spark 数据集使用 Tungsten 和 Catalyst 查询优化器框架提供优化查询。Catalyst 查询优化器表示和操作数据流图(表达式和关系运算符的图)。钨通过强调Spark执行平台的硬件架构来提高和优化Spark作业的执行速度。
  • 编译时分析:数据集具有在编译时分析和检查语法的灵活性,这在RDD或数据帧或常规SQL查询中在技术上是不可能的。
  • 可相互转换:通过使用数据集持有者提供的以下方法,可以将数据集的类型安全功能转换为“非类型化”数据帧:
    • toDS():D ataset[T]
    • toDF():D ataFrame
    • toDF(columName:String*):D ataFrame
  • 更快的计算速度:数据集的实现比RDD快得多,这有助于提高系统性能。
  • 持久存储合格:由于数据集既可查询又可序列化,因此可以轻松地将它们存储在任何持久存储中。
  • 消耗更少的内存:Spark 使用缓存功能来创建更优化的数据布局。因此,消耗的内存更少。
  • 单一界面多种语言:为Java和Scala语言提供单一API。这些是使用Apache Spark的广泛使用的语言。这样可以减轻将库用于不同类型的输入的负担。

18. 定义 Spark 数据帧。

Spark 数据帧是数据集的分布式集合,这些数据集组织成类似于 SQL 的列。它相当于关系数据库中的表,主要针对大数据操作进行优化。 数据帧可以从来自不同数据源(如外部数据库、现有 RDD、Hive 表等)的数据数组创建。以下是 Spark 数据帧的功能:

  • Spark 数据帧能够在单个节点上处理大小从千字节到 PB 不等的数据,也可以处理大型群集。
  • 它们支持不同的数据格式,如CSV,Avro,弹性搜索等,以及各种存储系统,如HDFS,Cassandra,MySQL等。
  • 通过使用SparkSQL催化剂优化器,实现了最先进的优化。
  • 使用SparkCore可以轻松地将Spark数据帧与主要的大数据工具集成。

19. 在 Spark 中定义执行器内存

在 Spark 中开发的应用程序具有为 Spark 执行程序定义的相同固定核心计数和固定堆大小。堆大小是指通过使用属于标志的属性来控制的 Spark 执行程序的内存。每个 Spark 应用程序在其运行的每个工作器节点上都有一个分配的执行器。执行程序内存是应用程序使用的工作器节点消耗的内存的度量。spark.executor.memory-executor-memory

20. Spark核心的功能是什么?

SparkCore是用于大规模分布式和并行数据处理的主引擎。Spark 核心由分布式执行引擎组成,该引擎提供 Java、Python 和 Scala 中的各种 API,用于开发分布式 ETL 应用程序。 Spark Core 执行重要的功能,如内存管理、作业监视、容错、存储系统交互、作业调度,以及为所有基本 I/O 功能提供支持。在Spark Core之上构建了各种附加库,允许SQL,流式处理和机器学习的各种工作负载。他们负责:

  • 故障恢复
  • 内存管理和存储系统交互
  • 作业监控、调度和分发
  • 基本 I/O 功能

21. 你对工作节点有什么理解?

工作器节点是在群集中运行 Spark 应用程序的节点。Spark 驱动程序侦听传入连接,并接受来自执行程序的传入连接,将它们地址到工作器节点执行。工作节点就像一个从属节点,它从其主节点获取工作并实际执行它们。工作节点执行数据处理,并将使用的资源报告给主节点。主节点决定需要分配多少资源,然后根据其可用性,由主节点为工作节点安排任务。

22. 在应用程序中使用 Spark 有哪些缺点?

尽管Spark是强大的数据处理引擎,但在应用程序中使用Apache Spark存在一定的缺点。其中一些是:

  • 与MapReduce或Hadoop相比,Spark利用了更多的存储空间,这可能会导致某些基于内存的问题。
  • 开发人员在运行应用程序时必须小心。工作应该分布在多个集群中,而不是在单个节点上运行所有内容。
  • 由于Spark使用“内存中”计算,因此它们可能成为经济高效的大数据处理的瓶颈。
  • 使用本地文件系统路径上存在的文件时,在群集模式下工作时,必须在所有工作器节点上的同一位置访问这些文件,因为任务执行根据资源可用性在各个工作器节点之间随机排列。这些文件需要复制到所有工作节点上,或者需要安装单独的网络安装文件共享系统。
  • 使用Spark时最大的问题之一是使用大量小文件时。当Spark与Hadoop一起使用时,我们知道HDFS提供了有限数量的大文件,而不是大量的小文件。当有大量小的gzip文件时,Spark需要通过将这些文件保留在其内存和网络上来解压缩这些文件。因此,大量时间都花在刻录核心容量上,以便按顺序解压缩文件并执行生成的RDD的分区,以可管理的格式获取数据,这需要大量的整体Shuffling。这会影响 Spark 的性能,因为准备数据而不是处理数据所花费的时间很多。
  • Spark 在多用户环境中不能很好地工作,因为它无法同时处理许多用户。

23. 在使用 Spark 时,如何最大限度地减少数据传输?

数据传输对应于Shuffling过程。最大限度地减少这些传输可以使 Spark 应用程序更快、更可靠地运行。有多种方法可以最大限度地减少这些情况。它们是:

  • 广播变量的使用:广播变量提高了大型和小型RDD之间的连接效率。
  • 累加器的使用:这些有助于在执行期间并行更新变量值。
  • 另一种常见的方法是避免触发这些改组的操作。

24. Spark RDD中的SchemaRDD是什么?

SchemaRDD 是一个 RDD,由行对象组成,这些行对象是整数数组或字符串的包装器,这些数组或字符串具有有关每列数据类型的模式信息。它们旨在简化开发人员在调试代码和在 SparkSQL 模块上运行单元测试用例时的生活。它们表示RDD的描述,类似于关系数据库的模式。SchemaRDD还提供了常见RDD的基本功能以及SparkSQL的一些关系查询接口。

考虑一个例子。如果您有一个名为“人员”的 RDD 来表示人员的数据。然后 SchemaRDD 表示每行 Person RDD 所代表的数据。如果 Person 具有姓名和年龄等属性,则它们在 SchemaRDD 中表示。

25. 在 Apache Spark 中实现 SQL 使用什么模块?

Spark提供了一个强大的模块,称为SparkSQL,它执行关系数据处理,并结合Spark的函数式编程功能的强大功能。此模块还通过 SQL 或 Hive 查询语言支持。它还提供对不同数据源的支持,并帮助开发人员使用代码转换编写功能强大的 SQL 查询。 SparkSQL的四个主要库是:

  • 数据源接口
  • 数据帧接口
  • Interpreter & Catalyst Optimizer
  • SQL Services

Spark SQL 通过以下方式支持结构化和半结构化数据的使用:

  • Spark支持各种语言(如Python,Scala和Java)的数据帧抽象,并提供良好的优化技术。
  • SparkSQL支持各种结构化格式的数据读写操作,如JSON,Hive,Parquet等。
  • SparkSQL允许在Spark程序内部以及通过执行JDBC / ODBC连接的外部工具进行数据查询。
  • 建议在Spark应用程序中使用SparkSQL,因为它使开发人员能够加载数据,从数据库中查询数据并将结果写入目标。

26. Apache Spark 中有哪些不同的持久性级别?

Spark 会自动保留来自不同随机操作的中间数据。但建议在 RDD 上调用该方法。将RDD存储在内存或磁盘上或两者上具有不同复制级别的具有不同的持久性级别。Spark 中可用的持久性级别包括:persist()

  • MEMORY_ONLY:这是缺省的持久性级别,用于将RDD存储为JVM上Java对象的反序列化版本。如果RDD很大并且不适合内存,则不会缓存分区,并且将在需要时重新计算它们。
  • MEMORY_AND_DISK:RDD 再次作为反序列化的 Java 对象存储在 JVM 上。如果内存不足,则不适合内存的分区将存储在磁盘上,并在需要时从磁盘读取数据。
  • MEMORY_ONLY_SER:RDD 作为序列化的 Java 对象存储为每个分区一个字节。
  • MEMORY_AND_DISK_SER:此级别类似于,但不同之处在于内存中不适合的分区保存在磁盘上,以避免动态重新计算。MEMORY_ONLY_SER
  • DISK_ONLY:RDD分区仅存储在磁盘上。
  • OFF_HEAP:此级别与 相同,但此处数据存储在堆外内存中。MEMORY_ONLY_SER

在 persist() 方法中使用持久性级别的语法为:

代码语言:javascript代码运行次数:0运行复制
df.persist(StorageLevel.<level_value>)

下表总结了持久性级别的详细信息:

持久性级别

占用的空间

中央处理器时间

内存中?

在磁盘上?

MEMORY_ONLY

是的

MEMORY_ONLY_SER

是的

MEMORY_AND_DISK

中等

一些

一些

MEMORY_AND_DISK_SER

一些

一些

DISK_ONLY

是的

OFF_HEAP

是(但堆外)

27. 计算执行器内存的步骤是什么?

假设您有以下有关群集的详细信息:

代码语言:javascript代码运行次数:0运行复制
Number of nodes = 10
Number of cores in each node = 15 cores
RAM of each node = 61GB 

为了确定内核的数量,我们遵循以下方法:

代码语言:javascript代码运行次数:0运行复制
Number of Cores = number of concurrent tasks that can be run parallelly by the executor. The optimal value as part of a general rule of thumb is 5.

因此,要计算执行者的数量,我们遵循以下方法:

代码语言:javascript代码运行次数:0运行复制
Number of executors = Number of cores/Concurrent Task
                   = 15/5
                   = 3
Number of executors = Number of nodes * Number of executor in each node 
                   = 10 * 3 
                   = 30 executors per Spark job

28. 为什么在 Spark 中需要广播变量?

广播变量允许开发人员维护缓存在每台计算机上的只读变量,而不是随任务一起发送它的副本。它们用于有效地为大型输入数据集的每个节点提供副本。这些变量使用不同的算法广播到节点,以降低通信成本。

29. 区分 Spark 数据集、数据帧和 RDD。

标准

Spark数据集

Spark数据帧

SparkRDD

数据的表示

Spark 数据集是数据帧和 RDD 的组合,具有静态类型安全和面向对象的接口等功能。

Spark 数据帧是组织成命名列的分布式数据集合。

Spark RDD 是没有架构的分布式数据集合。

优化

数据集利用催化剂优化器进行优化。

数据帧还利用催化剂优化器进行优化。

没有内置的优化引擎。

架构投影

数据集使用 SQL 引擎自动查找架构。

数据帧还会自动查找架构。

模式需要在RDD中手动定义。

聚合速度

数据集聚合比RDD快,但比数据帧慢。

由于提供了简单而强大的 API,数据帧中的聚合速度更快。

RDD 比数据帧和数据集都慢,甚至可以执行数据分组等简单操作。

30. Apache Spark可以和Hadoop一起使用吗?如果是,那怎么做?

是的!Spark的主要特性是它与Hadoop的兼容性。这使得它成为一个强大的框架,因为使用这两者的组合有助于利用Hadoop的最佳YARN和HDFS功能来利用Spark的处理能力。

Hadoop可以通过以下方式与Spark集成:

  • HDFS:Spark可以配置为在HDFS上运行,以利用分布式复制存储的功能。
  • MapReduce:Spark也可以配置为在相同或不同的处理框架或Hadoop集群中与MapReduce一起运行。Spark和MapReduce可以一起使用,分别执行实时和批处理。
  • YARN:Spark应用程序可以配置为在充当集群管理框架的YARN上运行。

31. 什么是稀疏向量?它们与密集向量有何不同?

稀疏向量由两个并行数组组成,其中一个数组用于存储索引,另一个用于存储值。这些向量用于存储非零值以节省空间。

代码语言:javascript代码运行次数:0运行复制
val sparseVec: Vector = Vectors.sparse(5, Array(0, 4), Array(1.0, 2.0))
  • 在上面的例子中,我们有大小为 5 的向量,但非零值仅在索引 0 和 4 处存在。
  • 当非零值很少时,稀疏向量特别有用。如果存在只有几个零值的情况,则建议使用密集向量,因为使用稀疏向量会引入索引的开销,从而影响性能。
  • 密集向量可以定义如下:
代码语言:javascript代码运行次数:0运行复制
val denseVec = Vectors.dense(4405d,260100d,400d,5.0,4.0,198.0,9070d,1.0,1.0,2.0,0.0)
  • 使用稀疏或密集向量不会影响计算结果,但如果使用不当,它们会影响消耗的内存和计算速度。

32. 如何在 Spark 中触发自动清理以处理累积的元数据?

可以通过设置参数或对长时间运行的作业进行批量划分,然后将中间结果写入磁盘来自动触发清理任务。spark.cleaner.ttl

33. 缓存在 Spark 流中的相关性如何?

Spark Streaming涉及将数据流的数据分成X秒的批次,称为DStreams。这些DStreams允许开发人员将数据缓存到内存中,这在DStream的数据用于多个计算的情况下非常有用。数据的缓存可以使用 cache() 方法完成,也可以通过使用适当的持久性级别使用 persist() 方法来完成。通过Kafka、Flume等网络接收数据的输入流的默认持久化级别值设置为在2个节点上实现数据复制,实现容错。

  • 使用缓存方法进行缓存:
代码语言:javascript代码运行次数:0运行复制
val cacheDf = dframe.cache()
  • 使用持久方法进行缓存:
代码语言:javascript代码运行次数:0运行复制
val persistDf = dframe.persist(StorageLevel.MEMORY_ONLY)

缓存的主要优点是:

  • 成本效益:由于Spark计算成本高昂,缓存有助于实现数据的重用,这导致重用计算,从而节省运营成本。
  • 省时:计算重用可节省大量时间。
  • 完成更多作业:通过节省计算执行时间,工作节点可以执行/执行更多作业。

34. 在 Spark 中定义管道。

Apache Spark提供了RDD的方法,它提供了编写职业的不同部分的机会,这些职业可以根据UNIX标准流使用任何语言。使用该方法,可以编写RDD转换,该转换可用于将RDD的每个元素读取为字符串。可以根据需要操作这些,结果可以显示为字符串。pipe()pipe()

35. Spark 中的图形实现使用什么 API?

Spark提供了一个名为GraphX的强大API,它扩展了Spark RDD以支持图形和基于图形的计算。Spark RDD的扩展属性称为弹性分布式属性图,它是一个具有多个并行边的有向多图。每条边和顶点都有关联的用户定义属性。平行边的存在表示同一组顶点之间存在多个关系。GraphX 有一组运算符,如子图、mapReduceTriplets、joinVertices 等,可以支持图计算。它还包括大量图形生成器和算法,用于简化与图形分析相关的任务。

36. 如何在 Spark 中实现机器学习?

Spark提供了一个非常强大,可扩展的基于机器学习的库,称为MLlib。该库旨在实现简单且可扩展的基于 ML 的常见算法,并具有分类、聚类、降维、回归过滤等功能。有关此库的更多信息可以从Spark的官方文档站点获得详细信息:.html

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。 原始发表:2023-04-13,如有侵权请联系 cloudcommunity@tencent 删除spark工作面试内存数据

Spark技术中最常见的面试问题

Apache Spark是一种基于Hadoop和MapReduce技术的开源,支持各种计算技术,以实现快速高效的处理。Spark 以其内存中集群计算而闻名,这是提高 Spark 应用程序处理速度的主要贡献功能。Spark是Matei Zaharia于2009年在加州大学伯克利分校的AMPLab作为Hadoop子项目的一部分开发的。它后来在2010年以BSD许可证开源,然后在2013年捐赠给Apache软件基金会。从2014年开始,Spark在Apache基金会承担的所有项目中占据了顶级位置。

Spark面试问题

1. 你能告诉我什么是Apache Spark吗?

Apache Spark是一个开源框架引擎,以其在大数据处理和分析领域的速度,易于使用的性质而闻名。它还具有用于图形处理,机器学习,流式传输,SQL等的内置模块。Spark 执行引擎支持内存计算和循环数据流,它可以在集群模式或独立模式下运行,并且可以访问各种数据源,如 HBase、HDFS、Cassandra 等。

2. Apache Spark的特点是什么?

  • 高处理速度:Apache Spark通过减少对磁盘的读写操作来帮助实现非常高的数据处理速度。执行内存计算时,速度几乎快 100 倍,执行磁盘计算时速度快 10 倍。
  • 动态性质:Spark提供了80个高级运算符,有助于轻松开发并行应用程序。
  • 内存中计算:Spark 的内存中计算功能由于其 DAG 执行引擎提高了数据处理速度。这也支持数据缓存,并减少了从磁盘获取数据所需的时间。
  • 可重用性:Spark 代码可以重用于批处理、数据流、运行即席查询等。
  • 容错:Spark支持使用RDD的容错。Spark RDD是旨在处理工作节点故障的抽象,可确保零数据丢失。
  • 流处理:Spark 支持实时流处理。早期MapReduce框架的问题在于它只能处理已经存在的数据。
  • 延迟评估:使用 Spark RDD 完成的 Spark 转换是惰性的。这意味着,它们不会立即生成结果,但它们会从现有的RDD创建新的RDD。这种惰性计算提高了系统效率。
  • 支持多种语言:Spark支持多种语言,如R,Scala,Python,Java,它提供了动态性,并有助于克服仅使用Java进行应用程序开发的Hadoop限制。
  • Hadoop Integration:Spark还支持Hadoop YARN集群管理器,从而使其变得灵活。
  • 支持Spark GraphX用于图形并行执行,Spark SQL,用于机器学习的库等。
  • 成本效率:与Hadoop相比,Apache Spark被认为是更具成本效益的解决方案,因为Hadoop在数据处理和复制时需要大型存储和数据中心。
  • 活跃的开发者社区:Apache Spark拥有庞大的开发人员基础,涉及持续开发。它被认为是Apache社区承担的最重要的项目。

3. 什么是RDD?

RDD 代表 弹性分布数据集。它是并行运行操作元素的容错集合。RDD的分区数据是分布式的,不可变的。有两种类型的数据集:

  • 并行化集合:用于并行运行。
  • Hadoop数据集:这些数据集在HDFS或其他存储系统上的文件记录系统上执行操作。

4. DAG 在 Apache Spark 中指的是什么?

DAG 代表 没有有向循环的有向无环图。会有有限的顶点和边。从一个顶点的每个边都按顺序定向到另一个折点。顶点表示Spark的RDD,边缘表示要在这些RDD上执行的操作。

5. 列出 Spark 中的部署模式类型。

Spark 中有 2 种部署模式。它们是:

  • 客户端模式:当 Spark 驱动程序组件在提交 Spark 作业的计算机节点上运行时,部署模式称为客户端模式。
    • 此模式的主要缺点是,如果计算机节点发生故障,则整个作业将失败。
    • 此模式同时支持交互式 shell 或作业提交命令。
    • 此模式的性能最差,在生产环境中不是首选。
  • 群集模式:如果 Spark 作业驱动程序组件未在已从中提交 Spark 作业的计算机上运行,则表示部署模式处于群集模式。
    • Spark 作业在群集中启动驱动程序组件,作为 ApplicationMaster 子进程的一部分。
    • 此模式仅支持使用 spark-submit 命令进行部署(不支持交互式 shell 模式)。
    • 在这里,由于驱动程序在 ApplicationMaster 中运行,因此如果程序失败,驱动程序将重新实例化。
    • 在这种模式下,有一个专用的集群管理器(例如独立、YARN、Apache Mesos、Kubernetes 等)用于分配运行作业所需的资源,如以下架构所示。

除了上述两种模式之外,如果我们必须在本地机器上运行应用程序进行单元测试和开发,则部署模式称为“本地模式”。在这里,作业在一台机器的单个 JVM 上运行,这使得它的效率非常低,因为在某些时候或另一个时候会出现资源短缺,从而导致作业失败。由于内存和空间有限,也无法在此模式下纵向扩展资源。

6. Apache Spark Streaming中的接收器是什么?

接收方是那些使用来自不同数据源的数据,然后将其移动到 Spark 进行处理的实体。它们是使用长时间运行的任务形式的流式处理上下文创建的,这些任务计划以循环方式运行。每个接收器配置为仅使用一个内核。接收器可以在各种执行器上运行,以完成数据流的任务。有两种类型的接收器,具体取决于数据发送到 Spark 的方式:

  • 可靠的接收方:在这里,接收方在成功接收数据并在 Spark 存储空间上复制数据后向数据源发送确认。
  • 不可靠的接收方:此处没有向数据源发送确认。

7. 重新分区和合并有什么区别?

重新分区

合并

使用情况重新分区可以增加/减少数据分区的数量。

Spark 合并只能减少数据分区的数量。

重新分区创建新的数据分区,并对均匀分布的数据执行完全随机排序。

Coalesce 利用现有的分区来减少不均匀的随机数据量。

内部重新分区调用使用随机参数合并,从而使其比合并慢。

合并比重新分区更快。但是,如果存在大小不等的数据分区,则速度可能会稍慢。

8. Spark支持哪些数据格式?

Spark 支持原始文件和结构化文件格式,以实现高效的读取和处理。Spark支持Parquet,JSON,XML,CSV,RC,Avro,TSV等文件格式。

9. 你对Spark中的Shuffling有什么理解?

在不同分区之间重新分发数据的过程可能会导致也可能不会导致数据在 JVM 进程或单独机器上的执行程序之间移动,这称为Shuffling/重新分区。分区只不过是数据的较小逻辑划分。

需要注意的是,Spark无法控制数据分布在哪个分区。

10. 什么是Spark中的YARN?

  • YARN 是 Spark 提供的关键功能之一,它提供了一个中央资源管理平台,用于在整个集群中提供可扩展的操作。
  • YARN是一种集群管理技术,Spark是一种数据处理工具。

11. Apache Spark与MapReduce有何不同?

MapReduce

阿帕奇Spark

MapReduce只对数据进行批量处理。

Apache Spark可以实时和批量处理数据。

MapReduce确实会减慢处理大数据的速度。

Apache Spark在大数据处理方面的运行速度比MapReduce快约100倍。

MapReduce将数据存储在HDFS(Hadoop分布式文件系统)中,这使得获取数据需要很长时间。

Spark 将数据存储在内存 (RAM) 中,从而可以在需要时更轻松、更快速地检索数据。

MapReduce高度依赖于磁盘,这使得它成为一个高延迟的框架。

Spark 支持内存数据存储和缓存,使其成为低延迟计算框架。

MapReduce需要一个外部调度程序来处理作业。

由于内存中的数据计算,Spark 有自己的作业调度程序。

12. 谈谈Spark 工作原理。

Spark应用程序以独立进程的形式运行,这些进程由驱动程序通过SparkSession对象进行良好协调。Spark 的群集管理器或资源管理器实体根据每个分区一个任务原则将运行 Spark 作业的任务分配给工作器节点。有各种迭代算法重复应用于数据,以跨各种迭代缓存数据集。每个任务都会将其操作单元应用于其分区中的数据集,并生成新的分区数据集。这些结果将发送回主驱动程序应用程序进行进一步处理或将数据存储在磁盘上。

13. DAG在Spark中的工作是什么?

DAG 代表直接无环图,它具有一组有限的顶点和边。顶点表示RDD,边表示要按顺序对RDD执行的操作。创建的 DAG 将提交到 DAG 计划程序,该计划程序根据应用于数据的转换将图形拆分为任务阶段。阶段视图包含该阶段的 RDD 的详细信息。

DAG 在 Spark 中的工作按照下面的工作流图定义:

  • 第一个任务是在解释器的帮助下解释代码。如果您使用 Scala 代码,则 Scala 解释器会解释代码。
  • 然后,Spark 会在 Spark 控制台中输入代码时创建一个运算符图。
  • 在 Spark RDD 上调用操作时,运算符图将提交到 DAG 计划程序。
  • 运算符由 DAG 计划程序划分为任务的各个阶段。该阶段包括对输入数据的详细分步操作。然后将这些运算符流水线连接在一起。
  • 然后将阶段传递给任务计划程序,任务计划程序通过集群管理器启动任务以独立工作,而无需阶段之间的依赖关系。
  • 然后,工作器节点执行任务。

每个RDD都会跟踪指向一个或多个父RDD的指针及其与父RDD的关系。例如,考虑对RDD的操作,然后我们有RDD子B跟踪其父A,称为RDD谱系。val childB=parentA.map()

14. 在什么情况下使用客户端和群集模式进行部署?

  • 如果客户端计算机不靠近群集,则应使用群集模式进行部署。这样做是为了避免在客户端模式下执行程序之间的通信时导致网络延迟。此外,在客户端模式下,如果计算机脱机,整个过程将丢失。
  • 如果我们在群集中有客户端计算机,则可以使用客户端模式进行部署。由于计算机位于群集内,因此不会出现网络延迟问题,并且由于群集的维护已经处理完毕,因此在发生故障时无需担心。

15. 什么是Spark Streaming,它是如何在Spark中实现的?

Spark Streaming是Spark提供的最重要的功能之一。它只不过是一个Spark API扩展,用于支持来自不同来源的数据的流处理。

  • 来自Kafka,Kinesis,Flume等来源的数据被处理并推送到各种目的地,如数据库,仪表板,机器学习API,或像文件系统一样简单。数据被分成各种流(类似于批处理)并相应地进行处理。
  • Spark 流支持高度可扩展、容错的连续流处理,主要用于欺诈检测、网站监控、网站点击诱饵、IoT(物联网)传感器等情况。
  • Spark 流式处理首先将数据流中的数据分成 X 秒的批次,称为 Dstreams 或离散化流。它们在内部只不过是多个RDD的序列。Spark 应用程序使用各种 Spark API 执行处理这些 RDD 的任务,并且此处理的结果再次作为批处理返回。下图说明了Spark流式处理过程的工作流。

16. 编写一个 Spark 程序来检查给定的关键字是否存在于一个巨大的文本文件中?

代码语言:javascript代码运行次数:0运行复制
```scala
import org.apache.spark.{SparkConf, SparkContext}

object KeywordSearch {
  def main(args: Array[String]): Unit = {
    // 创建Spark配置
    val conf = new SparkConf().setAppName("Keyword Search").setMaster("local[*]")
    val sc = new SparkContext(conf)

    // 读取文本文件
    val textFile = sc.textFile("path/to/textfile.txt")

    // 指定要查找的关键字
    val keyword = "example"

    // 使用filter操作筛选包含关键字的行
    val filteredLines = textFile.filter(line => line.contains(keyword))

    // 输出包含关键字的行数
    val count = filteredLines.count()
    println(s"Number of lines containing the keyword '$keyword': $count")

    // 关闭SparkContext
    sc.stop()
  }
}
```

在上面的代码中,我们首先创建了一个SparkConf对象,并设置了应用程序的名称和运行模式。然后,我们创建了一个SparkContext对象,它是与Spark集群通信的入口点。

接下来,我们使用`textFile`方法从文本文件中读取数据,并将其加载到RDD(弹性分布式数据集)中。

然后,我们指定要查找的关键字,并使用`filter`操作筛选包含关键字的行。这将返回一个新的RDD,其中只包含满足条件的行。

最后,我们使用`count`方法计算包含关键字的行数,并将结果打印出来。

请将上述代码中的"path/to/textfile.txt"替换为实际的文本文件路径,然后您就可以运行该程序来检查关键字是否存在于文本文件中了。

代码语言:javascript代码运行次数:0运行复制

17.谈谈你对Spark数据的认识?

Spark 数据集是 SparkSQL 的数据结构,它为 JVM 对象提供了 RDD 的所有好处(例如使用 lambda 函数的数据操作)以及 Spark SQL 优化的执行引擎。这是从 1.6 版开始作为 Spark 的一部分引入的。

  • Spark 数据集是表示结构化查询及其编码器的强类型结构。
  • 它们为数据提供类型安全,并提供面向对象的编程接口。
  • 数据集更加结构化,并具有有助于触发操作的延迟查询表达式。数据集具有RDD和数据帧的组合功能。在内部,每个数据集都符号化了一个逻辑计划,该计划通知计算查询有关数据生成的需求。分析和解析逻辑计划后,将形成执行实际查询执行的物理查询计划。

数据集具有以下功能:

  • 优化查询功能:Spark 数据集使用 Tungsten 和 Catalyst 查询优化器框架提供优化查询。Catalyst 查询优化器表示和操作数据流图(表达式和关系运算符的图)。钨通过强调Spark执行平台的硬件架构来提高和优化Spark作业的执行速度。
  • 编译时分析:数据集具有在编译时分析和检查语法的灵活性,这在RDD或数据帧或常规SQL查询中在技术上是不可能的。
  • 可相互转换:通过使用数据集持有者提供的以下方法,可以将数据集的类型安全功能转换为“非类型化”数据帧:
    • toDS():D ataset[T]
    • toDF():D ataFrame
    • toDF(columName:String*):D ataFrame
  • 更快的计算速度:数据集的实现比RDD快得多,这有助于提高系统性能。
  • 持久存储合格:由于数据集既可查询又可序列化,因此可以轻松地将它们存储在任何持久存储中。
  • 消耗更少的内存:Spark 使用缓存功能来创建更优化的数据布局。因此,消耗的内存更少。
  • 单一界面多种语言:为Java和Scala语言提供单一API。这些是使用Apache Spark的广泛使用的语言。这样可以减轻将库用于不同类型的输入的负担。

18. 定义 Spark 数据帧。

Spark 数据帧是数据集的分布式集合,这些数据集组织成类似于 SQL 的列。它相当于关系数据库中的表,主要针对大数据操作进行优化。 数据帧可以从来自不同数据源(如外部数据库、现有 RDD、Hive 表等)的数据数组创建。以下是 Spark 数据帧的功能:

  • Spark 数据帧能够在单个节点上处理大小从千字节到 PB 不等的数据,也可以处理大型群集。
  • 它们支持不同的数据格式,如CSV,Avro,弹性搜索等,以及各种存储系统,如HDFS,Cassandra,MySQL等。
  • 通过使用SparkSQL催化剂优化器,实现了最先进的优化。
  • 使用SparkCore可以轻松地将Spark数据帧与主要的大数据工具集成。

19. 在 Spark 中定义执行器内存

在 Spark 中开发的应用程序具有为 Spark 执行程序定义的相同固定核心计数和固定堆大小。堆大小是指通过使用属于标志的属性来控制的 Spark 执行程序的内存。每个 Spark 应用程序在其运行的每个工作器节点上都有一个分配的执行器。执行程序内存是应用程序使用的工作器节点消耗的内存的度量。spark.executor.memory-executor-memory

20. Spark核心的功能是什么?

SparkCore是用于大规模分布式和并行数据处理的主引擎。Spark 核心由分布式执行引擎组成,该引擎提供 Java、Python 和 Scala 中的各种 API,用于开发分布式 ETL 应用程序。 Spark Core 执行重要的功能,如内存管理、作业监视、容错、存储系统交互、作业调度,以及为所有基本 I/O 功能提供支持。在Spark Core之上构建了各种附加库,允许SQL,流式处理和机器学习的各种工作负载。他们负责:

  • 故障恢复
  • 内存管理和存储系统交互
  • 作业监控、调度和分发
  • 基本 I/O 功能

21. 你对工作节点有什么理解?

工作器节点是在群集中运行 Spark 应用程序的节点。Spark 驱动程序侦听传入连接,并接受来自执行程序的传入连接,将它们地址到工作器节点执行。工作节点就像一个从属节点,它从其主节点获取工作并实际执行它们。工作节点执行数据处理,并将使用的资源报告给主节点。主节点决定需要分配多少资源,然后根据其可用性,由主节点为工作节点安排任务。

22. 在应用程序中使用 Spark 有哪些缺点?

尽管Spark是强大的数据处理引擎,但在应用程序中使用Apache Spark存在一定的缺点。其中一些是:

  • 与MapReduce或Hadoop相比,Spark利用了更多的存储空间,这可能会导致某些基于内存的问题。
  • 开发人员在运行应用程序时必须小心。工作应该分布在多个集群中,而不是在单个节点上运行所有内容。
  • 由于Spark使用“内存中”计算,因此它们可能成为经济高效的大数据处理的瓶颈。
  • 使用本地文件系统路径上存在的文件时,在群集模式下工作时,必须在所有工作器节点上的同一位置访问这些文件,因为任务执行根据资源可用性在各个工作器节点之间随机排列。这些文件需要复制到所有工作节点上,或者需要安装单独的网络安装文件共享系统。
  • 使用Spark时最大的问题之一是使用大量小文件时。当Spark与Hadoop一起使用时,我们知道HDFS提供了有限数量的大文件,而不是大量的小文件。当有大量小的gzip文件时,Spark需要通过将这些文件保留在其内存和网络上来解压缩这些文件。因此,大量时间都花在刻录核心容量上,以便按顺序解压缩文件并执行生成的RDD的分区,以可管理的格式获取数据,这需要大量的整体Shuffling。这会影响 Spark 的性能,因为准备数据而不是处理数据所花费的时间很多。
  • Spark 在多用户环境中不能很好地工作,因为它无法同时处理许多用户。

23. 在使用 Spark 时,如何最大限度地减少数据传输?

数据传输对应于Shuffling过程。最大限度地减少这些传输可以使 Spark 应用程序更快、更可靠地运行。有多种方法可以最大限度地减少这些情况。它们是:

  • 广播变量的使用:广播变量提高了大型和小型RDD之间的连接效率。
  • 累加器的使用:这些有助于在执行期间并行更新变量值。
  • 另一种常见的方法是避免触发这些改组的操作。

24. Spark RDD中的SchemaRDD是什么?

SchemaRDD 是一个 RDD,由行对象组成,这些行对象是整数数组或字符串的包装器,这些数组或字符串具有有关每列数据类型的模式信息。它们旨在简化开发人员在调试代码和在 SparkSQL 模块上运行单元测试用例时的生活。它们表示RDD的描述,类似于关系数据库的模式。SchemaRDD还提供了常见RDD的基本功能以及SparkSQL的一些关系查询接口。

考虑一个例子。如果您有一个名为“人员”的 RDD 来表示人员的数据。然后 SchemaRDD 表示每行 Person RDD 所代表的数据。如果 Person 具有姓名和年龄等属性,则它们在 SchemaRDD 中表示。

25. 在 Apache Spark 中实现 SQL 使用什么模块?

Spark提供了一个强大的模块,称为SparkSQL,它执行关系数据处理,并结合Spark的函数式编程功能的强大功能。此模块还通过 SQL 或 Hive 查询语言支持。它还提供对不同数据源的支持,并帮助开发人员使用代码转换编写功能强大的 SQL 查询。 SparkSQL的四个主要库是:

  • 数据源接口
  • 数据帧接口
  • Interpreter & Catalyst Optimizer
  • SQL Services

Spark SQL 通过以下方式支持结构化和半结构化数据的使用:

  • Spark支持各种语言(如Python,Scala和Java)的数据帧抽象,并提供良好的优化技术。
  • SparkSQL支持各种结构化格式的数据读写操作,如JSON,Hive,Parquet等。
  • SparkSQL允许在Spark程序内部以及通过执行JDBC / ODBC连接的外部工具进行数据查询。
  • 建议在Spark应用程序中使用SparkSQL,因为它使开发人员能够加载数据,从数据库中查询数据并将结果写入目标。

26. Apache Spark 中有哪些不同的持久性级别?

Spark 会自动保留来自不同随机操作的中间数据。但建议在 RDD 上调用该方法。将RDD存储在内存或磁盘上或两者上具有不同复制级别的具有不同的持久性级别。Spark 中可用的持久性级别包括:persist()

  • MEMORY_ONLY:这是缺省的持久性级别,用于将RDD存储为JVM上Java对象的反序列化版本。如果RDD很大并且不适合内存,则不会缓存分区,并且将在需要时重新计算它们。
  • MEMORY_AND_DISK:RDD 再次作为反序列化的 Java 对象存储在 JVM 上。如果内存不足,则不适合内存的分区将存储在磁盘上,并在需要时从磁盘读取数据。
  • MEMORY_ONLY_SER:RDD 作为序列化的 Java 对象存储为每个分区一个字节。
  • MEMORY_AND_DISK_SER:此级别类似于,但不同之处在于内存中不适合的分区保存在磁盘上,以避免动态重新计算。MEMORY_ONLY_SER
  • DISK_ONLY:RDD分区仅存储在磁盘上。
  • OFF_HEAP:此级别与 相同,但此处数据存储在堆外内存中。MEMORY_ONLY_SER

在 persist() 方法中使用持久性级别的语法为:

代码语言:javascript代码运行次数:0运行复制
df.persist(StorageLevel.<level_value>)

下表总结了持久性级别的详细信息:

持久性级别

占用的空间

中央处理器时间

内存中?

在磁盘上?

MEMORY_ONLY

是的

MEMORY_ONLY_SER

是的

MEMORY_AND_DISK

中等

一些

一些

MEMORY_AND_DISK_SER

一些

一些

DISK_ONLY

是的

OFF_HEAP

是(但堆外)

27. 计算执行器内存的步骤是什么?

假设您有以下有关群集的详细信息:

代码语言:javascript代码运行次数:0运行复制
Number of nodes = 10
Number of cores in each node = 15 cores
RAM of each node = 61GB 

为了确定内核的数量,我们遵循以下方法:

代码语言:javascript代码运行次数:0运行复制
Number of Cores = number of concurrent tasks that can be run parallelly by the executor. The optimal value as part of a general rule of thumb is 5.

因此,要计算执行者的数量,我们遵循以下方法:

代码语言:javascript代码运行次数:0运行复制
Number of executors = Number of cores/Concurrent Task
                   = 15/5
                   = 3
Number of executors = Number of nodes * Number of executor in each node 
                   = 10 * 3 
                   = 30 executors per Spark job

28. 为什么在 Spark 中需要广播变量?

广播变量允许开发人员维护缓存在每台计算机上的只读变量,而不是随任务一起发送它的副本。它们用于有效地为大型输入数据集的每个节点提供副本。这些变量使用不同的算法广播到节点,以降低通信成本。

29. 区分 Spark 数据集、数据帧和 RDD。

标准

Spark数据集

Spark数据帧

SparkRDD

数据的表示

Spark 数据集是数据帧和 RDD 的组合,具有静态类型安全和面向对象的接口等功能。

Spark 数据帧是组织成命名列的分布式数据集合。

Spark RDD 是没有架构的分布式数据集合。

优化

数据集利用催化剂优化器进行优化。

数据帧还利用催化剂优化器进行优化。

没有内置的优化引擎。

架构投影

数据集使用 SQL 引擎自动查找架构。

数据帧还会自动查找架构。

模式需要在RDD中手动定义。

聚合速度

数据集聚合比RDD快,但比数据帧慢。

由于提供了简单而强大的 API,数据帧中的聚合速度更快。

RDD 比数据帧和数据集都慢,甚至可以执行数据分组等简单操作。

30. Apache Spark可以和Hadoop一起使用吗?如果是,那怎么做?

是的!Spark的主要特性是它与Hadoop的兼容性。这使得它成为一个强大的框架,因为使用这两者的组合有助于利用Hadoop的最佳YARN和HDFS功能来利用Spark的处理能力。

Hadoop可以通过以下方式与Spark集成:

  • HDFS:Spark可以配置为在HDFS上运行,以利用分布式复制存储的功能。
  • MapReduce:Spark也可以配置为在相同或不同的处理框架或Hadoop集群中与MapReduce一起运行。Spark和MapReduce可以一起使用,分别执行实时和批处理。
  • YARN:Spark应用程序可以配置为在充当集群管理框架的YARN上运行。

31. 什么是稀疏向量?它们与密集向量有何不同?

稀疏向量由两个并行数组组成,其中一个数组用于存储索引,另一个用于存储值。这些向量用于存储非零值以节省空间。

代码语言:javascript代码运行次数:0运行复制
val sparseVec: Vector = Vectors.sparse(5, Array(0, 4), Array(1.0, 2.0))
  • 在上面的例子中,我们有大小为 5 的向量,但非零值仅在索引 0 和 4 处存在。
  • 当非零值很少时,稀疏向量特别有用。如果存在只有几个零值的情况,则建议使用密集向量,因为使用稀疏向量会引入索引的开销,从而影响性能。
  • 密集向量可以定义如下:
代码语言:javascript代码运行次数:0运行复制
val denseVec = Vectors.dense(4405d,260100d,400d,5.0,4.0,198.0,9070d,1.0,1.0,2.0,0.0)
  • 使用稀疏或密集向量不会影响计算结果,但如果使用不当,它们会影响消耗的内存和计算速度。

32. 如何在 Spark 中触发自动清理以处理累积的元数据?

可以通过设置参数或对长时间运行的作业进行批量划分,然后将中间结果写入磁盘来自动触发清理任务。spark.cleaner.ttl

33. 缓存在 Spark 流中的相关性如何?

Spark Streaming涉及将数据流的数据分成X秒的批次,称为DStreams。这些DStreams允许开发人员将数据缓存到内存中,这在DStream的数据用于多个计算的情况下非常有用。数据的缓存可以使用 cache() 方法完成,也可以通过使用适当的持久性级别使用 persist() 方法来完成。通过Kafka、Flume等网络接收数据的输入流的默认持久化级别值设置为在2个节点上实现数据复制,实现容错。

  • 使用缓存方法进行缓存:
代码语言:javascript代码运行次数:0运行复制
val cacheDf = dframe.cache()
  • 使用持久方法进行缓存:
代码语言:javascript代码运行次数:0运行复制
val persistDf = dframe.persist(StorageLevel.MEMORY_ONLY)

缓存的主要优点是:

  • 成本效益:由于Spark计算成本高昂,缓存有助于实现数据的重用,这导致重用计算,从而节省运营成本。
  • 省时:计算重用可节省大量时间。
  • 完成更多作业:通过节省计算执行时间,工作节点可以执行/执行更多作业。

34. 在 Spark 中定义管道。

Apache Spark提供了RDD的方法,它提供了编写职业的不同部分的机会,这些职业可以根据UNIX标准流使用任何语言。使用该方法,可以编写RDD转换,该转换可用于将RDD的每个元素读取为字符串。可以根据需要操作这些,结果可以显示为字符串。pipe()pipe()

35. Spark 中的图形实现使用什么 API?

Spark提供了一个名为GraphX的强大API,它扩展了Spark RDD以支持图形和基于图形的计算。Spark RDD的扩展属性称为弹性分布式属性图,它是一个具有多个并行边的有向多图。每条边和顶点都有关联的用户定义属性。平行边的存在表示同一组顶点之间存在多个关系。GraphX 有一组运算符,如子图、mapReduceTriplets、joinVertices 等,可以支持图计算。它还包括大量图形生成器和算法,用于简化与图形分析相关的任务。

36. 如何在 Spark 中实现机器学习?

Spark提供了一个非常强大,可扩展的基于机器学习的库,称为MLlib。该库旨在实现简单且可扩展的基于 ML 的常见算法,并具有分类、聚类、降维、回归过滤等功能。有关此库的更多信息可以从Spark的官方文档站点获得详细信息:.html

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。 原始发表:2023-04-13,如有侵权请联系 cloudcommunity@tencent 删除spark工作面试内存数据

本文标签: Spark技术中最常见的面试问题