Spark进阶3
Spark
1.spark资源调度分析
- 3大结论
- 在默认情况下(在提交任务的时候没有设置–executor-cores选项),每一个Worker为当前的Application启动一个Executor,这个executor会使用这个Worker的所有cores和1G内存
- 如果没有设置–total-executor-cores,则集群默认将剩余所有的(cores)核数全部分配给application
- spreadOut :true(默认),分散启动
2.spark任务调度分析
- 任务调度可以从Action算子开始,因为Action算子会触发一个job
- 划分stage,以taskset的形式提交任务.DAGSchedule类中getMessingParentStages()方法切割job划分stage
3.sparkSQL
- shark
- 是基于spark计算框架之上且兼容Hive语法的SQL执行引擎.
- Shark底层依赖于Hive的解析器,但对Hive的依赖太大很难长远发展,所以发展出了SparkSQL
- sparkSQL
- shark是它的前身,是parkSQL完全脱离了HIVE的限制
- sparkSQL支持查询原生的RDD,(RDD是spark的核心概念,是spark能够高效的处理大数据的各种场景的基础)
- 能够在java.scala中写sql语句,支持简单的SQL语法检查,能够在scala中写hive语句,访问hive,并将结果取回做为RDD使用
- shark是它的前身,是parkSQL完全脱离了HIVE的限制
- Spark on Hive & Hive on Spark
- spark on hive
- Hive只作为储存角色,Spark负责sql优化,执行
- Hive on Spark
- Hive即作为存储角色又负责sql优化.spark负责执行
- spark on hive
- Dataset&DataFrame
- Dataset是一个分布式数据容器
- 底层封装的是RDD,当RDD的泛型是Row类型的时候,我们也可以称它为DateFrame.(Dataset=DataFrame)
- schema:掌握数据的结构信息
- Dataset=RDD+schema
- spark数据源
- 可以是JSON格式的字符串,JDBC,parquent,Hive,HDFS
- spark底层架构
- 解析计划—>逻辑计划—>优化后的逻辑计划—>物理计划—>转换成spark任务执行
- 谓词下推(predicate Pushdown)
4.创建Dataset的几种方式
- 读取json文件创建dataset
- 通过json格式的RDD创建dataset
- 读取parquet文件创建Dataset
- 非json格式的RDD创建dataset
- 反射.将非json格式的RDD转换成Dataset
- 动态创建.动态创建Schema将非json格式的RDD转换成Dataset
- 读取JDBC中的数据创建Dataset(MySql为例)
- 读取Hive中的数据加载成Dataset
5.行存储与列存储
-
如图行存储下每一张表的数据都是放在一起的,但列存储下被分开保存了.
-
数据写入上进行比较
- 行存储的写入是一次性的,可以保证写入过程的成功或失败,数据的完整性
- 列存储的写入由于需要将一行记录分拆成单列保存,所以写入次数会比行存储多,
- 数据修改也是一种写入,行存储在指定的位置上写入一次,列存储需要定位多个列,分别写入,时间明显较长
-
数据读取上进行比较
- 读取数据时,行存储通常会将数据全部读取出来,如果只需要其中几列,就会存在冗余列,消除冗余列的过程通常在内存中进行
- 列存储每次读取的数据是集合的一段或者全部,不存在冗余性问题
-
数据分析上进行比较
- 行存储因为在一行记录中保存了多种类型的数据,数据解析需要在多种数据类型之间频繁转换,这个操作很消耗CPU,增加了解析的时间
- 列存储每一列数据的类型是同性质的,方便解析
-
优缺点
- 行存储的写入是一次性完成,消耗的时间比列存储少,并且能够保证数据的完整性,缺点是数据读取过程中会产生冗余数据,如果只有少量数据,此影响可以忽略;数量大可能会影响到数据的处理效率
- 列存储在写入效率、保证数据完整性上都不如行存储,它的优势是在读取过程,不会产生冗余数据,这对数据完整性要求不高的大数据处理领域,比如互联网,犹为重要
-
最后总结如下
- 传统行式数据库的特性如下
- 数据是按行存储的
- 没有索引的查询使用大量I/O。比如一般的数据库表都会建立索引,通过索引加快查询效率
- 建立索引和物化视图需要花费大量的时间和资源
- 面对查询需求,数据库必须被大量膨胀才能满足需求
- 列式数据库的特性如下
- 数据按列存储,即每一列单独存放
- 数据即索引
- 只访问查询涉及的列,可以大量降低系统I/O
- 每一列由一个线程来处理,即查询的并发处理性能高
- 数据类型一致,数据特征相似,可以高效压缩。比如有增量压缩、前缀压缩算法都是基于列存储的类型定制的,所以可以大幅度提高压缩比,有利于存储和网络输出数据带宽的消耗
- 传统行式数据库的特性如下
理,即查询的并发处理性能高
+ 数据类型一致,数据特征相似,可以高效压缩。比如有增量压缩、前缀压缩算法都是基于列存储的类型定制的,所以可以大幅度提高压缩比,有利于存储和网络输出数据带宽的消耗