Spark-streaming 和spark-sql 基本概念

Spark-streaming 和spark-sql 基本概念

  1. spark-streaming 是spark体系中一个流式处理的框架

  2. spark-core 是核心的计算引擎,streaming是其中一个功能

  3. streaming与storm的区别:storm数据呈水流状,最基本的单位是 tuple。streaming按照时间做了离散化

  4. spark开发的时候,就是开发 RDD的DAG图,spark-core:RDD开发,DAG图。streaming开发针对,Dstream开发,DstreamGraph。

  5. Dstream是一连串的RDD开发,每一个RDD包含特定时间间隔数据。

  6. RDD的DAG是一个空间概念,Dstream在RDD的基础上加了一个时间纬度

  7. Dstream算子和RDD的算子不一样
    RDD分为transformation和action算子
    Dstream也分为两类算子
    转换算子: transformation
    输出算子:output:saveAsTextFile / saveAsObjectFile。forEachRDD 允许用户对每一批数据对应的RDD本身做任意操作

  8. 时间窗口:统计最近一个小时的PV访问量,要求份十分钟更新一次

  9. spark-streaming的基本架构:master、worker、client
    receiver模式:被动 。direct模式 : 主动 。

spark-sql的基本概念

  1. 和hive的对比,hive存数据的那几个层次:table|partition||bucket。hive的sql最终会转换MapReduct计算框架。spark-sql可以直接调用hive中的数据。

  2. spark-sql主要处理结构化数据

  3. spark-streaming中有一个模板称为Dstream,spark-sql中也有一个新的概念DataFrame–当作一个table(关系型表)

  4. DataFrame数据源多样
    1). SqlContext:外部数据源、HDFS、网络接口、MySQL等
    2).HiveContext 对接hive的数据源
    3).两者存在的关系 HiveContext继承于SqlContext,SqlContext支持的语法更多,HiveContext支持HQL。

  5. Dataframe为了让大数据处理的更简单,可以DataFrame当作一个分布式的table

  6. RDD与Dataframe差异体现
    1).RDD是以行(record)为单位读数据,spark-core在如何优化,都无法了解到Record内部细节,所以无法更深度的优化,这一个缺点直接影响性能提升。
    2).Dataframe的优化是基于列的,包含了每个record中的MetaData信息,dataFrame是基于列的优化,而不像RDD是基于行进行优化。RDD和DataFrame都有懒惰机制(都是基于RDD的抽象)

  7. Spark SQL的处理核心:catalyst工作流程:将sql和dataframe用tree存储
    工作流程:
    1) sql语句通过Parser模块解析为语法树(未解析状态的逻辑树)
    2) 对未解析状态的逻辑树做解析,利用Analyer模块,解析为逻辑树
    3)再进一步进行优化:
    a、基于规则优化:谓词下推(Predicate Pushdown)、常量累加(Constant Folding)和列值裁剪(Column Pruning)
    b、基于代价优化:BroadcastHashJoin还是SortMergeJoin
    4)将计划转换为物理计划
    5)最后计算cost

     catalyst优化引擎,可以使执行时间减少75%
    
  8. 内存管理优化(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带来开销大:主要体现在时间,可能出现假死情况,另外期间没有日志输出,所以排查问题困难
    

你可能感兴趣的:(spark)