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

 

附:这篇文章会持续更新的。

posted on 2015-03-14 11:49  Ai_togic  阅读(364)  评论(0编辑  收藏  举报

导航