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),且需静态编译。
1 2 3 4 5 6 7 8 9 | 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 } |
用法:
1 2 3 4 5 6 7 8 9 10 | 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
附:这篇文章会持续更新的。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架