接下来,程序创建了一个包含两个字符串的列表 , 并使用 parallelize 方法将其转换为一个 RDD 。然后,它使用 flatMap 方法将每一行文本拆分成单词,并使用 map 方法将每个单词映射为一个键值对(key-value pair),其中键是单词,值是 1 。
最后,程序使用 reduceByKey 方法将具有相同键的键值对进行合并,并对它们的值进行求和 。最终结果是一个包含每个单词及其出现次数的 RDD 。程序使用 collect 方法将结果收集到驱动程序,并使用 foreach 方法打印出来 。
二、Spark基本概念Spark的理论较多,为了更有效地学习Spark,首先来理解下其基本概念 。
1.ApplicationApplication指的就是用户编写的Spark应用程序 。
如下,"Word Count"就是该应用程序的名字 。
import org.apache.spark.sql.SparkSessionobject WordCount {def main(args: Array[String]) {// 创建 SparkSession 对象,它是 Spark Application 的入口val spark = SparkSession.builder.appName("Word Count").getOrCreate()// 读取文本文件并创建 Datasetval textFile = spark.read.textFile("hdfs://...")// 使用 flatMap 转换将文本分割为单词,并使用 reduceByKey 转换计算每个单词的数量val counts = textFile.flatMap(line => line.split(" ")).groupByKey(identity).count()// 将结果保存到文本文件中counts.write.text("hdfs://...")// 停止 SparkSessionspark.stop()}}
2.DriverDriver 是运行 Spark Application 的进程,它负责创建 SparkSession 和 SparkContext 对象,并将代码转换和操作 。
它还负责创建逻辑和物理计划,并与集群管理器协调调度任务 。
简而言之 , Spark Application 是使用 Spark API 编写的程序,而 Spark Driver 是负责运行该程序并与集群管理器协调的进程 。
可以将Driver 理解为运行 Spark Application main 方法的进程 。
driver的内存大小可以进行设置 , 配置如下:
# 设置 driver内存大小driver-memory 1024m
3.Master & Worker在Spark中,Master是独立集群的控制者,而Worker是工作者 。
一个Spark独立集群需要启动一个Master和多个Worker 。Worker就是物理节点,Worker上面可以启动Executor进程 。
4.Executor在每个Worker上为某应用启动的一个进程 , 该进程负责运行Task,并且负责将数据存在内存或者磁盘上 。
每个任务都有各自独立的Executor 。Executor是一个执行Task的容器 。实际上它是一组计算资源(cpu核心、memory)的集合 。
一个Worker节点可以有多个Executor 。一个Executor可以运行多个Task 。
Executor创建成功后,在日志文件会显示如下信息:
INFO Executor: Starting executor ID [executorId] on host [executorHostname]
5.RDDRDD(Resilient Distributed Dataset)叫做弹性分布式数据集,是Spark中最基本的数据抽象,它代表一个不可变、可分区、里面的元素可并行计算的集合 。
RDD的 Partition 是指数据集的分区 。它是数据集中元素的集合 , 这些元素被分区到集群的节点上,可以并行操作 。对于RDD来说,每个分片都会被一个计算任务处理,并决定并行计算的粒度 。用户可以在创建RDD时指定RDD的分片个数 , 如果没有指定 , 那么就会采用默认值 。默认值就是程序所分配到的CPU Core的数目 。
一个函数会被作用在每一个分区 。Spark 中 RDD 的计算是以分片为单位的,compute 函数会被作用到每个分区上 。
RDD的每次转换都会生成一个新的RDD,所以RDD之间就会形成类似于流水线一样的前后依赖关系 。在部分分区数据丢失时,Spark可以通过这个依赖关系重新计算丢失的分区数据,而不是对RDD的所有分区进行重新计算 。
6.Job一个Job包含多个RDD及作用于相应RDD上的各种操作,每个Action的触发就会生成一个job 。用户提交的Job会提交给DAG Scheduler,Job会被分解成Stage,Stage会被细化成Task 。
7.Task被发送到Executor上的工作单元 。每个Task负责计算一个分区的数据 。
8.Stage在 Spark 中,一个作业(Job)会被划分为多个阶段(Stage) 。同一个 Stage 可以有多个 Task 并行执行(Task 数=分区数) 。
阶段之间的划分是根据数据的依赖关系来确定的 。当一个 RDD 的分区依赖于另一个 RDD 的分区时 , 这两个 RDD 就属于同一个阶段 。当一个 RDD 的分区依赖于多个 RDD 的分区时 , 这些 RDD 就属于不同的阶段 。
文章插图
上图中,Stage表示一个可以顺滑完成的阶段 。曲线表示 Shuffle 过程 。
推荐阅读
- 烤箱新手教程 烤箱入门窍门
- 指南针的作用和意义 指南针的作用意义是什么
- 精致女生减肥指南,20个习惯,做到一半,就能再瘦70年
- 微波炉怎么选购指南视频 微波炉怎么选购指南
- 指南针怎么看 指南针怎么看海拔
- 抖音产业带服务商入驻详细指南!
- 春节社交礼仪 春节社交礼仪指南
- 中国早期的指南针也被称为什么?A 中国早期的指南针也被称为什么
- Tomcat目录结构详解:从新手到专家的指南
- “十一”长假哪天最堵?这份“避堵”指南请收好