Spark基础概论
-
Spark定义
Spark是一种基于内存的快速、通用、可扩展的大数据分析引擎
-
Spark的内置模块
-
SparkSQL 结构化数据查询语句
-
SparkStreaming 实时计算框架
-
Spark Milb 机器学习
-
Spark GraghX 图计算
-
Spark core spark的核心引擎
Spark Core: 实现了 Spark 的基本功能,包含任务调度、内存管理、错误恢复、与存储系统交互等模块。 Spark Core 中还包含了对弹性分布式数据集(Resilient Distributed DataSet,简称 RDD)的 API 定义。
Spark SQL: 是Spark用来操作结构化数据的程序包。通过Spark SQL,我们可以使用 SQL或者 Apache Hive 版本的 SQL 方言(HQL)来查询数据。 Spark SQL 支持多种数据源,比如 Hive
表、 Parquet 以及 JSON 等。
Spark Streaming: 是 Spark 提供的对实时数据进行流式计算的组件。提供了用来操作数据流的 API,并且与 Spark Core 中的 RDD API 高度对应。
Spark MLlib: 提供常见的机器学习(ML)功能的程序库。包括分类、回归、聚类、协同过滤等,还提供了模型评估、数据 导入等额外的支持功能。
集群管理器: Spark 设计为可以高效地在一个计算节点到数千个计算节点之间伸缩计算。为了实现这样的要求,同时获得最大灵活性, Spark 支持在各种集群管理器(Cluster Manager)上运行,包括 Hadoop YARN、 Apache Mesos,以及 Spark 自带的一个简易调度 器,
叫作独立调度器。
-
-
特点
1)快: 与Hadoop的MapReduce相比, Spark基于内存的运算要快100倍以上,基于硬盘的运算也要快10倍以上。 Spark实现了高效的DAG执行引擎,可以通过基于内存来高效处理数据流。计算的中间结果是存在于内存中的。
2)易用: Spark支持Java、 Python和Scala的API,还支持超过80种高级算法,使用户可以快速构建不同的应用。而且Spark支持交互式的Python和Scala的Shell,可以非常方便地在这些Shell中使用Spark集群来验证解决问题的方法。
3)通用: Spark提供了统一的解决方案。 Spark可以用于批处理、交互式查询( Spark SQL)、实时流处理( Spark Streaming)、机器学习( Spark MLlib)和图计算( GraphX)。这些不同类型的处理都可以在同一个应用中无缝使用。减少了开发和维护的人力成本和部署平台的物力成本。
4)兼容性: Spark可以非常方便地与其他的开源产品进行融合。比如, Spark可以使用Hadoop的YARN和Apache Mesos作为它的资源管理和调度器,并且可以处理所有Hadoop支持的数据,包括HDFS、 HBase等。这对于已经部署Hadoop集群的用户特别重要,因为不需要做任何数据迁移就可以使用Spark的强大处理能力。 -
重要角色
-
Driver(驱动器)
Spark 的驱动器是执行开发程序中的 main 方法的进程。它负责开发人员编写的用来创建 SparkContext、创建 RDD,以及进行 RDD 的转化操作和行动操作代码的执行。如果你是
用 spark shell,那么当你启动 Spark shell 的时候,系统后台自启了一个 Spark 驱动器程序,
就是在 Spark shell 中预加载的一个叫作 sc 的 SparkContext 对象。如果驱动器程序终止,那
么 Spark 应用也就结束了。 主要负责: 1)把用户程序转为作业( JOB)
2)跟踪 Executor 的运行状况
3)为执行器节点调度任务
4) UI 展示应用运行状况 -
Executor(执行器)
Spark Executor 是一个工作进程,负责在 Spark 作业中运行任务,任务间相互独立。 Spark
应用启动时, Executor 节点被同时启动,并且始终伴随着整个 Spark 应用的生命周期而存
在。如果有 Executor 节点发生了故障或崩溃, Spark 应用也可以继续执行,会将出错节点上
的任务调度到其他 Executor 节点上继续运行。 主要负责: 1) 负责运行组成 Spark 应用的任务,并将结果返回给驱动器进程;
2) 通过自身的块管理器( Block Manager)为用户程序中要求缓存的 RDD 提供内存式
存储。 RDD 是直接缓存在 Executor 进程内的,因此任务可以在运行时充分利用缓存数据加
速运算
-
-
安装使用
上传解压安装包----直接运行bin下的Spark-submit脚本文件
- 官方求pi的案例:
bin/spark-submit
–class org.apache.spark.examples.SparkPi
–executor-memory 1G
–total-executor-cores 2
./examples/jars/spark-examples_2.11-2.4.4.jar
100
2. 基本语法:
bin/spark-submit \
–class
–master
–deploy-mode
–conf =
… # other options
[application-arguments]
-
参数说明
–master 指定 Master 的地址,默认为 Local
–class: 你的应用的启动类 (如 org.apache.spark.examples.SparkPi)
–deploy-mode: 是否发布你的驱动到 worker 节点(cluster) 或者作为一个本地客户端
(client) (default: client)*–conf: 任意的 Spark 配置属性, 格式 key=value. 如果值包含空格,可以加引号
“key=value”application-jar: 打包好的应用 jar,包含依赖. 这个 URL 在集群中全局可见。 比如 hdfs://
共享存储系统, 如果是 file:// path, 那么所有的节点的 path 都包含同样的 jar
application-arguments: 传给 main()方法的参数
–executor-memory 1G 指定每个 executor 可用内存为 1G
–total-executor-cores 2 指定每个 executor 使用的 cup 核数为 2 个 -
官方WorkCount案例分析
首先客户端Client进行任务提交----->Driver进行运行(初始化sc、任务划分、任务调度)---->向资源管理器(Yern)注册运用程序---->yern进行启动Executor----->执行器(Exector)启动之后(进行执行任务、进行一些列RDD算子操作、action提交任务)—>Exector执行过程中会向Driver进行反向注册,报告给Driver自己的任务执行情况。
-
Spark的运行模式目前国内主要有三种
Local 本地模式 只需要安装一台机器
Standalone 3 需要进行Master和Worker的进程
Yarn‘ 1 需要启动集群HDFS、Yarn
-
案例实操
Spark Shell 仅在测试和验证我们的程序时使用的较多,在生产环境中,通常会在 IDEA中编制程序,然后打成 jar 包,然后提交到集群,最常用的是创建一个 Maven 项目,利用Maven 来管理 jar 包的依赖。
编写WordCount程序
1. 创建Maven项目、导入依赖、打包环境 <dependency> <groupId>org.apache.spark</groupId> <artifactId>spark-core_2.11</artifactId> <version>2.4.4</version> </dependency> <build> <finalName>WordCount</finalName> <plugins> <plugin> <groupId>net.alchim31.maven</groupId> <artifactId>scala-maven-plugin</artifactId> <version>3.2.2</version> <executions> <execution> <goals> <goal>compile</goal> <goal>testCompile</goal> </goals> </execution> </executions> </plugin> </plugins> </build>
2. 编写代码 package com.ityouxin import org.apache.spark.{SparkConf, SparkContext} object WordCount{ def main(args: Array[String]): Unit = { //1.创建 SparkConf 并设置 App 名称 val conf = new SparkConf().setAppName("WC") //2.创建 SparkContext,该对象是提交 Spark App 的入口 val sc = new SparkContext(conf) //3.使用 sc 创建 RDD 并执行相应的 transformation 和 action sc.textFile(args(0)).flatMap(_.split(" ")).map((_, 1)).reduceByKey(_+_, 1).sortBy(_._2,false).saveAsTextFile(args(1)) //4.关闭连接 sc.stop() } } 3. 打包到集群上运行 bin/spark-submit \ --class WordCount \ --master spark://hadoop102:7077 \ WordCount.jar \ /word.txt \ /out