spark 源码导读5 列举spark引用的框架和算法
谈起spark,我们首先想到的是其运算速度的提升上,另外是其支持批处理、交互式、迭代和流计算等,其实spark还有一个很大的优势是其源码的数量上,非常精简,这对于我们阅读源码,在心理上克服了一个很大的障碍。为什么会这样? 一方面是spark采用了高效(主要从代码量上说)的scala语言编写,另一方面是spark站在了巨人的肩膀上,当然这也使得我们在读其源码时,可能会困惑于其中的一些词,如avro, REST等。这篇文章就是想对其引用的框架和算法做一个分类汇总,以方便更好的理解spark源码。
资源管理与调度:
MESOS
YARN
Master HA:
Zookeeper
web框架或协议:
REST
JETTY 是一个用 Java 实现、开源、基于标准的,并且具有丰富功能的 Http 服务器和 Web 容器,可以免费的用于商业行为。Jetty 这个项目成立于 1995 年,现在已经有非常多的成功产品基于 Jetty,比如 Apache Geromino, JBoss, IBM Tivoli, Cisco SESM 等。Jetty 可以用来作为一个传统的 Web 服务器,也可以作为一个动态的内容服务器,并且 Jetty 可以非常容易的嵌入到 Java 应用程序当中。
spark将相关方法进一步封装在org.apache.spark.ui.JettyUtils类中。
序列化:
avro
kryo 是一个快速高效的Java对象图形序列化框架,它原生支持java,且在java的序列化上甚至优于google著名的序列化框架protobuf。由于protobuf需要编写Schema文件(.proto),且需静态编译。
def registerKryoClasses(classes: Array[Class[_]]): SparkConf = { val allClassNames = new LinkedHashSet[String]() allClassNames ++= get("spark.kryo.classesToRegister", "").split(',').filter(!_.isEmpty) allClassNames ++= classes.map(_.getName) set("spark.kryo.classesToRegister", allClassNames.mkString(",")) set("spark.serializer", classOf[KryoSerializer].getName) this }
用法:
Kryo kryo = new Kryo(); // ... Output output = new Output(new FileOutputStream("file.bin")); SomeClass someObject = ... kryo.writeObject(output, someObject); output.close(); // ... Input input = new Input(new FileInputStream("file.bin")); SomeClass someObject = kryo.readObject(input, SomeClass.class); input.close();
算法:
pagerank
pregal
附:这篇文章会持续更新的。