并行计算/内存计算/spark
1.并行计算
传统容错方法
同步、检查点设置等。
2.内存计算 memory computing
如何抽象多台机器的内存?
- 分布式共享内存(DSM)
统一的地址空间。很难容错。
- 分布式键值存储(RAMCloud)
细粒度访问。可修改数据(mutable)。容错开销大。
两者的容错机制一般采用副本或者log。(密集数据应用开销大。比内存写慢10-100倍)
3.Spark
着重容错处理和性能优化。不适合细粒度修改数据(fine granularity of updates.best for batch workloads)
解决难容错方案-RDD(resilient distributed datasets)
- 基于数据集合,而不是单个数据。
- 确定性的粗粒度操作。
- 数据产生不能修改。(容错:可以通过RDD的生成过程,重复计算,恢复数据)
- 数据集变换产生新的数据集。
编程接口
- scala
函数语言。交互使用。
- 基于RDD(装饰者设计模式)
- transformation (define a new RDD) 惰性机制 (map,filter,groupBy,sort,distinct...)
- action (return a result to driver program) (count,collect,foreach...)
性能优化
- 数据划分 pagerank
- 对重用的RDD使用cache提高性能
- 持久化(避免重复计算) rdd.cache()
分区
1.并行
2.分区方法:hash,range
k-v rdd
keys
values
sortBykey
sortby
groupBykey
数据读写:
1.本地数据
tf=SC.textfile()
2.读写hbase 思维定位
rowkey column family
缺点
对于细粒度数据更新,效率不高。
如在BFS遍历中,RDD的只读特征造成无用的内存拷贝。
与mapreduce
mr具有自动容错,自动负载均衡机制,但是建立的编程模型较简单,且中间数据需要落磁盘,不适用迭代式计算等;
sprak将mr一般化,基于数据集操作,便于容错;开发了Spark SQL.Streaming等组件,建立统一的编程框架,但是也有自身的局限性。
窄依赖:无shuffle,可优化;只能对应1个子分区;
宽依赖:有shuffle,不可优化,可以对应多个子分区;只要发生了shuffle,就一定会写磁盘(需要等待)。