离线批处理之Spark

Spark简介

    Spark是基于内存的分布式批处理系统,它把任务拆分,然后分配到多个的CPU上进行处理,处理数据时产生的中间产物(计算结果)存放在内存中,减少了对磁盘的I/O操作,大大的提升了数据的处理速度,在数据处理和数据挖掘方面比较占优势。

Spark应用场景

  • 数据处理(Data Processing):可以用来快速处理数据,兼具容错性和可扩展性。
  • 迭代计算(Iterative Computation):支持迭代计算,有效应对复杂的数据处理逻辑。
  • 数据挖掘(Data Mining):在海量数据基础上进行复杂的挖掘分析,可支持多种数据挖掘和机器学习算法。
  • 流式处理(Streaming Processing):支持秒级延迟的流处理,可支持多种外部数据源。
  • 查询分析(Query Analysis):支持SQL的查询分析,同时提供领域特定语言(DSL)以方便操作结构化数据,并支持多种外部数据源。

Spark对比MapReduce

  • 性能上提升了100倍。
  • Spark的中间数据放在内存中,对于迭代运算的效率更高;进行批处理时更高效,同时有着更低的延迟。
  • Spark提供更多的数据集操作类型,编程模型比MapReduce更灵活,开发效率更高。
  • 更高的容错能力(血统机制)。

RDD

RDD是分布式弹性数据集,可以理解一个存储数据的数据结构。Spark会把所要操作的数据,加载到RDD上,即RDD所有操作都是基于RDD来进行的。RDD是只读和可分区。要想对RDD进行操作,只能重新生成一个新的RDD。

  • 从HDFS输入创建,或从与Hadoop兼容的其他存储系统中输入创建。
  • 从父的RDD转换的到新的RDD。
  • 从数据集合转换而来,通过编码实现。

RDD的存储:

  • 用户可以选择不同的存储级别缓存RDD以便重用。
  • 当前RDD默认是存储于内存,但当内存不足时,RDD会溢出到磁盘中。

Shuffle

Shuffle 是划分 DAG 中 stage 的标识,同时影响 Spark 执行速度的关键步骤

  • RDD 的 Transformation 函数中,分为窄依赖(narrow dependency)和宽依赖(wide dependency)的操作.
  • 窄依赖跟宽依赖的区别是是否发生Shuffle(洗牌) 操作。

窄依赖

窄依赖是指父RDD的每个分区只被子RDD的一个分区所使用。 表现为: 一个父RDD的每一个分区对应于一个子RDD分区。

宽依赖

宽依赖是指父RDD的每个分区都可能被多个子RDD分区所使用。 表现为: 父RDD的每个分区都被多个子RDD分区使用

Transformation

Transformation是RDD的算子类型,它的返回值还是一个RDD。

Transformation操作属于懒操作(算子),不会真正触发RDD的处理计算。

变换方法的共同点:

  • 不会马上触发计算。
  • 每当调用一次变换方法,都会产生一个新的RDD。

例如:map(func),flatMap(func)

Action

Action是RDD的算子,它的返回值不是一个RDD。Action操作是返回结果或者将结果写入存储的操作。Action是Spark应用启动执行的触发动作,得到RDD的相关计算结果或将RDD保存到文件系统中。

SparkConf

SparkConf是用来对Spark进行任务参数配置的对象。 是通过键值对的形式,设置Spark任务执行时所需要的参数。 Spark读取任务参数的优先级是: 代码配置>动态参数>配置文件。

SparkContext

SparkContext是Spark的入口,相当于应用程序的main函数。

SparkContext表示与Spark集群的连接,可用于在该集群上创建RDD,记录计算结果和环境配置等信息。

SparkSession

Spark2.0中引入了SparkSession的概念,为用户提供了一个统一的切入点来使用Spark的各项功能。

封装了SparkConf和SparkContext对象,方便用户使用Spark的各种API。

SparkSQL简介

SparkSQL是Spark用来处理结构化数据的一个模块,可以在Spark应用中直接使用SQL语句对数据进行操作。

SQL语句通过SparkSQL模块解析为RDD执行计划,交给SparkCore执行。

通过SparkSession提交SQL语句。任务像普通Spark应用一样,提交到集群中分布式运行。

JDBC:

  • 应用加载JDBC驱动,然后统一提交到集群的JDBCServer执行。
  • JDBCServer是单点服务,会成为任务执行的瓶颈,不能处理海量数据和高并发任务。

DataSet:

  • DataSet是一个由特定域的对象组成的强类型集合,可通过功能或关系操作并行转换其中的对象
  • DataSet以Catalyst逻辑执行计划表示,并且数据以编码的二进制形式存储,不需要反序列化就可以执行sort、filter、shuffle等操作。
  • Dataset是“懒惰”的,只在执行action操作时触发计算。当执行action操作时,Spark用查询优化程序来优化逻辑计划,并生成一个高效的并行分布式的物理计

SparkSQL使用场景

适合: 结构化数据处理。 对数据处理的实时性要求不高的场景 需要处理PB级的大容量数据。

不适合: 实时数据查询。

原文地址:https://www.cnblogs.com/xiao02fang/p/14279946.html