Spark是一种快速、通用、可扩展的大数据分析引擎,2009年诞生于加州大学伯克利分校AMPLab,2010年开源,2013年6月成为Apache孵化项目,2014年2月成为Apache的顶级项目,2014年5月发布spark1.0,2016年7月发布spark2.0,2020年6月18日发布spark3.0.0
Speed:快速高效
Hadoop的MapReduce作为第一代分布式大数据计算引擎,在设计之初,受当时计算机硬件条件所限(内存、磁盘、cpu等),为了能够计算海量数据,需要将中间结果保存到HDFS中,那么就要频繁读写HDFS从而使得网络IO和磁盘IO成为性能瓶颈。Spark可以将中间结果写到本地磁盘或将中间cache到内存中,节省了大量的网络IO和磁盘IO开销。并且Spark使用更先进的DAG任务调度思想,可以将多个计算逻辑构建成一个有向无环图,并且还会将DAG先进行优化后再生成物理执行计划,同时 Spark也支持数据缓存在内存中的计算。性能比Hadoop MapReduce快100倍。即便是不将数据cache到内存中,其速度也是MapReduce10 倍以上。
Spark支持 Java、Scala、Python和R等编程语言编写应用程序,大大降低了使用者的门槛。自带了80多个高等级操作算子,并且允许在Scala,Python,R 的使用命令进行交互式运行,可以非常方便的在Spark Shell中地编写spark程序。
Spark提供了统一的大数据处理解决方案,非常具有吸引力,毕竟任何公司都想用统一的平台去处理遇到的问题,减少开发和维护的人力成本和部署平台的物力成本。 同时Spark还支持SQL,大大降低了大数据开发者的使用门槛,同时提供了SparkStream和Structed Streaming可以处理实时流数据;MLlib机器学习库,提供机器学习相关的统计、分类、回归等领域的多种算法实现。其高度封装的API 接口大大降低了用户的学习成本;Spark GraghX提供分布式图计算处理能力;PySpark支持Python编写Spark程序;SparkR支持R语言编写Spark程序。
Runs Everywhere:可以运行在各种资源调度框架和读写多种数据源
Spark支持的多种部署方案:Standalone是Spark自带的资源调度模式;Spark可以运行在Hadoop的YARN上面;Spark 可以运行在Mesos上(Mesos是一个类似于YARN的资源调度框架);Spark还可以Kubernetes实现容器化的资源调度
丰富的数据源支持。Spark除了可以访问操作系统自身的本地文件系统和HDFS之外,还可以访问 Cassandra、HBase、Hive、Alluxio(Tachyon)以及任何 Hadoop兼容的数据源。这极大地方便了已经 的大数据系统进行顺利迁移到Spark。
框架 优点 缺点
MapReduce 历史悠久、稳定 编程API不灵活、速度慢、只能做离线计算
Spark 通用、编程API简洁、快 跟MapReduce比暂无缺点
面试题:MapReduce和Spark的本质区别:
1.MR只能做离线计算,如果实现复杂计算逻辑,一个MR搞不定,就需要将多个MR按照先后顺序连成一串,一个MR计算完成后会将计算结果写入到HDFS中,下一个MR将上一个MR的输出作为输入,这样就要频繁读写HDFS,网络IO和磁盘IO会成为性能瓶颈。从而导致效率低下。
2.既可以做离线计算,有可以做实时计算,提供了抽象的数据集(RDD、Dataset、DataFrame、DStream)
有高度封装的API,算子丰富,并且使用了更先进的DAG有向无环图调度思想,可以对执行计划优化后在执行,并且可以数据可以cache到内存中进行复用。
注意:MR和Spark在Shuffle时数据都落本地磁盘
2020年6月18日,开发了近两年(自2018年10月份至今)的Apache Spark 3.0.0 正式发布,
Apache Spark 3.0.0版本解决并修复了包含3400多个补丁,是开源社区做出巨大贡献的结晶,在Python和SQL功能方面带来了重大进展并且将重点聚焦在了开发和生产的易用性上。同时,今年也是Spark开源10周年,这些举措反映了Spark自开源以来,是如何不断的满足更广泛的受众需求以及更多的应用场景。
spark3.0新特性介绍连接:https://spark.apache.org/releases/spark-release-3-0-0.html
重点:改进的Spark SQL引擎
即使由于缺乏或者不准确的数据统计信息和对成本的错误估算导致生成的初始计划不理想,但是自适应查询执行(Adaptive Query Execution)通过在运行时对查询执行计划进行优化,允许Spark Planner在运行时执行可选的执行计划,这些计划将基于运行时统计数据进行优化,从而提升性能。
动态合并shuffle partitions
动态调整join策略
动态优化倾斜的join
动态分区裁剪
ANSI SQL兼容性
Join hints
standalone client模式
standalone cluster模式
Spark On YARN cluster模式
Spark执行流程简介
Job:RDD每一个行动操作都会生成一个或者多个调度阶段 调度阶段(Stage):每个Job都会根据依赖关系,以Shuffle过程作为划分,分为Shuffle Map Stage和Result Stage。每个Stage对应一个TaskSet,一个Task中包含多Task,TaskSet的数量与该阶段最后一个RDD的分区数相同。
Task:分发到Executor上的工作任务,是Spark的最小执行单元
DAGScheduler:DAGScheduler是将DAG根据宽依赖将切分Stage,负责划分调度阶段并Stage转成TaskSet提交给TaskScheduler
TaskScheduler:TaskScheduler是将Task调度到Worker下的Exexcutor进程,然后丢入到Executor的线程池的中进行执行
Spark中重要角色
Master :是一个Java进程,接收Worker的注册信息和心跳、移除异常超时的Worker、接收客户端提交的任务、负责资源调度、命令Worker启动Executor。
Worker :是一个Java进程,负责管理当前节点的资源管理,向Master注册并定期发送心跳,负责启动Executor、并监控Executor的状态。
SparkSubmit :是一个Java进程,负责向Master提交任务。
Driver :是很多类的统称,可以认为SparkContext就是Driver,client模式Driver运行在SparkSubmit进程中,cluster模式单独运行在一个进程中,负责将用户编写的代码转成Tasks,然后调度到Executor中执行,并监控Task的状态和执行进度。
Executor :是一个Java进程,负责执行Driver端生成的Task,将Task放入线程中运行。
Spark和Yarn角色对比
1架构说明(standalone模式)
standalone模式是Spark自带的分布式集群模式,不依赖其他的资源调度框架
2搭建步骤
① 下载spark安装包,下载地址:https://spark.apache.org/downloads.html
② 上传spark安装包到Linux服务器上
③ 解压spark安装包
tar -zxvf spark-3.0.0-bin-hadoop3.2.tgz -C /bigdata/
④ 进入到spark按照包目录并将conf目录下的spark-env.sh.template重命名为spark-env.sh,再修改
export JAVA_HOME=/opt/apps/jdk1.8.0_251/
export SPARK_MASTER_HOST=linux01
⑤ 将conf目录下的slaves.template重命名为slaves并修改,指定Worker的所在节点
linux01
linux02
linux03
⑥ 将配置好的spark拷贝到其他节点
for i in {2..3}; do scp -r spark-3.0.0-bin-hadoop3.2 linux0$i:$PWD; done
3启动Spark集群
① 在Spark的安装目录执行启动脚本
sbin/start-all.sh
② 执行jps命令查看Java进程
jps
在ndoe-1上可用看见Master进程,在其他的节点上可用看见到Worker
③ 访问Master的web管理界面,端口8080
4spark-env.sh中可以设置一些重要参数
export SPARK_WORKER_CORES =8 #指定worker可用的逻辑核数,逻辑核数一般为实际核数的两倍最佳
export SPARK_WORKER_MEMORY=2g #指定worker可用的内存大小
5standalone模式高可用部署
spark的standalone模式可用启动两个以上的Master,但是需要依赖zookeeper进行协调,所有的节点启动后,都想zk注册
export SPARK_DAEMON_JAVA_OPTS="-Dspark.deploy.recoveryMode=ZOOKEEPER -Dspark.deploy.zookeeper.url=node-1.51doit.com:2181,node-2.51doit.com:2181,node-3.51doit.com:2181 -Dspark.deploy.zookeeper.dir=/spark"
什么是Spark Shell
spark shell是spark中的交互式命令行客户端,可以在spark shell中使用scala编写spark程序,启动后默认已经创建了SparkContext,别名为sc
启动Spark Shell
/bin/spark-shell --master spark://linux01:7077 --executor-memory 1g --total-executor-cores 12
启动shell客户端之后,就会在每个节点上都生成一个Executor,每个Executor分配的资源就是我们输入登录命令时所设置的大小
参数说明:
–master 指定masterd地址和端口,协议为spark://,端口是RPC的通信端口(不指定master就会在本地运行spark,不会进入到集群中)
–executor-memory 指定每一个executor的使用的内存大小(不指定内存大小,就默认分配1g)
–total-executor-cores指定整个application总共使用了cores(不指定cores,就默认将所有的cores都分配给它)
在shell中编写第一个spark程序
sc.textFile("hdfs://linux01:8020/words.txt").flatMap(_.split("\\s+")).map((_,1)).reduceByKey(_+_).sortBy(_._2,false).saveAsTextFile("hdfs://linux01:8020/out")