内存计算

2017-10-23  本文已影响0人  SeanC52111

by 清华大学

为什么并行计算?

并行计算的挑战

并行计算中的局部性

矩阵相乘,按列访问会造成cache失效


image.png

分块算法,得到更高的局部性

高可用性

大数据处理系统通常是由大量不可靠服务器组成的,如果处理1个10天的大数据处理任务时在第8天机器坏掉怎么办?
重新计算不一定能解决问题
传统的容错方法不适用

大数据处理并行系统

image.png

内存计算需求

Map Reduce成功之处

MapReduce 文件传递数据

image.png

如果能用内存保存数据?

image.png

比采用硬盘方案快10-100倍
In Memory Computing

内存计算的可行性

问题:

image.png

单位芯片上集成的晶体管数量随着时间(每两年)可以成倍增长

各个内存层次的延迟

image.png

DRAM比硬盘快100,000倍,但是DRAM比片上cache慢6-200倍

内存计算的实例:SPARK

SPARK设计理念:着重效率和容错
如何抽象多台机器的内存?

DSM和键值对的容错机制

解决方案

高效容错方法

大数据处理并行系统

用编程模型上的限制获取好的容错能力和高性能


image.png

K-V 对,细粒度修改; HDFS 只能添加数据
RDD 高吞吐率,不允许做细粒度修改,换取好的容错能力和好的性能

SPARK 编程接口

SPARK 编程实例--LOG挖掘
将数据从文件系统中调入内存,然后进行交互式的查询


image.png
lines = spark.textFile("hdfs://...")
errors = lines.filter(_.startsWith("ERROR"))
messages = errors.map(_.split('\t')(2))
cachedMsgs = messages.cache()
cachedMsgs.filter(_.contains("foo")).count // 包含foo的信息的数目
cachedMsgs.filter(_.contains("bar")).count
image.png image.png image.png image.png

SPARK 实现技术

延迟估值(Lazy Evaluation)

val lines = sc.textFile("data.txt")  //transformation
val lineLengths = lines.map(s => s.length) //transformation
val totalLength = lineLengths.reduce((a,b) => a+b) //action, trigger computation
image.png

有向无环图


image.png image.png image.png image.png

RDD性能的提高

对需要重用的RDD使用Persist和Cache提高性能


image.png image.png

SPARK 应用和生态环境

image.png image.png image.png image.png
image.png

SPARK 局限性

image.png image.png

只能复制一份,标记少数节点。操作为网络操作、内存拷贝操作、IO操作(由于数据是只读的)-> 效率低,大量内存拷贝。
每次细粒度的数据更新,由于spark基于粗粒度RDD只读的数据对象模型,需要RDD变换,即有大量数据的复制,导致处理效率不高

上一篇下一篇

猜你喜欢

热点阅读