Spark入门及常用组件介绍
Spark架构
Spark的组件
Spark Core
实现了 Spark 的基本功能,包含任务调度、内存管理、容错机制、与存储系统交互等模块。还定义了弹性分布式数据集(Resilient DistributedDataSet,简称 RDD),并提供了很多API来创建和操作这些RDD。Spark Core 为其他组件提供底层的服务,其他的四个模块库都是构建在Spark Core和RDD上。
Spark SQl
提供交互式语法(SQL) 来操作结构化数据的一个模块,通过Spark SQL用户可以使用SQL或者HQL(Hive版本的SQL)来查询数据。Spark SQL 支持多种数据源,比如 Hive 表、Parquet 以及 JSON 等。
Spark SQL和SparkCore一样,主要包含Context上下文和核心抽象DataFrame。其中Context主要包括两种:
SQLContext:提供SQL语法的上下文对象,不能提供Hive相关操作。
HiveContext:提供集成Hive的数据操作相关的上下文对象。
Spark Streaming
Spark提供的对实时数据进行流式计算的组件。提供了用来操作数据流的 API,并且与 Spark Core 中的 RDD API 高度对应。
Spark MLlib
Spark提供的一个机器学习算法库,主要有分类、回归、聚类、协同过滤等,还供了模型评估、数据导入和一个通用的梯度下降优化基础算法。
MLlib包含spark.mllib和spark.ml这两个package:
spark.mllib基于RDD,是一种低级别的API
spark.ml基于DataFrame,是一种高层次的API
集群管理器
集群管理器:Spark 设计为可以高效地在一个计算节点到数千个计算节点之间伸缩计算。为了实现这样的要求,同时获得最大灵活性,Spark 支持在各种集群管理器(Cluster Manager)上运行,包括 Hadoop YARN、Apache Mesos,以及 Spark 自带的一个简易调度器,叫作独立调度器。
Spark提交任务指令
bin/spark-submit \
--class <main-class>
--master <master-url> \
--deploy-mode <deploy-mode> \
--conf <key>=<value> \
<application-jar> \
[application-arguments]
命令的参数说明:
--master 指定 Master 的地址,默认为 Local
--class: 应用的启动类 (如:com.havorld.spark.WordCount)
--deploy-mode: 发布驱动到worker节点(cluster) 或者作为一个本地客户端(client);默认为client
--conf: 任意的Spark配置属性,格式为key=value. 如果值包含空格可以加引号"key=value"
application-jar: 打包好的应用jar
application-arguments: 传给 main方法的参数
--executor-memory 1G 指定每个 executor 可用内存为 1G
--total-executor-cores 2 指定每个 executor 使用的 cup 核数为 2 个
spark-submit 详细参数说明
参数名 | 参数说明 |
---|---|
–master | master 的地址,提交任务到哪里执行,例如 spark://host:port, yarn, local |
–deploy-mode | client:在本地启动driver (默认); cluster:在集群上启动driver |
–class | 应用程序的主类,仅针对 java 或 scala 应用 |
–name | 应用程序的名称 |
–jars | 用逗号分隔的本地 jar 包,设置后,这些 jar 将包含在 driver 和 executor 的 classpath 下 |
–packages | 包含在driver 和executor 的 classpath 中的 jar 的 maven 坐标 |
–exclude-packages | 为了避免冲突 而指定不包含的 package |
–repositories | 远程 repository |
–conf PROP=VALUE | 指定 spark 配置属性的值 |
–properties-file | 加载的配置文件,默认为 conf/spark-defaults.conf |
–driver-memory | Driver内存,默认 1G |
–driver-java-options | 传给 driver 的额外的 Java 选项 |
–driver-library-path | 传给 driver 的额外的库路径 |
–driver-class-path | 传给 driver 的额外的类路径 |
–driver-cores | Driver 的核数,默认是1。在 yarn 或者 standalone 下使用 |
–executor-memory | 每个 executor 的内存,默认是1G |
–total-executor-cores | 所有 executor 总共的核数。仅仅在 mesos 或者 standalone 下使用 |
–num-executors | 启动的 executor 数量。默认为2。在 yarn 下使用 |
–executor-core | 每个 executor 的核数。在yarn或者standalone下使用 |
Spark运行模式
执行角色
Driver(驱动器)
Spark Driver是执行开发程序中的主代码(创建 SparkContext、RDD的创建及转化操作等),负责Executor的资源(cpu、内存等)申请、Task调度的进程。Driver主要负责:
- 把用户程序转为任务
- 跟踪 Executor 的运行状况
- 为执行器节点调度任务
- UI 展示应用运行状况
Executor(执行器)
Spark Executor 是一个工作进程,负责Task的具体运行和运行监控,并将Task的运行情况汇报给Driver。Spark 应用启动时,Executor 节点被同时启动,并且始终伴随着整个 Spark 应用的生命周期而存在。如果有 Executor 节点发生了故障或崩溃,出错节点上的任务会被调度到其他 Executor 节点上继续运行。Executor主要负责:
- 负责运行组成 Spark 应用的任务,并将结果返回给驱动器进程;
- 通过自身的块管理器(Block Manager)为用户程序中要求缓存的 RDD 提供内存式存储。RDD 是直接缓存在 Executor 进程内的,因此任务可以在运行时充分利用缓存数据加速运算。
Task(作业任务)
Spark Task具体的任务执行单元,是Executor中的最小数据处理单元。执行具体的数据处理代码。并支持将处理结果输出到磁盘、内存或者外部存储系统中。Task任务间相互独立。
Local模式
Local模式就是运行在一台计算机上,通常就是用于在本机上练手和测试。
Local模式提交命令
./bin/spark-submit \
--class com.havorld.spark.WordCount \
--master local[2] \
/home/hadoop/data/Test.jar
提交输入和输出文件的写法:
- 本地文件:file://
- HDFS文件:hdfs://ip:port
Local模式运行流程
Standalone模式
由Master+Slave构成的Spark集群,Spark运行在集群中。
Standalone模式提交命令
./bin/spark-submit \
–class com.havorld.spark.WordCount \
–master spark://192.168.128.110:7077 \
–executor-memory 4G \
–total-executor-cores 6 \
/home/hadoop/data/Test.jar
Standalone模式运行流程
Standalone模式高可用的配置
YARN模式
Spark客户端直接连接YARN,不需要额外构建Spark集群。Spark YARN模型有yarn-client和yarn-cluster两种模式,主要区别在于Driver程序的运行节点。
yarn-client
Driver程序运行在客户端,Client请求Container完成作业调度执行,Client不能退出。适用于交互、调试、日志在控制台输出方便查看。
yarn-client模式提交命令
./bin/spark-submit \
--class com.havorld.spark.WordCount \
--master yarn \
--deploy-mode client \
/home/hadoop/data/Test.jar
yarn-cluster
Driver程序运行在由ResourceManager启动的ApplicationMaster,Client提交完作业就可以关掉,因为作业运行在YARN上,可以通过yarn logs -applicationIdapplication_id查看日志,一般用于生产环境中。
yarn-cluster 模式提交命令
./bin/spark-submit \
--class com.havorld.spark.WordCount \
--master yarn \
--deploy-mode cluster \
/home/hadoop/data/Test.jar
注意:
在提交任务之前需启动HDFS以及YARN集群
spark-submit提交jar包到yarn上的时候,数据输入和输出的路径必须是HDFS路径,否则将报错 :Input path does not exist
YARN模式运行流程
Mesos模式
Spark 客户端直接连接 Mesos;不需要额外构建 Spark集群。(国内应用较少,大多使用yarn模式来调度)