分享

Apache Spark是如何设计的


问题导读

1.本文总结内存计算哪三个特点?
2.Apache Spark设计的思路是什么?
3.在Spark的支持算子方面有哪两大类?
4.能否总结对spark的认识?








什么是内存计算技术?
关于内存计算,就像云计算和大数据一样,其实无论在百度百科还是Wikipedia都没有非常精确的描述,但是有几个共通的关键点,我在这里给大家总结一下:
其一是数据放在内存中,至少和当前查询工作涉及到的数据放在都要放在内存中;
其二是多线程和多机并行,也就是尽可能地利用现代x86 Xeon CPU线程数多的优势来加速整个查询;
其三是支持多种类型的工作负载,除了常见和基本的SQL查询之后,还通常支持数据挖掘,更有甚者支持Full Stack(全栈),也就是常见编程模型都要支持,比如说SQL查询,流计算和数据挖掘等。

Apache Spark的设计思路
大家都知道,现在Apache Spark可以说是最火的开源大数据项目,就连EMC旗下专门做大数据Pivotal也开始抛弃其自研十几年GreenPlum技术,转而投入到Spark技术开发当中,并且从整个业界而言,Spark火的程度也只有IaaS界的OpenStack能相提并论。那么本文作为一篇技术文章,我们接着就直接切入它的核心机制吧。

143559s00az0995dbt2cx3.png

图1. Spark的核心机制图

在Spark的核心机制方面,主要有两个层面:

首先是RDD(Resilient Distributed Datasets),RDD是Spark的最基本抽象,是对分布式内存的抽象使用,实现了以操作本地集合的方式来操作分布式数据集的抽象实现,它表示已被分区,不可变的并能够被并行操作的数据集合,并且通常缓存到内存中,并且每次对RDD数据集的操作之后的结果,都可以存放到内存中,下一个操作可以直接从内存中输入,省去了Map Reduce框架中由于Shuffle操作所引发的大量磁盘IO。这对于迭代运算比较常见的机器学习算法, 交互式数据挖掘来说,效率提升比较大。

其次,就是在RDD上面执行的算子(Operator),在Spark的支持算子方面,主要有转换(Transformation)和操作(Action)这两大类。在转换方面支持算子有 map, filter,groupBy和join等,而在操作方面支持算子有count,collect和save等。

Spark常见存储数据的格式是Key-Value,也就是Hadoop标准的Sequence File,但同时也听说支持类似Parquet这样的列存格式。Key-Value格式的优点在于灵活,上至数据挖掘算法,明细数据查询,下至复杂SQL处理都能承载,缺点也很明显就是存储空间比较浪费,和类似Parquet列存格式相比更是如此,key-Value格式数据一般是原始数据大小的2倍左右,而列存一般是原始数据的1/3到1/4。 在效率层面,由于·使用Scala这样基于JVM的高级语言来构建,显而易见会有一定程度的损失,标准Java程序执行时候的速度基本接近C/C++ O0模式的程度,会比C/C++ O2模式的速度慢60%左右。

在技术创新方面,个人觉得Spark还谈不上创新,因为它其实属于比较典型In-Memory Data Grid内存数据网格,无论从7-8年前的IBM WebSphere eXtreme Scale到最近几年新出,并用于12306的Pivotal Gemfire都采用较类似的架构,都主要通过多台机器拼成一个较大内存网格,里面存储的数据都接近Key-Value模式,并且这个内存网格会根据很多机制来确保数据会持久稳定地保存在内存中,并能保持数据的更新和恢复,而在网格上面使用一些常见的算子,来执行灵活的查询,并且用户可以写的程序来直接调用这些算子。


欢迎大家如about云官方群371358502,更新咨询,更新资源,随时关注

已有(1)人评论

跳转到指定楼层
hb1984 发表于 2015-5-5 14:33:30
谢谢楼主分享。         
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

推荐上一条 /2 下一条