内存计算--Spark

1. 并行计算回顾

原因:

计算量大:单进程算得不够快

内存需求大:内存随机访问比硬盘随机访问快10万倍,单机内存不够大

I/O量大:单个硬盘读写I/O太慢

 

挑战:

编程困难:并行性、同步语句

性能调优难:负载平衡、局部性(Cache)

容错难:传统容错方法不适用(锁步法)

 

大数据处理并行系统:

编程模型、容错能力、性能与成本

MapReduce:编程模型简单(Map&&Reduce),容错简单,成本低,性能较差

Spark:性能优化(内存计算),限制了编程模型(确定性的粗粒度操作),确保高效率的容错能力

 

2. 内存计算的需求

更复杂的多阶段任务、交互式查询(实时)

MapReduce局限性:表达能力有限,复杂任务需要迭代(需要将中间结果保存在硬盘上,大量的I/O操作),只能做离线分析

 

MapReduce中用文件传递函数,中间结果保存在硬盘上,如果能用内存保存中间结果?

可行性

内存是否足够大、性价比如何、放在内存里如何容错、内存里的数据如何高效表示

 

3. 传统内存抽象

如何抽象多台机器的内存?

--分布式共享内存

--分布式键-值存储

容错机制:

--副本/log(增加了网络的开销)

优缺点:

允许细粒度的操作,但是容错困难。

 

4. Spark

设计理念:注重效率与容错

RDD(Resilient Distributed Datasets):高效的容错方法

--基于数据集合,而不是单个数据(一次log可以用于很多数据)

--由确定性的粗粒度操作产生(map、filter、join等)

--数据一旦产生,就不能修改(immutable)

--如果要修改数据,要通过数据集的变换来产生新的数据

--通过重复计算来恢复数据(因为数据是确定性地产生,并且产生后不会变化)

 

编程接口:

基于Scala语言

--类似Java的一种函数式语言

--可以在Scala控制台上交互式使用Spark

--也支持Java、Python

基于RDD的操作

--Transformation:从现有RDD产生新的RDD

(map、reduce、filter、union、join、group、sort等等)

--Action:从RDD返回一个值

(collect、count、first等等)

 

实现技术:

延迟估值:Transformation不会触发计算,只是做了记录

数据划分:自定义划分函数,避免网络通信

重用RDD:使用Persist和Cache,尽量保存在内存里面

 

Spark生态环境:

Spark Streaming

(流计算)

GraghX(图计算)

MLbase(机器学习)

Shark(SQL)

Shark(计算框架)

Tachyon(内存文件系统)

HDFS

Mesos(资源管理与调度)

 

--将MapReduce一般化,任务DAG(有向无环图)和数据共享

--统一的编程框架

 

局限性:

对于细粒度的数据更新,由于spark基于粗粒度RDD只读的数据对象模型,需要RDD变换,即有大量数据的复制,导致处理效率不高

 

你可能感兴趣的:(内存计算--Spark)