一、
大数据实现:存储 、 传输 、 分析。spark是用最流行的分布式计算引擎
八卦
腾讯有8000多个节点的spark集群,是世界最大的
二、特点
- 快速、通用、可扩展、集群的计算引擎,是apache的开源项目,有全职的维护人员和贡献者。
1. 快速:
基于内存
mr是进程级别,而spark的task是线程级别
2. 易用
封装好的算子,函数式编程只关心输入和输出
支持4种编程语言和sql
python和R对某些特性支持的不好
支持scala和python的repl交互执行环境,可以非常方便的来验证思路。而不需要打包+上传+执行,对于原型开发很有用。
3. 通用
{1} 可用在通用的平台上,比如yarn、masos
集群管理器
hadoop2.0后把yarn独立出来,用来调度资源。spark计算肯定也需要资源,spark既有自己的独立调度器(standalone),也可以使用别的通用的集群管理器。比如yarn,masos。
standalone只能给spark自己用,效率其实更高。需要在每个节点都装spark 并且 需要专门给spark配1个集群。用yarn的话可以和现有的集群整合。
{2} 4个通用模块,可以这些模块上建立应用
4. 可扩展
非常方便的同其他开源产品融合,比如hive、hdfs。hive可以换引擎。
可以直接操作csv、json、gz等
**spark几个抽象的理解**
三、core
是个项目,实现了spark的基本功能:包括任务调度、内存管理、错误恢复、与存储系统读写、rdd的实现。其他4个模块都是在此之上的封装。
1. RDD
RDD是spark最核心的概念,学spark就是学RDD。
{1} RDD是处理分布式数据的逻辑的抽象,为啥非要用RDD呢?因为分布式数据的处理逻辑不仅仅包含业务逻辑,还不得不包括如下方面:
- 为了实现计算向数据移动:需要获取分区的位置,也就是需要有一个容器来存分区的位置,这样发送task时才能有的放矢。
对应RDD的分区列表和计算最优发送分区列表 - 容错:
- 需要有个属性记录血缘lineage,遇到分区丢失、节点丢失时如何处理?
- 需要有个函数记录自己是如何从父RDD获取的
对应计算函数和血缘列表
- 优化:窄依赖之间以pipeline方式运行,宽依赖之间的shuffle如何优化?
- 资源调度、任务分配
- 提取通用业务逻辑封装为方法、函数
以上5个方面,如果让开发者自己写。不现实,而RDD这个抽象(对象)把上面这些都给做了,开发者只需要关心业务,并且使用封装好的算子来实现业务,大大的降低了开发者的工作量。
再重复一遍:RDD就是driver端用来处理分布式数据的处理逻辑。此处有一点疑问,都说RDD不存数据是处理逻辑,集合存数据,但集合也不是直接存数据的,而且集合里面也有算子(方法),只不过没RDD复杂而已。普通的集合没有考虑并发,要串行执行。但个人认为本质是一样的。而且从RDD的名字来看,本身就是数据集==》
所以我个人理解,RDD就是分布式数据的容器,说它存数据并没有问题。RDD是操作分布式数据的入口、工具,可以通过RDD来操作分布式大数据。
RDD最顶级的抽象是个抽象类,有很多子类,不同的算子会生成不同的子类。
在driver端编写
由sc创建
{2} RDD的不变性
不变有很多好处:
- 线程安全
2. sparkContext、sparkSession
顾名思义,用来配置环境(上下文),啥环境呢?就是当前spark app的计算环境,包括资源申请、创建RDD处理逻辑、封装RDD逻辑为task、发送task、获取结果。相当于一个乙方的项目经理,协调甲方和自己手下的兵。rdd就是兵。spark app的任何操作都是通过sc和sc下面的rdd
四、sparksql
1. 操作结构化和半结构化数据,也就是行和列的数据表。说明这些列和列类型的一些规则被称为模式(schema)。
不仅仅是hive表的,parquet、csv的都可以,这些数据自带schema表结构。统一用df对象抽象,是对RDD的封装,df可以直接转为RDD,但RDD转df需要提供schema也就是StructType对象。
sparkSession也可以直接读取没有schema的text文件,通过sparkSession.read.text(),但获取的df把一行全放到一列中且名字默认为value
![](https://i-blog.csdnimg.cn/blog_migrate/9917ccb356eaf610e3cf267cde487adc.png)
![](https://i-blog.csdnimg.cn/blog_migrate/8685e018944d6de7555a1a477ab24612.png)
{1} 结构化意味着每行数据有共性,可以用schema(StructType)描述,可以用sql,rdd能做的df都能做。
其实说白了,就是可以用列来管理这些数据。注意,是列,不是属性。df中也有结构,结构中也有列,列也有类型,但跟类和类的属性不是一回事,结构中的列并不像类的属性那样灵活,受hive表中列属性的节制,只能有有限的几种,在sparksql的DataTypes类中可以查看,就那么几种。
Spark运行模式(master)
1. local
用来测试,因为在yarn上是jar直接运行,不能debug
windows + local搭建
因为在windows idea中运行spark local模式时报
猜测即使是spark的local模式,也是需要配hadoop的,需要在windows本地安装一个hadoop提供hadoop的依赖。这也是官网上为啥会提供spark-hadoop安装包的原因
2. standalone
顾名思义,独立,只有spark,没有别的资源调度器参与
3. yarn
4. 其他masos
Driver
2个线程
java程序都需要从main()开始执行,spark app也需要从main()开始执行,这个main就是Driver类的main()。既然是入口,那肯定要做一些环境搭建、准备的工作,包括:创建sc、RDD、rdd逻辑的编写、结果处理。driver启动spark app开始启动,spark app结束driver就结束。
sparkshell启动时会自动创建并启动一个driver,里面把sc和spark(sparkSession)都创建好了。
将用户代码转为job,将job转为task
将task分发给Executor执行
跟踪执行情况
sparkUI就是在driver端的一个web项目,所以sparkUI要访问driver所在的节点,
Executor
工作节点上的用来执行task的进程
跟driver心跳、交互
运行task
通过BloclManager为缓存的RDD的分区提供内存式存储
RDD的分区是直接缓存在Executor节点的内存中,