spark基础
文章目录
前言
Spark 是一种与 Hadoop 相似的开源集群计算环境,但是两者之间还存在一些不同之处,这些有用的不同之处使 Spark 在某些工作负载方面表现得更加优越,换句话说,Spark 启用了内存分布数据集,除了能够提供交互式查询外,它还可以优化迭代工作负载。 Spark 是在 Scala 语言中实现的,它将 Scala 用作其应用程序框架。
章一、spark基础概念
1.1什么是spark
定义:
spark是一种基于内存的快速、通用、可扩展的大数据分析引擎。
1.2 spark的内置模块
spark core:实现了spark的基本功能,包含任务调度、内存管理、错误恢复、与存储系统交互等模块。spark还对弹性分布式数据集(Resilient Distributed DataSet)即RDD 的定义
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.3spark的特点
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的强大处理能力。
章二、spark运行模式
2.1提交流程
重要角色:
Driver(驱动器)
Spark 的驱动器是执行开发程序中的 main 方法的进程。它负责开发人员编写的用来创
建 SparkContext、创建 RDD,以及进行 RDD 的转化操作和行动操作代码的执行。如果你
是用 spark shell,那么当你启动 Spark shell 的时候,系统后台自启了一个 Spark 驱动器程
序,就是在 Spark shell 中预加载的一个叫作 sc 的 SparkContext 对象。如果驱动器程序终
止,那么 Spark 应用也就结束了。主要负责:
1)把用户程序转为任务
2)跟踪 Executor 的运行状况
3)为执行器节点调度任务
4)UI 展示应用运行状况
Executor(执行器)
Spark Executor 是一个工作进程,负责在 Spark 作业中运行任务,任务间相互独立。
Spark 应用启动时,Executor 节点被同时启动,并且始终伴随着整个 Spark 应用的生命周
期而存在。如果有 Executor 节点发生了故障或崩溃,Spark 应用也可以继续执行,会将出
错节点上的任务调度到其他 Executor 节点上继续运行。主要负责:
1)负责运行组成 Spark 应用的任务,并将结果返回给驱动器进程;
2)通过自身的块管理器(Block Manager)为用户程序中要求缓存的 RDD 提供内存式
存储。RDD 是直接缓存在 Executor 进程内的,因此任务可以在运行时充分利用缓存数据加
速运算。
2.2数据流程 (以wordCount为例)
textFile(“input”):读取本地文件 input 文件夹数据;
flatMap(.split(" ")):压平操作,按照空格分割符将一行数据映射成一个个单词;
map((,1)):对每一个元素操作,将单词映射为元组;
reduceByKey(+):按照 key 将值进行聚合,相加;
collect:将数据收集到 Driver 端展示。
2.3 集群模式
Standalone(独立集群) 模式
HA高可用配置
Yarn 模式
几种模式对比
案例
package com.lyinl
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()
} }
maven 依赖
<dependencies>
<dependency>
<groupId>org.apache.spark</groupId>
<artifactId>spark-core_2.11</artifactId>
<version>2.1.1</version>
</dependency>
</dependencies>
<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>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-assembly-plugin</artifactId>
<version>3.0.0</version>
<configuration>
<archive>
<manifest>
<mainClass>WordCount</mainClass>
</manifest>
</archive>
<descriptorRefs>
<descriptorRef>jar-withdependencies</descriptorRef>
</descriptorRefs>
</configuration>
<executions>
<execution>
<id>make-assembly</id>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
</plugin>
打包到集群
bin/spark-submit \
--class WordCount \
--master spark://hadoop102:7077 \
WordCount.jar \ /word.txt \
/out