1主/从架构(整体结构) (解耦问题+扩展性问题:观察者模式,组件化解耦应对变化(组件替换,以及增删)-----------如果非主从,则控制混乱,代码不可复用,datanode不容易扩展。)
2元数据与数据分离(空间(本质也是局部性原理)) (io问题:可以理解为将磁盘数据 元数据分到主节点,剩下数据按存储顺序分布到从节点-----------反证 元和数据放到一起活着不分会产生 磁头移动,io最大的开销)(不同数据操作的访问的分离和5对比,局部性原理)
3 延迟写+buffer+块操作(批处理减少单独分散小操作开销,本质也是局部性原理 )(数据块的Staging) 成块后写入datanode(关键是:同时减少磁头移动操作,中间不被插入别的操作造成不能顺序写磁头移动) (次要: 1减少传输的所用的数据块头 数据量2减少传输建立和关闭开销)(同操作的存储的聚集:局部性原理) (sparkbuffersize的配置所用应该考虑是否和hdfs块大小的相关性?)
4一次写入多次读取(操作) (一致性问题:串行化操作,消除并发写的不一致性,这样hdfs不用写锁,单机并发和分布式并发不用写锁,减少程序复杂度和不一致性) (spark的惰性RDD不可修改性,以及函数式编程的不变性)
5动计算比移动数据更划算(计算) (网络通信开销问题:传数据开销》传计算=====所以scala的函数式在spark中的价值在传函数计算得到一定程度大的优势)
5容错(1hdfs 多副本策略2 rdd (1多副本2检查点3血统相当于也是日志记录操作)) (1副本策略(纯数据) 2日志策略(少量原来数据+操作)(日志升级检查点策略))