spark内核与源码

一、环境准备(Yarn集群)

bin/spark-submit \
--class org.apache.spark.examples.SparkPi \
--master yarn \
--deploy-mode cluster \
./examples/jars/spark-examples_2.12-3.0.0.jar \
10
spark-submit
--class org.apache.spark.examples.SparkPi
--master  local[2]
../examples/jars/spark-examples_2.12-3.0.0.jar
10

在这里插入图片描述

二、组件通信

Driver => Executor
在这里插入图片描述

三、应用程序的执行

1、RDD依赖

在这里插入图片描述

2、阶段划分

在这里插入图片描述

3、任务切分

4、任务的调度

在这里插入图片描述

5、任务执行

在这里插入图片描述

四、Shuffle

在这里插入图片描述
在这里插入图片描述

1、Shuffle 的原理和执行过程

  • shuffleWriterProcessor(写处理器)
  • ShuffleManager: Hash(早期) & Sort(当前)

在这里插入图片描述

2、Shuffle 写磁盘

在这里插入图片描述

3、Shuffle 读取磁盘

五、内存的管理

1、内存的分类

在这里插入图片描述

2、内存的配置

在这里插入图片描述

六、Spark SQL概述

1、什么是 Spark SQL

Spark SQL 是 Spark 用于结构化数据(structured data)处理的 Spark 模块.
与基本的 Spark RDD API 不同, Spark SQL 的抽象数据类型为 Spark 提供了关于数据结构和正在执行的计算的更多信息.
在内部, Spark SQL 使用这些额外的信息去做一些额外的优化.
有多种方式与 Spark SQL 进行交互, 比如: SQL 和 Dataset API. 当计算结果的时候, 使用的是相同的执行引擎, 不依赖你正在使用哪种 API 或者语言.
这种统一也就意味着开发者可以很容易在不同的 API 之间进行切换, 这些 API 提供了最自然的方式来表达给定的转换.
我们已经学习了 Hive,它是将 Hive SQL 转换成 MapReduce 然后提交到集群上执行,大大简化了编写 MapReduc 的程序的复杂性,
由于 MapReduce 这种计算模型执行效率比较慢, 所以 Spark SQL 的应运而生,它是将 Spark SQL 转换成 RDD,然后提交到集群执行,执行效率非常快!
Spark SQL 它提供了2个编程抽象, 类似 Spark Core 中的 RDD

  1. DataFrame
  2. DataSet

2、Spark SQL 的特点

  • Integrated(易整合)
    无缝的整合了 SQL 查询和 Spark 编程.
    在这里插入图片描述

  • Uniform Data Access(统一的数据访问方式)
    使用相同的方式连接不同的数据源.
    在这里插入图片描述

  • Hive Integration(集成 Hive)
    在已有的仓库上直接运行 SQL 或者 HiveQL
    在这里插入图片描述

  • Standard Connectivity(标准的连接方式)
    通过 JDBC 或者 ODBC 来连接
    在这里插入图片描述

3、DataFrame

与 RDD 类似,DataFrame 也是一个分布式数据容器。然而DataFrame更像传统数据库的二维表格,除了数据以外,还记录数据的结构信息,即schema。同时,与Hive类似,DataFrame也支持嵌套数据类型(struct、array和map)。从 API 易用性的角度上看,DataFrame API提供的是一套高层的关系操作,比函数式的 RDD API 要更加友好,门槛更低。

在这里插入图片描述

上图直观地体现了DataFrame和RDD的区别。
左侧的RDD[Person]虽然以Person为类型参数,但Spark框架本身不了解Person类的内部结构。
而右侧的DataFrame却提供了详细的结构信息,使得 Spark SQL 可以清楚地知道该数据集中包含哪些列,每列的名称和类型各是什么。
DataFrame是为数据提供了Schema的视图。可以把它当做数据库中的一张表来对待, DataFrame也是懒执行的,性能上比 RDD要高,主要原因: 优化的执行计划:查询计划通过Spark catalyst optimiser进行优化。

4、DataSet

  1. 是DataFrame API的一个扩展,是 SparkSQL 最新的数据抽象(1.6新增)。
  2. 用户友好的API风格,既具有类型安全检查也具有DataFrame的查询优化特性。
  3. Dataset支持编解码器,当需要访问非堆上的数据时可以避免反序列化整个对象,提高了效率。
  4. 样例类被用来在DataSet中定义数据的结构信息,样例类中每个属性的名称直接映射到DataSet中的字段名称。
  5. DataFrame是DataSet的特列,DataFrame=DataSet[Row] ,所以可以通过as方法将DataFrame转换为DataSet。Row是一个类型,跟Car、Person这些的类型一样,所有的表结构信息都用Row来表示。
  6. DataSet是强类型的。比如可以有DataSet[Car],DataSet[Person].
  7. DataFrame只是知道字段,但是不知道字段的类型,所以在执行这些操作的时候是没办法在编译的时候检查是否类型失败的,比如你可以对一个String进行减法操作,在执行的时候才报错,而DataSet不仅仅知道字段,而且知道字段类型,所以有更严格的错误检查。就跟JSON对象和类对象之间的类比。

七、Spark SQL 编程

1、SparkSession

在老的版本中,SparkSQL 提供两种 SQL 查询起始点:一个叫SQLContext,用于Spark 自己提供的 SQL 查询;一个叫 HiveContext,用于连接 Hive 的查询。
从2.0开始, SparkSession是 Spark 最新的 SQL 查询起始点,实质上是SQLContext和HiveContext的组合,所以在SQLContext和HiveContext上可用的 API 在SparkSession上同样是可以使用的

SparkSession内部封装了SparkContext,所以计算实际上是由SparkContext完成的。
当我们使用 spark-shell 的时候, spark 会自动的创建一个叫做spark的SparkSession, 就像我们以前可以自动获取到一个sc来表示SparkContext

2、使用 DataFrame 进行编程

Spark SQL 的 DataFrame API 允许我们使用 DataFrame 而不用必须去注册临时表或者生成 SQL 表达式.
DataFrame API 既有 transformation操作也有action操作. DataFrame的转换从本质上来说更具有关系, 而 DataSet API 提供了更加函数式的 API

2.1、创建 DataFrame

  • 通过 Spark 的数据源创建
  • 通过已知的 RDD 来创建
  • 通过查询一个 Hive 表来创建.

如果从内存中获取数据,spark 可以知道数据类型具体是什么。如果是数字,默认作为 Int 处理;但是从文件中读取的数字,不能确定是什么类型,所以用 bigint 接收,可以和Long 类型转换,但是和 Int 不能进行转换

2.2、SQL 语法

scala> val df = spark.read.json("data/user.json")
df: org.apache.spark.sql.DataFrame = [age: bigint, username: string]
scala> df.createOrReplaceTempView("people")
scala> val sqlDF = spark.sql("SELECT * FROM people")
sqlDF: org.apache.spark.sql.DataFrame = [age: bigint, name: string]
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值