第十四课

Spark里面一个Stage里面跑1000个步骤,在默认情况下产生一次结果。在Hadoop MR中,会产生999次结果。

Spark是分布式函数编程的抽象。RDD是只读分区的集合。
不能让它立即计算,要不然就会产生中间结果。
RDD的产生是Lazy的。开始Spark只做数据标记

比如flatmap在构造中new RDD(this,。。。)
把父RDD传了进去,每次构造RDD

就像函数展开。f(x)=x+1, x=y+2, y=z+3.

以前Spark的Shuffle机制被人诟病,现在是个plugin,可以应当任何规模的数据处理。

1.3 data frame 革命性
1.6 stream

常规容错:数据检查点checkpoint, 记录数据更新。(就是snapshot+change log)
checkpoint每次都有个拷贝,分布式系统拷贝到每个节点,消耗网络带宽。
记录数据更新,系统复杂度提高,把Read only系统变成了有Update的系统。有LOCKING的问题等等。

Spark本身是记录数据更新的系统。RDD通过记录数据更新的方式为何很高效?(就是append写,log structured?)

A。RDD是immutable, 加上Lazy
构成Lineage链条。
出错后,从上一个已知RDD进行恢复

  1. 上一个stage的结束 (会写磁盘)
  2. 特别persist的地方 (缓存了)
  3. 特别checkpoint的地方

B. RDD对数据更新(写操作)是粗粒度的操作,都是对于工作集的
所以记录的效率特别高。(transform),不是对比如行,一条记录的。

RDD的读,既可以是粗粒度的也可以是细粒度的,可以读一条记录。

RDD不适合做细粒度的更新的应用,异步更新的应用,适合做粗粒度的(每条一样的操作)
例子是网络爬虫,一直在更新。

感觉这个问题已经解决了吧?现在已经可以做stream处理了。
IoT怎么办?

RDD上每个分片上运行的数据逻辑都是一样的。
getPartitions()
getPreferredLocation()
MySQL数据库集群一般和Spark集群是colocated,这样数据有本地性。
如果数据中心一南一北,Tachyon,现在是Alluxio,可以屏蔽数据的来源。

compute() -> 像函数展开一样,返回iterator.
所有的RDD操作都返回一个迭代器。对用户非常方便,让所有的框架无缝集成,ML可以直接调,流处理也可以直接调。RDD里面是SparkSQL,还是其它的,用户不关心,只要next()就好。

核裂变的功能

“这里是引用这是核裂变的节奏。Spark每增加一个子框架的功能,所有的功能都增强了。
你绝对应该今天晚上睡不着觉啊。”

Spark要一统江湖,除了实时事务性处理(OLTP)

可以调用子类,通过this.type,可以通过在RUNTIME,操作子类的method,是Scala语法提供的。
比如金融子框架,可以直接掉ML,SQL数据挖掘,等等。
反过来,ML可以call金融子框架。
或者新的比如电商子框架,可以直接call金融子框架