emacs+ensime+sbt打造spark源码阅读环境

概述

Scala越来越流行, Spark也愈来愈红火, 对spark的代码进行走读也成了一个很普遍的行为。不巧的是,当前java社区中很流行的ide如eclipse,netbeans对scala的支持都不算太好。在这种情况下不得不想到编辑器之神emacs,利用emacs+ensime来打造scala编程环境。

本文讲述的步骤全部是在arch linux上,其它发行版的linux视具体情况变通。

安装scala

pacman -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.sbt

cd ~/.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。变通的方法如下

  1. 运行emacs, 在emacs中打开SparkContext.scala具体什么源文件不重要,这里只是一个比方
  2. 在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环境搭建完毕,具体指令的话请查看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-, 跳转到之前的位置

时间: 2024-08-03 03:59:39

emacs+ensime+sbt打造spark源码阅读环境的相关文章

《Spark大数据分析实战》——2.4节配置Spark源码阅读环境

2.4 配置Spark源码阅读环境 由于Spark使用SBT作为项目管理构建工具,SBT的配置文件中配置了依赖的jar包网络路径,在编译或者生成指定类型项目时需要从网络下载jar包.需要用户预先安装git.在Linux操作系统或者Windows操作系统上(用户可以下载Git Shell,在Git Shell中进行命令行操作)通过"sbt/sbt gen-idea"命令,生成Intellij项目文件,然后在Intellij IDE中直接通过"Open Project"

Spark修炼之道(高级篇)——Spark源码阅读:第二节 SparkContext的创建

博文推荐:http://blog.csdn.net/anzhsoft/article/details/39268963,由大神张安站写的Spark架构原理,使用Spark版本为1.2,本文以Spark 1.5.0为蓝本,介绍Spark应用程序的执行流程. 本文及后面的源码分析都以下列代码为样板 import org.apache.spark.{SparkConf, SparkContext} object SparkWordCount{ def main(args: Array[String])

Spark修炼之道(高级篇)——Spark源码阅读:第一节 Spark应用程序提交流程

作者:摇摆少年梦 微信号: zhouzhihubeyond spark-submit 脚本应用程序提交流程 在运行Spar应用程序时,会将spark应用程序打包后使用spark-submit脚本提交到Spark中运行,执行提交命令如下: root@sparkmaster:/hadoopLearning/spark-1.5.0-bin-hadoop2.4/bin# ./spark-submit --master spark://sparkmaster:7077 --class SparkWordC

Spark修炼之道(高级篇)——Spark源码阅读:第六节 Task提交

Task提交 在上一节中的 Stage提交中我们提到,最终stage被封装成TaskSet,使用taskScheduler.submitTasks提交,具体代码如下: taskScheduler.submitTasks(new TaskSet( tasks.toArray, stage.id, stage.latestInfo.attemptId, stage.firstJobId, properties)) Stage由一系列的tasks组成,这些task被封装成TaskSet,TaskSet

Spark修炼之道(高级篇)——Spark源码阅读:第八节 Task执行

Task执行 在上一节中,我们提到在Driver端CoarseGrainedSchedulerBackend中的launchTasks方法向Worker节点中的Executor发送启动任务命令,该命令的接收者是CoarseGrainedExecutorBackend(Standalone模式),类定义源码如下: private[spark] class CoarseGrainedExecutorBackend( override val rpcEnv: RpcEnv, driverUrl: St

Spark修炼之道(高级篇)——Spark源码阅读:第十节 Standalone运行模式解析

Spark Standalone采用的是Master/Slave架构,主要涉及到的类包括: 类:org.apache.spark.deploy.master.Master 说明:负责整个集群的资源调度及Application的管理. 消息类型: 接收Worker发送的消息 1. RegisterWorker 2. ExecutorStateChanged 3. WorkerSchedulerStateResponse 4. Heartbeat 向Worker发送的消息 1. Registered

Spark修炼之道(高级篇)——Spark源码阅读:第十三节 Spark SQL之SQLContext(一)

作者:周志湖 1. SQLContext的创建 SQLContext是Spark SQL进行结构化数据处理的入口,可以通过它进行DataFrame的创建及SQL的执行,其创建方式如下: //sc为SparkContext val sqlContext = new org.apache.spark.sql.SQLContext(sc) 其对应的源码为: def this(sparkContext: SparkContext) = { this(sparkContext, new CacheMana

Spark修炼之道(高级篇)——Spark源码阅读:第十二节 Spark SQL 处理流程分析

作者:周志湖 下面的代码演示了通过Case Class进行表Schema定义的例子: // sc is an existing SparkContext. val sqlContext = new org.apache.spark.sql.SQLContext(sc) // this is used to implicitly convert an RDD to a DataFrame. import sqlContext.implicits._ // Define the schema usi

Spark修炼之道(高级篇)——Spark源码阅读:第三节 Spark Job的提交

前一我们分析了SparkContext的创建,这一节,我们介绍在RDD执行的时候,如何提交job进行分析,同样是下面的源码: import org.apache.spark.{SparkConf, SparkContext} object SparkWordCount{ def main(args: Array[String]) { if (args.length == 0) { System.err.println("Usage: SparkWordCount <inputfile>