目录
1、发展历程
DataBricks官网:https://databricks.com/spark/about
spark的诞生其实是因为MR计算引擎太慢了。
MR计算是基于磁盘的,Spark计算是基于内存的。
spark的发展历程:
2009年,Spark诞生于伯克利AMPLab,伯克利大学的研究性项目。
2014年2月成为Apache顶级项目,同年5月发布Spark 1.0正式版本
2018年Spark2.4.0发布,成为全球最大的开源项目,目前是Apache中的顶级项目之一。
2020年6月Spark发布3.0.0正式版,目前学习的就是3.x
定义:基于内存式计算的分布式的统一化的数据分析引擎。
分析引擎:hive 、spark、presto、impala 等。所谓的引擎,狭义理解就是sql。
2、Spark能做什么?
实现离线数据批处理:类似于MapReduce、Pandas,写代码做处理:代码类的离线数据处理 。
实现交互式即时数据查询:类似于Hive、Presto、Impala,使 用SQL做即席查询分析:SQL类的离线数据处理
实现实时数据处理:类似于Storm、Flink实现分布式的实时计算:代码类实时计算或者SQL类的实时计算
实现机器学习的开发:代替传统一些机器学习工具
3、spark有哪些部分组成?
Hadoop的组成部分:common、MapReduce、Hdfs、Yarn
Spark Core:Spark最核心的模块,可以基于多种语言实现代码类的离线开发 【类似于MR】
Spark SQL:类似于Hive,基于SQL进行开发,SQL会转换为SparkCore离线程序 【类似Hive】
Spark Streaming:基于SparkCore之上构建了准实时的计算模块 【淘汰了】
Struct Streaming:基于SparkSQL之上构建了结构化实时计算模块 【替代了Spark Streaming】
Spark ML lib:机器学习算法库,提供各种机器学习算法工具,可以基于SparkCore或者SparkSQL实现开发。
开发语言:Python、SQL、Scala、Java、R【Spark的源码是通过Scala语言开发的】
一个软件是什么语言写的,跟什么语言可以操作这个软件是两回事儿。
Scala 语言是基于java实现的,底层也需要虚拟机。
4、各大计算引擎的对比
Impala:集成Hive实现数据分析,优点是性能最好,缺点数据接口比较少,只支持Hive和Hbase数据源 。 是一个基于CDH的一个软件,Impala 能写sql,它写出来的sql,叫 Impala SQL (大部分跟我们普通的sql没啥区别) ,操作hive或者hbase 速度非常快!
Presto:集成Hive实现数据分析,优点性能适中,支持数据源非常广泛,与大数据接口兼容性比较差 。Presto也可以写sql,只是写的sql叫做 Presto SQL (大部分跟我们普通的sql没啥区别) ,特点:可以跨数据源。比如mysql的表可以和oracle中的一个表关联查询。
SparkSQL:集成Hive实现数据分析,优点功能非常全面、开发接口多,学习成本低,缺点实时计算不够完善。实时计算交给了Flink。
简单粗暴的理解:Impala和Presto 都可以进行大数据分析,但是数据量达到一定级别,就不太行,还得是SparkSQL。
5、spark的应用
spark可以做数仓,数仓中也可以分层。
离线场景:实现离线数据仓库中的数据清洗、数据分析、即席查询等应用
实时场景:实现实时数据流数据处理,相对而言功能和性能不是特别的完善,工作中建议使用Flink替代。
即席查询:即席查询类似于即兴发挥。普通查询类似于带着稿子发言。不管是普通查询还是即席查询,写的sql语句都是一样的,只是一个sql语句是固定的,写死的,类似于存储过程。用户自己随即查询的sql语句就是即席查询。
6、spark运行有五种模式【重点】
本地模式:Local:一般用于做测试,验证代码逻辑,不是分布式运行,只会启动1个进程来运行所有任务。
集群模式:Cluster:一般用于生产环境,用于实现PySpark程序的分布式的运行
Standalone:Spark自带的分布式资源平台,功能类似于YARN
YARN:Spark on YARN,将Spark程序提交给YARN来运行,工作中主要使用的模式
Mesos:类似于YARN,国外见得多,国内基本见不到
K8s:基于分布式容器的资源管理平台,运维层面的工具。
解释:Spark是一个分布式的分析引擎,所以它部署的时候是分布式的,有用主节点,从节点这些内容。Standalone使用的是Spark自带的分布式资源平台,但是假如一个公司已经有Yarn分析平台了,就没必要再搭建spark分析平台,浪费资源。
学习过程中:本地模式 --> Standalone --> YARN ,将来spark在yarn上跑。
7、Spark分布式计算的步骤
Spark的计算流程:
内存:存储数据的,内存的读写速度快,内存会清空
磁盘:存储数据的,读写速度慢,不会清空
RDD: 弹性分布式数据集
举例说明:
比如现在有一个list列表,中间要求每一个数的平方,使用python 如何写?
RDD: 弹性分布式数据集
举例说明:
比如现在有一个list列表,中间要求每一个数的平方,使用python 如何写?
第一步:读取数据
python_list: List[int] = [1,2,3,4,5,6]
第二步:进行转换
def compute(list1):
rs_list = []
for i in list1:
rs_list.append(i**2)
return rs_list
rs_list = compute(list1)
第三步:打印到控制台。
整个流程是一个串行的过程。
以下是Spark的计算过程:假如你想使用多台电脑同时计算这个数据集,可以使用spark
1、Spark读取数据会将数据拆分成多份,每一份叫做一个分区,整体叫做一个RDD,一个RDD对应着多个分区
spark_rdd:RDD[int] = [1,2,3,4,5,6]
这个数据集会被三台电脑读取:
part0:bigdata01:1 2
part1:bigdata02:3 4
part2:bigdata03:5 6
2、利用算子进行数据的计算
# map用于取出RDD中每个元素,对每个元素调用一次 lambda表达式
rs_rdd = spark_rdd.map(lambda x: x**2)
底层原理:
part0:node1:1 2 => Task0 => part0:node1:1 4
part1:node2:3 4 => Task1 => part1:node2:9 16
part2:node3:5 6 => Task2 => part2:node3:25 36
3、保存数据
实现:将每个Task计算的结果进行输出保存 part0:
part0: node1:1 2 => Task0 => part0:node1:1 4 -> part-00000
part1:node2:3 4 => Task1 => part1:node2:9 16 ->part-00001
part2:node3:5 6 => Task2 => part2:node3:25 36 ->part-00002