Spark2.1.0之代码结构及载入Ecplise方法

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://beliefer.blog.csdn.net/article/details/79688675

         本文旨在帮助那些想要对Spark有更深入了解的工程师们,了解Spark源码的概况,搭建Spark源码阅读环境,编译、调试Spark源码,为将来更深入地学习打下基础。

一、项目结构

        在大型项目中,往往涉及非常多的功能模块,此时借助于Maven进行项目、子项目(模块)的管理,能够节省很多开发和沟通成本。整个Spark项目就是一个大的Maven项目,包含着多个子项目。无论是Spark父项目还是子项目,本身都可以作为独立的Maven项目来管理。core是Spark最为核心的功能模块,提供了RPC框架、度量系统、Spark UI、存储体系、调度系统、计算引擎、部署模式等功能的核心实现。这些Spark中主要子项目(模块)的功能如下:

  • spark-catalyst:Spark的词法、语法分析、抽象语法树(AST)生成、优化器、生成逻辑执行计划、生成物理执行计划等。
  • spark-core:Spark最为基础和核心的功能模块。
  • spark-examples:使用多种语言,为Spark学习人员提供的应用例子。
  • spark-sql:Spark基于SQL标准,实现的通用查询引擎。
  • spark-hive:Spark基于Spark SQL,对Hive元数据、数据的支持。
  • spark-mesos:Spark对Mesos的支持模块。
  • spark-mllib:Spark的机器学习模块。
  • spark-streaming:Spark对流式计算的支持模块。
  • spark-unsafe:Spark对系统内存直接操作,以提升性能的模块。
  • spark-yarn:Spark对Yarn的支持模块。

二、阅读环境准备

        准备Spark阅读环境,就需要一台好机器。笔者调试源码的机器的内存是8GB。源码阅读的前提是首先在IDE环境中打包、编译通过。常用的IDE有 IntelliJ IDEAEclipse,笔者选择用Eclipse编译和阅读Spark源码,原因有二:一是由于使用多年对它比较熟悉,二是社区中使用Eclipse编译Spark的资料太少,在这里可以做个补充。笔者在Mac OS系统编译Spark源码,除了安装JDK和Scala外,还需要安装以下工具。

1.安装SBT

        由于Scala使用SBT作为构建工具,所以需要下载SBT。下载地址: http://www.scala-sbt.org/,下载最新的安装包sbt-0.13.12.tgz并安装。

移动到选好的安装目录,例如:

mv sbt-0.13.12.tgz~/install/

进入安装目录,执行以下命令:

chmod 755 sbt-0.13.12.tgz

tar -xzvf sbt-0.13.12.tgz

配置环境:

cd ~

vim .bash_profile

添加如下配置:

export SBT_HOME=$HOME/install/sbt

export PATH=$SBT_HOME/bin:$PATH

输入以下命令使环境变量快速生效:

source .bash_profile

安装完毕后,使用sbt about命令查看,确认安装正常,如图1所示。


图1 查看sbt安装是否正常

2.安装Git

        由于Spark源码使用Git作为版本控制工具,所以需要下载Git的客户端工具。下载地址:https://git-scm.com,下载最新的版本并安装。

    安装完毕后可使用git –version命令来查看安装是否正常,如图2所示。


图2  查看git是否安装成功

3.安装Eclipse Scala IDE插件

        Eclipse通过强大的插件方式支持各种IDE工具的集成,要在Eclipse中编译、调试、运行Scala程序,就需要安装Eclipse Scala IDE插件。下载地址:http://scala-ide.org/download/current.html

由于笔者本地的Eclipse版本是Eclipse Mars.2 Release (4.5.2),所以选择安装插http://download.scala-ide.org/sdk/lithium/e44/scala211/stable/site,如图3


3  EclipseScala IDE插件安装地址

        Eclipse中选择“Help”菜单,然后选择“Install New Software…”选项,打开Install对话框,如图4所示:


安装Scala IDE插件

点击“Add…”按钮,打开“Add Repository”对话框,输入插件地址,如5图所示:


添加Scala IDE插件地址

全选插件的内容,完成安装,如图6所示:


安装Scala IDE插件

三、Spark源码编译与调试

1.下载Spark源码

首先,访问Spark官网http://spark.apache.org/,如图7所示。


7  Spark官网

点击“Download Spark”按钮,在下一个页面找到Git地址,如图8所示。


8  Spark官方Git地址

笔者在当前用户目录下创建Source文件夹作为放置Spark源码的地方,进入此文件夹并输入git clonegit://github.com/apache/spark.git命令将源码下载到本地,如9图所示。


9下载Spark源码

2.构建Scala应用

    进到Spark根目录,执行sbt命令。会下载和解析很多jar包,要等很长的时间,笔者大概花费了一个多小时,才执行完,如图10所示。

10  构建Scala应用

从图10可以看出,sbt构建完毕时会出现提示符>

3.使用sbt生成eclipse工程文件

    sbt命令出现提示符>后,输入eclipse命令,开始生成eclipse工程文件,也需要花费很长的时间,笔者本地大致花费了40分钟。完成时的状况,如图11所示。


11  sbt编译过程

现在我们查看Spark下的子文件夹,发现其中都生成了.project.classpath文件。比如mllib项目下就生成了.project.classpath文件,如图12所示。


12  sbt生成的项目文件

4. 编译Spark源码

    由于Spark使用Maven作为项目管理工具,所以需要将Spark项目作为Maven项目导入到Eclipse中,如13图所示:


13  导入Maven项目

点击Next按钮进入下一个对话框,如图14所示:


14  选择Maven项目

全选所有项目,点击finish按钮。这样就完成了导入,如图15所示:


15  导入完成的项目

导入完成后,需要设置每个子项目的build path。右键单击每个项目,选择“Build PathConfigure BuildPath…”,打开Build Path对话框,如图16


16  Java构建路径

Eclipse在对项目编译时,可能会出现很多错误,只要仔细分析报错原因就能一一排除。所有错误解决后运行mvn clean install,如图17所示:

图17  编译成功

5.调试Spark源码

    以Spark源码自带的JavaWordCount为例,介绍如何调试Spark源码。右键单击JavaWordCount.java,选择Debug AsJava Application”即可。如果想修改配置参数,右键单击JavaWordCount.java,选择Debug AsDebugConfigurations…”,从打开的对话框中选择JavaWordCount,在右侧标签可以修改Java执行参数、JRE、classpath、环境变量等配置,如图18所示:

图18  源码调试

读者也可以在Spark源码中设置断点,进行跟踪调试。


关于《Spark内核设计的艺术 架构设计与实现

经过近一年的准备,基于Spark2.1.0版本的《Spark内核设计的艺术 架构设计与实现》一书现已出版发行,图书如图:


纸质版售卖链接如下:
电子版售卖链接如下:
展开阅读全文

Ecplise自动关闭

02-02

大家好:rnrn 小弟写了一个Spring+Hibernate+Struts的代码,在运行的时候,Eclipse老是自动关闭,有时候点击一个文件图标试图打开这个文件就说出了内部错误要关闭,有时候自己就直接关闭了。rnrn我的配置是eclipse 3.2,jdk 1.5,myeclipse 5.5.1GArnrn.log文件中的内容如下rneclipse.buildId=M20070212-1330rnjava.version=1.5.0_11rnjava.vendor=Sun Microsystems Inc.rnBootLoader constants: OS=win32, ARCH=x86, WS=win32, NL=zh_CNrnCommand-line arguments: -os win32 -ws win32 -arch x86rnrn!ENTRY org.eclipse.wst.internet.cache 1 0 2008-02-02 17:33:41.812rn!MESSAGE wtp.autotest.noninteractive is set. Licenses dialogs will not be displayed.rnrn!ENTRY com.genuitec.eclipse.core 1 0 2008-02-02 17:33:43.625rn!MESSAGE Unable to locate .myeclipse.properties filernrn!ENTRY org.eclipse.ui 4 4 2008-02-02 17:45:22.953rn!MESSAGE Unhandled event loop exceptionrnrn!ENTRY org.eclipse.ui 4 0 2008-02-02 17:45:22.968rn!MESSAGE No more handlesrn!STACK 0rnorg.eclipse.swt.SWTError: No more handlesrn at org.eclipse.swt.SWT.error(SWT.java:3400)rn at org.eclipse.swt.SWT.error(SWT.java:3297)rn at org.eclipse.swt.SWT.error(SWT.java:3268)rn at org.eclipse.swt.widgets.Widget.error(Widget.java:435)rn at org.eclipse.swt.widgets.Menu.createHandle(Menu.java:418)rn at org.eclipse.swt.widgets.Menu.createWidget(Menu.java:505)rn at org.eclipse.swt.widgets.Menu.(Menu.java:192)rn at org.eclipse.swt.widgets.Menu.(Menu.java:122)rn at org.eclipse.swt.widgets.Menu.(Menu.java:146)rn at org.eclipse.jface.action.MenuManager.fill(MenuManager.java:226)rn at org.eclipse.jface.action.SubContributionItem.fill(SubContributionItem.java:66)rn at org.eclipse.jface.action.MenuManager.update(MenuManager.java:662)rn at org.eclipse.jface.action.MenuManager.updateAll(MenuManager.java:762)rn at org.eclipse.ui.internal.WorkbenchWindow.updateActionBars(WorkbenchWindow.java:2753)rn at org.eclipse.ui.internal.WorkbenchWindow.updateActionSets(WorkbenchWindow.java:2831)rn at org.eclipse.ui.internal.WorkbenchPage$ActionSwitcher.updateActionSets(WorkbenchPage.java:518)rn at org.eclipse.ui.internal.WorkbenchPage$ActionSwitcher.updateActivePart(WorkbenchPage.java:360)rn at org.eclipse.ui.internal.WorkbenchPage.setActivePart(WorkbenchPage.java:3205)rn at org.eclipse.ui.internal.WorkbenchPage.requestActivation(WorkbenchPage.java:2750)rn at org.eclipse.ui.internal.PartPane.requestActivation(PartPane.java:256)rn at org.eclipse.ui.internal.PartPane.handleEvent(PartPane.java:220)rn at org.eclipse.swt.widgets.EventTable.sendEvent(EventTable.java:66)rn at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:928)rn at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:952)rn at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:933)rn at org.eclipse.swt.widgets.Shell.setActiveControl(Shell.java:1199)rn at org.eclipse.swt.widgets.Shell.WM_MOUSEACTIVATE(Shell.java:1896)rn at org.eclipse.swt.widgets.Control.windowProc(Control.java:3287)rn at org.eclipse.swt.widgets.Decorations.windowProc(Decorations.java:1539)rn at org.eclipse.swt.widgets.Shell.windowProc(Shell.java:1634)rn at org.eclipse.swt.widgets.Display.windowProc(Display.java:4025)rn at org.eclipse.swt.internal.win32.OS.DefWindowProcW(Native Method)rn at org.eclipse.swt.internal.win32.OS.DefWindowProc(OS.java:1927)rn at org.eclipse.swt.widgets.Scrollable.callWindowProc(Scrollable.java:77)rn at org.eclipse.swt.widgets.Control.windowProc(Control.java:3334)rn at org.eclipse.swt.widgets.Display.windowProc(Display.java:4025)rn at org.eclipse.swt.internal.win32.OS.DefWindowProcW(Native Method)rn at org.eclipse.swt.internal.win32.OS.DefWindowProc(OS.java:1927)rn at org.eclipse.swt.widgets.Scrollable.callWindowProc(Scrollable.java:77)rn at org.eclipse.swt.widgets.Control.windowProc(Control.java:3334)rn at org.eclipse.swt.widgets.Display.windowProc(Display.java:4025)rn at org.eclipse.swt.internal.win32.OS.DefWindowProcW(Native Method)rn at org.eclipse.swt.internal.win32.OS.DefWindowProc(OS.java:1927)rn at org.eclipse.swt.widgets.Scrollable.callWindowProc(Scrollable.java:77)rn at org.eclipse.swt.widgets.Control.windowProc(Control.java:3334)rn at org.eclipse.swt.widgets.Display.windowProc(Display.java:4025)rn at org.eclipse.swt.internal.win32.OS.DefWindowProcW(Native Method)rn at org.eclipse.swt.internal.win32.OS.DefWindowProc(OS.java:1927)rn at org.eclipse.swt.widgets.Scrollable.callWindowProc(Scrollable.java:77)rn at org.eclipse.swt.widgets.Control.windowProc(Control.java:3334)rn at org.eclipse.swt.widgets.Display.windowProc(Display.java:4025)rn at org.eclipse.swt.internal.win32.OS.CallWindowProcW(Native Method)rn at org.eclipse.swt.internal.win32.OS.CallWindowProc(OS.java:1851)rn at org.eclipse.swt.widgets.Tree.callWindowProc(Tree.java:1321)rn at org.eclipse.swt.widgets.Control.windowProc(Control.java:3334)rn at org.eclipse.swt.widgets.Tree.windowProc(Tree.java:4783)rn at org.eclipse.swt.widgets.Display.windowProc(Display.java:4025)rn at org.eclipse.swt.internal.win32.OS.PeekMessageW(Native Method)rn at org.eclipse.swt.internal.win32.OS.PeekMessage(OS.java:2401)rn at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:2963)rn at org.eclipse.ui.internal.Workbench.runEventLoop(Workbench.java:1930)rn at org.eclipse.ui.internal.Workbench.runUI(Workbench.java:1894)rn at org.eclipse.ui.internal.Workbench.createAndRunWorkbench(Workbench.java:422)rn at org.eclipse.ui.PlatformUI.createAndRunWorkbench(PlatformUI.java:149)rn at org.eclipse.ui.internal.ide.IDEApplication.run(IDEApplication.java:95)rn at org.eclipse.core.internal.runtime.PlatformActivator$1.run(PlatformActivator.java:78)rn at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.runApplication(EclipseAppLauncher.java:92)rn at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.start(EclipseAppLauncher.java:68)rn at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:400)rn at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:177)rn at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)rn at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)rn at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)rn at java.lang.reflect.Method.invoke(Unknown Source)rn at org.eclipse.core.launcher.Main.invokeFramework(Main.java:336)rn at org.eclipse.core.launcher.Main.basicRun(Main.java:280)rn at org.eclipse.core.launcher.Main.run(Main.java:977)rn at org.eclipse.core.launcher.Main.main(Main.java:952)rnrnrn请大家帮忙,解决后立即加分rn 论坛

没有更多推荐了,返回首页