Spark
Spark
Spark是什么
-
Apache Spark™ is a multi-language engine for executing data engineering, data science, and machine learning on single-node machines or clusters.
-
Spark是一个支持多语言的数据计算,科学计算,机器学习引擎(框架),同时支持单节点或者集群运行模式。
-
功能强大:
- 批处理
- 结构化的SQL计算
- 流式计算
- 机器学习库
- 图计算
-
特点
-
Simple
Spark提供了简便的编程API,使数据开发的编码量大大缩减(相比较MR等其他计算框架)。 -
Fast
Spark支持纯内存运算,将DAG的处理过程全部使用内存进行缓存,不需要在计算过程中产生磁盘IO,大大的提高了计算效率。 -
Scalable
Spark支持Scala、Java、SQL、Python、R多种语言开发,应用开发支持上述所有语言,框架开发支持Scala、Java。 -
Unified
Spark提供了批、流、结构化、机器学习等各种类型的计算功能。
-
集群搭建
1. Spark集群的运行模式
-
local 本地模式 (单机模式)
通常用于小规模数据统计或者Spark任务的IDEA开发 -
standalone 独立集群模式
Spark提供了Master-Worker的主从架构集群,可以通过启动集群角色搭建独立集群 -
其他资源管理服务
Spark支持将Spark任务提交给其他的资源管理组件进行任务调度 例如YARN、Mesos、K8s
搭建Standalone Spark集群
-
关于版本
- 重要版本: 1.6.3
- 企业中常见版本: 2.1.x 2.4.x
- 最新版: 3.2.0 3.1.2
-
下载解压安装包
-
修改配置文件
-
可选:
删除cmd命令
修改启动和关闭集群的命令 ,不要使用start-all和stop-all -
spark-env.sh
-
# 配置hadoop集群的配置文件目录
# 目的是让Spark可以读取到HDFS数据
HADOOP_CONF_DIR=/opt/hadoop-2.7.7/etc/hadoop
# 配置Spark集群主节点的主机名和端口
SPARK_MASTER_HOST=host02
# Spark任务提交时的服务端口
SPARK_MASTER_PORT=7077
# SparkMaster WebUI 端口
SPARK_MASTER_WEBUI_PORT=8080
# 配置Java home
JAVA_HOME=/opt/jdk1.8
- spark-defaults.conf
# 配置Spark相关配置
# master节点的配置
spark.master spark://host02:7077
- workers
host01
host02
host03
-
分发安装包
-
配置环境变量
echo 'export SPARK_HOME=/opt/spark-3.1.2' >> /etc/profile
echo 'export PATH=$SPARK_HOME/bin:$SPARK_HOME/sbin:$PATH' >> /etc/profile
source /etc/profile
- 启动集群
start-spark-all.sh
----host01的JVM进程----
11684 Worker
----host02的JVM进程----
120542 Master
120638 Worker
----host03的JVM进程----
46213 Worker
- 访问SparkMaster界面
http://host02:8080/
Spark操作
1. Spark-shell
Spark-shell是一个类似Scala解释器的命令行工具,用于方便开发者直接在命令行进行Spark程序的开发和测试
2. Spark IDEA开发
RDD
-
是什么:
RDD 弹性分布式数据集
是spark中的基本数据抽象- 数据抽象
Spark预先为RDD这种数据结构设计了近百种算子操作,开发者只需要在处理数据时将数据加载到RDD中,就可以直接使用预置的算子进行各种运算
- 数据抽象
-
RDD的重要特征
-
A list of partitions
RDD是一个包含多个分区的列表 -
A function for computing each split
RDD会将算子(函数)操作并发的执行在每一个分区上(分片) -
A list of dependencies on other RDDs
RDD会记录与上游RDD的依赖列表 -
Optionally, a Partitioner for key-value RDDs (e.g. to say that the RDD is hash-partitioned)
对于二元组作为泛型的RDD[(K,V)],可以自定义分区器进行数据的重新分区,Spark默认提供了HashPatitioner和RangePartitioner -
Optionally, a list of preferred locations to compute each split on (e.g. block locations for an HDFS file)
Spark会根据数据所在位置优先本地运算,避免网络IO -
弹性
Spark允许在RDD的计算过程中随时调整RDD的分区个数
Spark会为RDD的每个分区单独启动一个Task(线程)进行并行运算
可以在元素数量较多时或者计算逻辑较为复杂时增加并发度(增加分区数)提高计算效率,也可以在进行聚合、去重之类操作后缩减分区个数(并发度)节省计算资源 -
只读
RDD由于需要记录上游RDD的依赖,所以设计成只读结构,每次RDD的transformation操作都会产生新的RDD,而不是在原有RDD中修改数据 -
持久化
RDD如果计算步骤过多,DAG中会出现频繁重试的节点(RDD),可以对相应的RDD进行持久化,目的是简化依赖链条 -
懒执行
RDD依赖中如果最终没有调用任何action算子,则整个依赖不真正执行
-