Spark
1.学习目标
- 了解spark相关背景以及其框架特点
- 掌握搭建spark集群(尤其是高可用集群搭建) (重点)
- 掌握spark应用程序开发以及运行 (重点)
- 掌握Spark框架中的角色 (重点)
2.Spark基础
2.1什么是Spark
- Spark官网:http://spark.apache.org/
- 概念:Spark是统一的分布式大数据分析引擎
- 关键词:
- 统一:Spark能够适应多种计算场景 (离线计算、实时计算、机器学习、图计算、AI应用)。一般公司在进行技术选型过程,spark首选
- 大数据分析引擎:Spark能够分析数据,但是没有存储。一般线上的spark数据来源 (HDFS, Hive、Kafka、Flume、日志文件、关系型数据库、NoSQL数据库)。Spark数据出口(HDFS、Hive、Kafka、Redise、关系型数据库、NoSQL数据库)
- 分布式:Spark一般情况是以集群模式存在。架构 :Master/Slaver(主从结构)
- 应用场景
- 精准广告推荐系统(Spark机器学习,一般在广告或者电商公司应用)
- 金融风险管控系统 (对实时性要求比较,起码毫秒级)
- 精细化运行系统 (CMS系统 、BI系统,重点:多维分析)
- 用户画像 (用户数据画像)
- 关键词:
2.2 Spark特点:
-
速度快
- 典型数据处理流程:Spark在使用过程中,会读取HDFS上数据,并且会将HDFS中数据驻留在内存当中,将数据进行缓存、在后续数据迭代操作过程能够重用内存中的数。在逻辑回归处理(算法)中,Spark的速度要比Hadoop 理论上快100倍
-
Spark对程序员非常友好
- spark支持多种语言(Java、Scala、Python、R、SQL)
-
Spark一站式解决方案
-
五大模块
- SparkCore (处理离线数据)
- SparkSQL (主要用来做多维数据分析、以及交互式查询)
- SparkStreaming (实时数据处理程序)
- Spark MLlib (机器学习 包含非常多算法,相当于Spark提供的一个算法)
- Spark Graphx (图计算处理模块)
在开发Spark应用程序过程中,能够同时使用以上所有模块。以上模块能够无缝兼容
-
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Yemnyn3U-1592718262341)(C:\Users\tp\Desktop\23期scala\spark\spark_day01\资料\spark架构图.png)]
-
-
兼容性
- Spark能够兼容 (hadoop、hive、hbase、yarn、kafka、flume、redise、关系型数据等)
3.Spark集群搭建
-
说明集群环境
- 集群信息:三台虚拟机 系统 Centos6.9 hostname:node-01 node-02 node-03 (需要根据你们自己的机器名称), 保证三台机器互通 ssh
- 规划:主节点 node-01 从节点: node-02 node-03
-
前提条件以及版本信息
- JDK (1.8以上)
- Scala-2.11.8 (Linux 版本)
- Spark-2.2版本
- 安装目录:/home/soft (自定义安装目录)
-
Scala基于Llinux下的安装
-
步骤
-
下载scala安装包(https://www.scala-lang.org/download/2.11.8.html) scala-2.11.8.tgz
-
上传到虚拟机 rz 上传
- rz 路径+软件
-
解压缩 重命名
- tar -zvxf scala-2.11.8.tgz
- mv scala-2.11.8 scala
-
配置环境变量 (etc/profile)
-
vim /etc/profile
-
条件配置
-
export SCALA_HOME=/home/soft/scala
-
export PATH=$PATH:$SCALA_HOME/bin
-
-
生效环境变量文件
source /etc/profile
-
验证scala安装是否成功
scala -version
-
分发到其他节点
scp -r scala root@node-02:/home/soft
scp -r scala root@node-03:/home/soft
scp /etc/profile root@node-02:/etc/
scp /etc/profile root@node-03:/etc/
-
-
-
Spark集群配置
-
步骤
-
下载spark安装软件
- https://archive.apache.org/dist/spark/spark-2.2.0/
-
上传到集群 rz命令
-
解压缩 重命名
-
tar -zvxf spark-2.2.0-bin-hadoop2.7.tgz
-mv spark-2.2.0-bin-hadoop2.7.tg spark
-
配置环境变量以及spark的配置文件
-
环境变量
vim /etc/profile
export SPARK_HOME=/home/soft/spark
export PATH=$PATH:$SPARK_HOME/sbin:$SPARK_HOME/bin
-
spark配置文件
-
cd spark/conf cp spark-env.sh.template spark-env.sh vim spark-env.sh export JAVA_HOME=${JAVA_HOME} export SCALA_HOME=${SCALA_HOME} export SPARK_MASTER_HOST=主节点名称 export SPARK_MASTER_PORT=服务端口号 vim slaves node02 node03
-
-
-
分发spark软件以及配置文件到其他节点
scp -r spark root@node-03:/home/soft
scp -r spark root@node-02:/home/soft
scp /etc/profile root@node-02:/etc/
scp /etc/profile root@node-03:/etc/
-
-
4. Spark集群启动
- 进入spark/sbin
- 第一种启动方式
-sbin/start-all.sh
-sbin/stop-all.sh
- 第二种启动方式
sbin/start-master.sh
sbin/start-slavers.sh
- 第一种启动方式
5.Spark masterUI界面
-
四大部分
6.配置Spark高可用集群(HA)
-
配置多个master节点,其中一个节点状态alive 其他节点状态 standby
-
需要依赖于zookeeper
-
配置步骤:
-
env 注释掉 #export SPARK_MASTER_HOST export SPARK_DAEMON_JAVA_OPTS="-Dspark.deploy.recoveryMode=ZOOKEEPER -Dspark.deploy.zookeeper. url=node-01:2181,node-02:2181,node-03:2181 -Dspark.deploy.zookeeper.dir=/spark" spark.deploy.recoveryMode:恢复模式,基于zookeeper进行恢复 spark.deploy.zookeeper.url:zookeeper地址 spark.deploy.zookeeper.dir:spark状态存放在zookeeper中路径
-
-
启动
- 启动zookeeper集群
- zkServer.sh start
- zkServer.sh status
- 第二步 在任意配置的zookeeper.url中选取一个节点启动master,然后在任意选取一个启动master
- 其中一个master alive状态 另外一个master standby状态
-
线上:保守3个master 最好是单数
7.Spark应用程序的运行模式
-
spark应用程序想要运行需要资源(CPU和内存 网络资源)。spark支持多种获取资源的方式。spark根据获取资源方式的不同,就具备不同的运行模式。
-
不同的运行模式
-
local[N] :通过本机启动线程的方式,来模拟spark的并行计算。N可以是具体的数字 ,N可以是* :*代表的是机器的cpu核数 (学习)
-
./bin/spark-submit \ //用来提交应用程序的脚本 --class org.apache.spark.examples.SparkPi \ 指定spark应用程序的入口 --master local[8] \ //指定资源的获取方式 /spark/examples/jars/spark-examples_2.11-2.2.0.jar \ //应用程序jar 100 //应用程序初始化参数
-
-
standalone:标准模式,以spark集群模式提交应用程序。standalone模式 是向spark的master进程去获取资源 (集群测试+学习)
-
./bin/spark-submit \ --class org.apache.spark.examples.SparkPi \ --master spark://node-01:7077,node-02:7077 \ //向spark的master节点申请资源 --executor-memory 20G \ //spark应用程序运行时需要的内存 --total-executor-cores 100 \ //spark应用程序运行时需要的cpu核数 /spark/examples/jars/spark-examples_2.11-2.2.0.jar \ 1000 限制集群资源参数: executor-memory total-executor-cores 如果不指定参数,spark应用程序默认会占用整个集群的所有资源。不能够对外进行服务。 结论:集群高可用在切换master节点时候,不影响spark应用程序的运行。 原因:master只是负责资源的分配调度管理,并不提供计算资源。实际上真正的资源提供者是worker。
-
-
yarn:spark以集群模式提交应用程序,向yarn申请资源(ResourceManager进程申请资源)。线上运行都是以这种模式。(生产环境下边的运行模式)
-
步骤:
-
第一步: spark-env.sh 中配置 HADOOP_CONF_DIR 第二步: ./bin/spark-submit --class org.apache.spark.examples.SparkPi \ --master yarn \ //向yarn申请资源 --deploy-mode cluster \ //部署模式 以集群模式 /home/soft/spark/examples/jars/spark-examples_2.11-2.2.0.jar \ 1000 注意:虚拟机时间需要同步
-
-
-
8.Spark应用程序开发
8.1spark-shell开发
-
spark-shell初始化操作
- Spark context Web UI:Spark Job任务的管理界面
- Spark context :初始化SparkContext对象 名称 sc (SparkContext对象是spark应用程序的入口对象)
- master = local[*]:默认情况下spark-shell 向本地机器获取资源
- app id = local-1557469470546。 每个spark应用程序都会产生一个appid
- Spark session:一次回话对象,可以使用sparksession 调用SparkSQL
-
spark-shell 以standalone模式启动
./spark-shell --master spark://node-01:7077
- 由于spark在spark-env.sh配置了 HADOOP_CONF_DIR 路径,那么spark-shell 读取数据默认的都是hdfs之上数据
9.Spark中重要角色
-
按照提供资源分配
-
ClusterManger:集群资源管理器,会接受SparkContext发送来指令(申请资源),然后向workerNode节点发送指令分配资源
- standalone模式: spark的master节点
- yarn模式:ResourceManage
-
WorkerNode:提供Spark应用程序运行时所需要的资源 (CPU和内存)。Workernode 在接受到clusterManger的指令后,会汇报worker的信息。
以上节点完成了Spark应用程序运行时所需要的资源
资源分配方式:
- 静态分配:一次性费配资源,在整个spark应用程序运行过程中,不会再次分配资源
- standalone:属于静态分配
- 动态分配:在整个spark应用程序运行过程中,需要多少给多少,需要多次分配资源,一旦资源使用完成,会进行回收,再次需要的时候会再次申请资源
- yarn:动态分配
- 静态分配:一次性费配资源,在整个spark应用程序运行过程中,不会再次分配资源
-
-
按照程序运行的方式分配
-
Driver Programe: main +sparkcontext。 一般运行在Diver节点(可以是一台机器)
- Driver节点可有与spark 集群分离。一般情况下Driver节点其实就是Spark集群中的某台机器。这样做是为了节省网络资源。因为在这个Spark应用程序运行过程中,会不断与Spark集群进行信息传递。
- Spark-submit 把程序提交到yarn集群,yarn会根据集群资源状况,分配一个driver,然后spark程序会将jar上传到yarn,通过yarn去执行。
- standalone:master节点就可以作为driver节点
-
Sparkcontext:是spark程序的入口对象。并且还是Spark应用程序的核心调度对象。在SparkContext对象初始化过程中,初始化了三个重要调度对象:高层调度器 DAGScheduler 底层调度 TaskScheduler SchedulerBackend 负责通信
-
Executor:运行在worker节点的一个进程。在Eecutor进程中,启动线程池运行Task。通过线程并发执行和以及线程复用的形式执行Task
-
Task:是数据处理任务最小单元,整个Spark应用程序最终会被划分成不同的Task,去运行处理数据。
-
cache:缓存,主要缓存RDD中数据的, 可以缓存到内存也可以缓存到磁盘,还可以缓存HDFS之上。
以上角色 就完成了整个Spark Job的调度
-