Spark学习笔记(1)
Spark 和 Hadoop 速度优势对比
- Spark 默认情况下的迭代过程的数据保存到内存中,后续的运行作业利用这些结果进行计算,而Hadoop每次计算结果都直接存储到磁盘中。
- 由于较复杂的数据计算任务需要多个步骤才能实现,且步骤之间具有依赖性。Hadoop需要借助Oozie等工具今夕处理。而Spark在执行任务之前,可以将这些步骤依赖关系形成DAG图(有向无环图),任务可以按图索骥,从而优化了计算路径。
Spark的生态圈
- Spark Core 提供内存计算框架
- Spark streaminging的实时处理应用
- Spark SQL的即席查询
- MLlib的机器学习
- GraphX的图处理

Spark与MapReduce比较
Spark 把中间数据存储放在内存中,迭代运算效率高,MapReduce则是放在磁盘上,而Spark支持DAG图的分布式并行计算的编程框架
Spark的容错性高,Spark引进了弹性分布式数据集(Resilient DIstributed Dataset,RDD)的概念,他是分布在一组节点中的只读对象集合,这些集合是弹性的,如果数据集一部分丢失,则可以根据“血统”(即允许基于数据衍生过程)对他们重建。另外在RDD计算时可以通过CheckPoint来实现容错。CheckPoint有两种方式,即CheckPoint Data和Logging The Update。
Spark更加通用。Hadoop只提供了Map和Reduce两种操作,Spark提供的数据集操作类型有很多种,大致分为转换操作和行动操作两大类。转换操作包括Map,Filter,FlatMap,Sample,GroupByKey,ReduceBykey,Union,Join,Cogroup,MapValues,Sort和PartionBy等多种操作类型,行动操作包括Collect,Reduce,Lookup和Save等操作类型。另外,各个处理节点之间的通信模型不再像Hadoop只有Shuffle一种模式,用户可以命名,物化,控制中间结果的存储,分区等。
Spark core
连接Spark各种生态的核心
Spark streaming
Spark streaminging是一个对实时数据流进行高吞吐,高容错的六室处理系统,可以对多种数据源进行类似Map,Reduce和Join等复杂操作,并将结果保存到外部文件系统,数据库。相比其他的处理引擎要么只专注于流处理,要么只负责批处理,而Spark streaming最大的优势是听的处理引擎和RDD编程模型可以同时进行批处理于流处理。
对于传统流处理中一次处理一条记录的方式而言,Spark streaming使用的是将流数据离散化处理(Discretized streamings),通过该吹方式能够进行秒级以下的数据批处理。在Spark streaming处理过程中,Receiver并行接收数据,并将数据缓存至Spark工作节点的内存中。经过延迟优化后,Spark引擎对段任务能够进行批处理,并且可将结果暑促至其他系统中。

使用离散化流数据,Spark streaming将具有:
动态负载均衡:
通过将数据划分为小批量,通过这种方式可以实现对资源更细粒度的分配。在传统实时流记录处理系统在输入数据流以键值进行分区处理情况下,如果一个节点计算压力较大超出了符合,会拖慢整个系统的处理速度。而Spark streaming会将作业任务动态平衡的分给各个几点。快速故障恢复机制:
在节点出现故障的情况下,传统流处理系统会在其他的节点上重启失败的连续算子,并可能重新运行先前数据流处理操作获取部分丢失数据。需要等新节点完成故障前的所有计算后整个系统才能够处理其他任务。在Spark中,计算分成多个小任务,保证任何节点运行后能够正确进行合并,在某个节点出现故障的情况,这个节点的任务将均匀的分散到集群中的节点进行计算,比单个节点计算能够更快的恢复数据。批处理、流处理与交互式分析的一体化:
Spark streaming把流式计算分解成一系列小的的批处理作业,也就是一段段离散数据流,每一段数据都转换成Spark中的RDD,然后将Spark streaming中对离散数据流处理操作变成对RDD的批处理操作。
Spark SQL
特点:
- 引入了新的RDD类型SchemaRDD,可以向传统数据库定义表一样来定义SChemaRDD,SchemaRDD由定义了列数据类型的行对象构成。SchemaRDD既可以从RDD转换过来,也可以从Parquet文件读入,还可以使用HiveQL从Hive中获取。
- 内嵌了Catalyst查询优化框架,在吧Sql解析成逻辑执行计划之后,利用Catalyst包里一些类和接口,执行了一些简单的执行计划优化,最后变成RDD的计算。
- 在应用程序中可以混合使用不同来源的数据,如可以将来字HiveQl的数据和来自SQL的数据进行Jion操作。
Spark SQL性能优化:
- 内存列存储:表数据在内存汇总存储不是采用原生态的JVM对象存储方式,而是采用内存列存储
- 字节码生成技术:在Catalyst模块的Expressions增加了Codegen模块,使用动态字节码生成技术,对匹配的表达式采用特定的代码动态编译。另外对SQL表达式都做了CG优化。CG优化的实现主要还是依靠Scala运行的反射机制
MLBase/MLlib
MLBase分为4个部分:
- MLRuntime:是由Spark Core提供的分布式内存计算框架,运行有Optimizer优化过的算法进行数据的计算并输出分析结果。
- MLlib:是Spark实现一些常见的机器学习算法和使用程序。
- MLI:s是一个特征抽取和高级ML编程抽象算法实现的API或平台。
- ML Optimizer:会选择最合适的已经在内部实现好了的机器学习算法和相关参数来处理用户输入的数据。
GraphX
GraphX的核心抽象是Resilient Distributed Property Graph,一种电荷变都带属性的有向多重图。GraphX扩展了SparkRDD的抽象,他有Table和Graph两种视图,但只需要一份物理存储,两种视图都有自己独有的操作符,从而获得了灵活操作和执行效率。