emacs+ensime+sbt打造spark源码阅读环境
Scala越来越流行, Spark也愈来愈红火, 对spark的代码进行走读也成了一个很普遍的行为。不巧的是,当前java社区中很流行的ide如eclipse,netbeans对scala的支持都不算太好。在这种情况下不得不想到编辑器之神emacs,利用emacs+ensime来打造scala编程环境。
本文讲述的步骤全部是在arch linux上,其它发行版的linux视具体情况变通。
安装scalapacman -S scala安装sbt
pacman -S sbt安装ensime
yaourt -S ensime
添加如下代码到$HOME/.emacs中
(add-to-list load-path "/usr/share/ensime/elisp") (add-to-list exec-path "/usr/share/ensime") (require ensime) (add-hook scala-mode-hook ensime-scala-mode-hook)运行sbt
sbt
首次运行sbt会解决依赖,下载必须的包。生成$HOME/.sbt/0.13目录,假设当前的sbt版本是0.13的话。
创建plugin.sbtcd ~/.sbt/0.13 mkdir -p plugins cd plugins touch plugin.sbt
在plugin.sbt中添加如下内容
addSbtPlugin("org.ensime" % "ensime-sbt-cmd" % "0.1.2")
再次运行sbt, sbt会自动下载ensime plugin
下载spark源码假设下载的spark源码解压在$HOME/working目录。到些为止,准备工作都差不多了,开始真正的使用吧。
生成.ensime文件spark采用maven进行编译管理,所以不能像一般的sbt工程那样直接使用ensime generate。变通的方法如下
运行emacs, 在emacs中打开SparkContext.scala具体什么源文件不重要,这里只是一个比方 在emacs中运行ensime-config-gen,按照提示一步步执行,最终生成.ensime如何回答ensime-config-gen中的每一个问题,下面的screenshot给出了明确的示例。
指定根目录
设定项目类型,选择yes
指定项目名称,spark
package的名称 org.apache.spark
指定源文件目录
指定所依赖的包所在位置
scala的标准库所在位置,选择 N
指定生成的classess被保存在哪个目录,选择默认
至此,配置完成,在spark-0.9.0-incubating/core/src/main能够打到.ensime文件
运行ensime一旦生成了.ensime,就可以直接在emacs中唤起ensime了,M-X进入minibuffer,输入ensime
确认.ensime的位置
.ensime加载进来之后,状态栏上的"No Connection"提示信息消失,取而代之的是“spark analyzing",表明正在进行源文件的indexing.
ensime环境搭建完毕,具体指令的话请查看ensime官网上的manual.
由于我是进行源码走读,所以比较注重代码的调用和跳转。
将光标移动某一个类的起始定义处 如class SparkContext,然后调用快捷键c-c c-v i 列出SparkContext的变量与函数
c-c c-v p 列出当前package中的所有类
c-c c-v v 查找某一个方法或类
c-c c-v r 查看当前函数在哪些地方被调用,类似于source insight中的calling或eclipse中的calling hierarchy功能
alt-. 跳转到函数或类的定义处
alt-, 跳转到之前的位置
Spark Netty与Jetty (源码阅读十一) spark呢,对Netty API又做了一层封装,那么Netty是什么呢~是个鬼。它基于NIO的服务端客户端框架,具体不再说了,下面开始。 创建了一个线程工厂,生成的线程都给定一个前缀名。 像一般的netty框架一样,创建Netty的EventLoopGroup: 在常用...
Spark之SQL解析(源码阅读十) 如何能更好的运用与监控sparkSQL?或许我们改更深层次的了解它深层次的原理是什么。之前总结的已经写了传统数据库与Spark的sql解析之间的差别。那么我们下来直切主题~ 如今的Spark已经支持多种多样的数据源的查询与加载,兼容了Hive,可用JDBC的方式或者ODBC来连接Spark SQL。
Spark BlockManager的通信及内存占用分析(源码阅读九) 之前阅读也有总结过Block的RPC服务是通过NettyBlockRpcServer提供打开,即下载Block文件的功能。然后在启动jbo的时候由Driver上的BlockManagerMaster对存在于Executor上的BlockManager统一管理,注册Executor的BlockManager、更新Executor上Block的最新信息、询问所需要Block目前所在的位置以及当Executor运行结束时,将Executor移除等等。
Spark Job的提交与task本地化分析(源码阅读八) 我们又都知道,Spark中任务的处理也要考虑数据的本地性(locality),Spark目前支持PROCESS_LOCAL(本地进程)、NODE_LOCAL(本地节点)、NODE_PREF、RACK_LOCAL(本地机架)、ANY(任何)几种。
Spark Shuffle数据处理过程与部分调优(源码阅读七) shuffle。。。相当重要,为什么咩,因为shuffle的性能优劣直接决定了整个计算引擎的性能和吞吐量。相比于Hadoop的MapReduce,可以看到Spark提供多种计算结果处理方式,对shuffle过程进行了优化。
Spark常用函数(源码阅读六) 源码层面整理下我们常用的操作RDD数据处理与分析的函数,从而能更好的应用于工作中。 连接Hbase,读取hbase的过程,首先代码如下: def tableInitByTime(sc : SparkContext,tableName : String,columns : Strin...
相关文章
- PostgreSQL SQL log duration time 源码分析
- 自制小工具含源码——博客园图床ImageBed
- Spark修炼之道(高级篇)——Spark源码阅读:第十三节 Spark SQL之SQLContext(一)
- Spark修炼之道(高级篇)——Spark源码阅读:第七节 resourceOffers方法与launchTasks方法解析
- Spark修炼之道(高级篇)——Spark源码阅读:第六节 Task提交
- Apache Spark源码走读(十二)Sort-based Shuffle的设计与实现
- MFC Windows 程序设计[290]之文字查找例程(附源码)
- 第二人生的源码分析(二十六)底层网络协议
- 第二人生的源码分析(九十)LLScrollListCtrl实现列表显示
- 手把手教你完整Python接口自动化--附源码
- Spark 以及 spark streaming 核心原理及实践
- Spark实战(八)spark的几种启动方式
- Spark实战(四)spark+python快速入门实战小例子(PySpark)
- 仲裁器设计——Verilog源码
- [YOLOv7]基于YOLOv7的口罩识别系统(源码&部署教程)
- [MATLAB]手把手带你用MATLAB跑经典算法YOLOv5&训练自己的数据集(包含源码)