Spark-streaming 和spark-sql 基本概念
-
spark-streaming 是spark体系中一个流式处理的框架
-
spark-core 是核心的计算引擎,streaming是其中一个功能
-
streaming与storm的区别:storm数据呈水流状,最基本的单位是 tuple。streaming按照时间做了离散化
-
spark开发的时候,就是开发 RDD的DAG图,spark-core:RDD开发,DAG图。streaming开发针对,Dstream开发,DstreamGraph。
-
Dstream是一连串的RDD开发,每一个RDD包含特定时间间隔数据。
-
RDD的DAG是一个空间概念,Dstream在RDD的基础上加了一个时间纬度
-
Dstream算子和RDD的算子不一样
RDD分为transformation和action算子
Dstream也分为两类算子
转换算子: transformation
输出算子:output:saveAsTextFile / saveAsObjectFile。forEachRDD 允许用户对每一批数据对应的RDD本身做任意操作 -
时间窗口:统计最近一个小时的PV访问量,要求份十分钟更新一次
-
spark-streaming的基本架构:master、worker、client
receiver模式:被动 。direct模式 : 主动 。
spark-sql的基本概念
-
和hive的对比,hive存数据的那几个层次:table|partition||bucket。hive的sql最终会转换MapReduct计算框架。spark-sql可以直接调用hive中的数据。
-
spark-sql主要处理结构化数据
-
spark-streaming中有一个模板称为Dstream,spark-sql中也有一个新的概念DataFrame–当作一个table(关系型表)
-
DataFrame数据源多样
1). SqlContext:外部数据源、HDFS、网络接口、MySQL等
2).HiveContext 对接hive的数据源
3).两者存在的关系 HiveContext继承于SqlContext,SqlContext支持的语法更多,HiveContext支持HQL。 -
Dataframe为了让大数据处理的更简单,可以DataFrame当作一个分布式的table
-
RDD与Dataframe差异体现
1).RDD是以行(record)为单位读数据,spark-core在如何优化,都无法了解到Record内部细节,所以无法更深度的优化,这一个缺点直接影响性能提升。
2).Dataframe的优化是基于列的,包含了每个record中的MetaData信息,dataFrame是基于列的优化,而不像RDD是基于行进行优化。RDD和DataFrame都有懒惰机制(都是基于RDD的抽象) -
Spark SQL的处理核心:catalyst工作流程:将sql和dataframe用tree存储
工作流程:
1) sql语句通过Parser模块解析为语法树(未解析状态的逻辑树)
2) 对未解析状态的逻辑树做解析,利用Analyer模块,解析为逻辑树
3)再进一步进行优化:
a、基于规则优化:谓词下推(Predicate Pushdown)、常量累加(Constant Folding)和列值裁剪(Column Pruning)
b、基于代价优化:BroadcastHashJoin还是SortMergeJoin
4)将计划转换为物理计划
5)最后计算costcatalyst优化引擎,可以使执行时间减少75%
-
内存管理优化(Tungsten内存管理)
本质:突破JVM的内存管理限制,分配堆外内存,让spark实现了自己独立的内存管理,完全避免了JVM资源回收引发的性能问题
Tungsten内存管理是spark有史以来最大改动,目的:提升spark程序对内存和cpu的利用率,让性能达到硬件极限
1)堆外内存(off-heap)管理内存,降低对象的开销和消除JVM GC延迟
2) 优化存储,提升CPU自身 L1/2/3的缓存命中率
3) 优化了Spark SQL代码生成JVM的内存管理缺点: JVM的内存管理缺点: 1) 对象空间开销大 abcd为例,其实只需要4个字节,但是实际中,Java的String来存储实际用到了48字节 2) GC带来开销大:主要体现在时间,可能出现假死情况,另外期间没有日志输出,所以排查问题困难