Spark、MLlib、Spark Streaming 与 GraphX

我们知道 hadoop 早期的构架分为

  • HDFS,master 是 name node 记录文件系统的 meta data,slave 是 data node 存储文件的实际内容
  • 运算部分局限在 map/reduce 两类任务上,通过 JobTracker 作为 master 和 TaskScheduler 作为 slave 来进行任务的提交分发和执行

这个设计下导致数据访问频繁时 name node 可能出问题,运算提交频繁时 job tracker 可能出问题,如此一来导致了后面通过 zookeeper 对这两部分的改进,这样能够提高整个系统的 availability。在 2.x 里面将资源管理单独分离出来,这就是 YARN,YARN 上面的程序需要提供一个 application master 用来索取计算资源,并将任务部署到这些资源上执行。如此一来 hadoop 试图成为一个 general purpose 的平台,各种不同的分布式任务可以部署在同一个 cluster 上。早期衍生了一些通过 map/reduce 实现的类似 ETL 的工具,如 PIG 和 Hive,也有人利用这个框架实现了一些低效的 machine learning 算法(因为 map/reduce 每一个 iteration 会导致 IO),还有很多很多 apache 相关的项目不断的扩展 map/reduce 范式下的应用范围。

spark 试图采用另一种策略,所谓的 Resilient distributed dataset (RDD)这层抽象提供了类似 map/reduce 这类操作,但是归结到另外的 naming,transformation 和 action 上,对 RDD 的操作序列本质上和 functional programming 里面的概念完全一样,因此操作本身可以被“记录”,从而一旦出现 failure,可以在其他的机器上重复同样的操作获得结果。从这点上,可以说继承了 map/reduce 的优点并发扬光大。但是更深层的含义是,数据并不一定需要在磁盘上 replicate 保证可重复性,完全可以通过内存实现类似的需求,后来 tachyon 似乎也试图通过 in-memory filesystem 来加速 mapreduce。

借助于这个 framework,很自然的问题是能不能形成一个类似于 hadoop 之上的应用环境,兴许能提供更多的功能?Spark streaming 算是在这个上面的一个突破。在 YARN 上可以部署 twitter storm 进行 stream processing,spark streaming 算是提供了另外一种选择,不过为了利用 spark RDD 的概念,spark streaming 提供的 DStream 其实是对 stream processing 的一个“另类解读”,将数据流切成一个时间段的部分,每个部分当做一个 RDD,只要时间段足够短,就可以获得接近“实时”的 stream processing 的假象,storm 本身是 pull mode,能够获得 100ms 级别的 latency,而 spark streaming 据说可以达到 0.5-2s 级别。很多应用看起来是没啥问题的。

类似 mahout,spark 之上有 MLLib 这层提供了基本的优化 primitives,现在显得很单薄,功能无外于 SVM/logistic regression、linear regression(带 L^1L^2 的 regularizer)、k-means(估计很容易改成 EM 类型的模型)、CF 里面常见的 ALS。比较有意思的是 MLlib 使用了 jblas,这使得 scala/java API 下矩阵操作变得容易了很多,另外 python 的 API 是 native 的,不像 PIG/Hive 之类的是使用 Jython 来做,numpy/scipy 都可以用到这里面,估计的确比较适合一些模型参数能在单机存储的模型。

GraphX 的前身是 bagel,学习的是 google 的 pregel,设计思想和前面的 BGL 系列的原理类似:顶点通过一个 property map 来表示,对应的边可以看成是 vertex pair 为 key 的 property map。但是这两个概念在分布式系统里面都是很容易扩展的,很明显,通过 spark 的 RDD 将这些信息封装之后,我们能够比较方便的实现图的不少相关算法,某些图的属性比如顶点的入度可以看成是一个 graph 的 property map 通过某些变换后产生的新的 map,GraphX 提供了这些基本的操作。更有意思的是提供的关于 pregel 类型的 API,这是所谓的 bulk synchronous message passing 的模型,每个 iteration 每个顶点接受信息后沿每条边发出消息,下一个 iteration 这些消息聚合后同时发送到目的地。有了这种模型似乎做 page rank 啊或者 LBP 会方便很多。

最后说一下 shark,与 Hive 的初衷比较接近,但是因为 spark 能够将数据 cache 到内存,执行的效率能比 MR 上的 Hive 更快。当然因为 shark 的 API 能在 scala 里面直接用,那么 MLlib、GraphX 的整合都是非常容易的,而像 Hive 抽取到了数据和训练模型必须分开。

这些了解还比较肤浅,后面继续追一些项目实验着玩玩。

——————
And Jacob said, O God of my father Abraham, and God of my father Isaac, the LORD which saidst unto me, Return unto thy country, and to thy kindred, and I will deal well with thee:

Advertisements
Spark、MLlib、Spark Streaming 与 GraphX

一个有关“Spark、MLlib、Spark Streaming 与 GraphX”的想法

  1. guojc 说:

    sign,今天发现spark在不出错条件下,也会计算错。似乎跟并发和线程数有关。期望它稳定就好,不然还是很方便的。

发表评论

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / 更改 )

Twitter picture

You are commenting using your Twitter account. Log Out / 更改 )

Facebook photo

You are commenting using your Facebook account. Log Out / 更改 )

Google+ photo

You are commenting using your Google+ account. Log Out / 更改 )

Connecting to %s