1.【Gradle jvm插件系列4】 scala插件权威详解
2.Intellij IDEA使用Maven构建Scala开发环境
3.idea实用系列4使用Maven构建Scala项目
4.lift简介
5.scala manifeståclassmanifestçåºå«
6.Spark-Submit 源码剖析
【Gradle jvm插件系列4】 scala插件权威详解
Scala插件是目源码Gradle JVM插件的重要扩展,它专为Scala项目设计,源码支持混合编译Java和Scala代码。分析通过双向依赖关系,目源码你可以自由选择使用哪种语言编写,源码根据需要转换代码。分析q群 裂变源码此外,目源码它还允许你利用API/实现分离,源码利用java-library插件为Scala项目提供额外功能。分析
使用Scala插件非常简单,目源码只需在构建脚本中包含相关配置。源码例如,分析你可以在示例1中找到如何引入和配置插件的目源码基本步骤。它为项目添加了ScalaCompile和ScalaDoc任务,源码并对Java编译任务的分析依赖进行了调整。
项目布局方面,Scala插件假设存在可包含Scala和Java源代码的目录,但并不强制。自定义布局支持,如示例2所示。依赖管理上,生产代码需要声明scala-library或scala3-library_3,测试代码则分别添加到相应的java dubbo 源码配置。
配置Zinc编译器是关键步骤,Scala插件会自动推断或根据需要配置scalaClasspath,以确保编译器和工具的正确版本。对于不同版本的Gradle和Scala,兼容性表如表2提供了参考。
除了基本配置,Scala插件还允许添加编译器插件,扩展源集属性,并处理目标字节码级别和Java API版本,确保编译时的兼容性和效率。例如,表3列出了源集属性的更改,表4则解释了Scala编译器参数的计算规则。
在外部进程中编译和增量编译也是重要特性,它们能大幅减少编译时间。默认情况下,Scala插件启用增量编译,但可通过设置force属性强制重新编译所有代码。关于联合编译和依赖分析的细节,你可以在相关部分找到。
最后,Eclipse和IntelliJ IDEA集成则提供了与各自IDE的大足林源码无缝集成,如添加Scala nature和Scala SDK,以支持Scala项目在这些开发环境中的顺畅工作。
Intellij IDEA使用Maven构建Scala开发环境
在开发Scala项目时,选择合适的IDE与构建工具至关重要。根据Scala官方指南,建议使用Intellij IDEA与sbt作为开发与构建工具。然而,sbt默认依赖国外Maven仓库,导致国内用户下载速度缓慢。为了解决这一问题,推荐采用Intellij IDEA配合Scala插件与Maven构建Scala开发环境。
一、背景:考虑到国内用户面临的下载延迟问题,使用Intellij IDEA、Scala插件和Maven构建Scala项目,是更为高效且便捷的解决方案。Maven作为构建工具,能够帮助开发者管理依赖、编译代码和执行测试,而Intellij IDEA与Scala插件则提供了友好的开发环境。
二、软件安装:首先,golang leaf源码确保已安装最新版本的Intellij IDEA,通过官网下载并按照指示完成安装。对于Scala插件,同样在Intellij IDEA中通过Marketplace安装,搜索并下载“Scala”插件以增强IDEA的Scala开发功能。
三、配置:配置关键在于引入Scala编译插件和SDK。
说明1:安装scala-maven-plugin是构建Scala项目的关键步骤。此插件允许Maven编译Scala源代码,确保构建流程顺利进行。
说明2:安装scala-library组件,目的是让IDEA的Scala插件自动添加Scala SDK。这样,开发者无需手动指定SDK路径,简化了配置过程,提高开发效率。
通过以上步骤,构建了一个针对国内用户优化的Scala开发环境。使用Intellij IDEA、Scala插件与Maven的组合,不仅解决了国外Maven仓库下载延迟的问题,还为开发者提供了高效、注册后端源码便捷的开发体验。这一配置不仅适用于初学者,也能满足有经验开发者的需求,为Scala项目开发提供强大的支持。
idea实用系列4使用Maven构建Scala项目
借助Maven构建Scala项目可简化整个流程,因为它倾向于使用约定而非繁杂配置。Maven通过分析pom.xml文件,使得开发者能快速理解项目的结构和配置。
要构建Scala项目,通常采用Scala Maven插件。它作为最流行的Scala项目构建工具,自动从中央仓库下载Scala和其他依赖项,无需额外安装。
在Linux(如Debian)系统中,利用apt-get命令即可轻松安装Maven。通过下载并解压Maven文件,然后配置到环境变量中,Windows和Red Hat Linux用户也能简便安装Maven。
为创建Scala项目,Maven提供了一个便于使用的archetype。运行archetype插件时,Maven会下载核心依赖。随后,用户只需提供一些基础信息,如groupId、artifactId和package,就能生成包含Scala和测试框架(JUnit、ScalaTest和Specs2)的初始项目结构。
项目创建后,会在当前目录下生成一个新文件夹,用于存放项目代码和测试文件。Maven管理依赖,确保项目运行所需的所有库都已正确下载。在编写代码之前,项目目录将包含一个pom.xml文件,明确项目依赖关系和构建目标。
项目结构包括src(存放源代码)和test(存放测试代码)文件夹,以及一个用于存放构建产物的target文件夹。在src文件夹内,进一步组织代码结构,通常包括主代码和测试代码。构建文件通过mvn package命令生成。
若需创建包含附加属性的Jar文件,添加Maven Assembly插件能实现这一目标,简化构建过程。
常用Maven命令,如mvn dependency:copy-dependencies, mvn clean, mvn package等,使得项目管理更加高效。添加依赖项时,根据项目需求在pom.xml中输入相应的Maven坐标。
其他有关Maven的深入阅读和资源可通过访问其官方文档和相关社区获得,提供全面指导与案例解析。
lift简介
Lift, 通常称为LiftWeb,是一个专为构建Web应用程序设计的框架。它在Scala编程语言的基石上构筑,特别适用于需要高度可扩展性的应用服务器,如Apache Geronimo。Scala的优势在于,它的编译方式能够生成与Java™语言极其相似的字节码,进而无缝融入Java平台。[1] Lift以其优雅的特性著称,它是一个基于Scala的开放源代码项目,采用Apache 2.0许可证发布。这个框架为开发者提供了创建交互式和高性能Web应用的理想平台。利用Lift构建的应用程序能够打包成WAR文件,轻松部署到诸如Jetty、Tomcat和Weblogic等流行的J2EE容器中。这使得基于Lift的应用不仅具有出色的性能,还能充分利用现有的Java库资源,极大地提升了开发效率和应用的兼容性。扩展资料
lift是一个非常优雅的web框架,基于Scala编程语言,使用Apache 2.0 license许可发布。lift 提供开发者最好的方式创建交互的,高性能的web应用。scala manifeståclassmanifestçåºå«
Manifestæ¯scala2.8å¼å ¥çä¸ä¸ªç¹è´¨ï¼ç¨äºç¼è¯å¨å¨è¿è¡æ¶ä¹è½è·åæ³åç±»åçä¿¡æ¯ãå¨JVMä¸ï¼æ³ååæ°ç±»åTå¨è¿è¡æ¶æ¯è¢«âæ¦æâæçï¼ç¼è¯å¨æTå½ä½Objectæ¥å¯¹å¾ ï¼æ以Tçå ·ä½ä¿¡æ¯æ¯æ æ³å¾å°çï¼ä¸ºäºä½¿å¾å¨è¿è¡æ¶å¾å°Tçä¿¡æ¯ï¼scalaéè¦é¢å¤éè¿Manifestæ¥åå¨Tçä¿¡æ¯ï¼å¹¶ä½ä¸ºåæ°ç¨å¨æ¹æ³çè¿è¡æ¶ä¸ä¸æã
def test[T] (x:T, m:Manifest[T]) { ... }
æäºManifest[T]è¿ä¸ªè®°å½Tç±»åä¿¡æ¯çåæ°mï¼å¨è¿è¡æ¶å°±å¯ä»¥æ ¹æ®mæ¥æ´åç¡®çå¤æTäºãä½å¦ææ¯ä¸ªæ¹æ³é½è¿ä¹åï¼è®©æ¹æ³çè°ç¨è è¦é¢å¤ä¼ å ¥måæ°ï¼é常ä¸å好ï¼ä¸å¯¹æ¹æ³ç设计æ¯ä¸é伤ç¤ã好å¨scalaä¸æéå¼è½¬æ¢ãéå¼åæ°çåè½ï¼å¨è¿ä¸ªå°æ¹å¯ä»¥ç¨éå¼åæ°æ¥åè½»è°ç¨è ç麻ç¦ã
è·åclass manifestsç两ç§åºæ¬æ¹å¼:
1 def classOf[T <: Any](implicit m: scala.reflect.Manifest[T]): Class[T] = m.erasure.asInstanceOf[Class[Tï¼½
éè¿implicit m: scala.reflect.Manifest[T]声æä¸ä¸ªéå¼åæ°ï¼è¿æ ·scalaç¼è¯å¨è½å¨ç¼è¯æ¶æä¾Tçç±»åä¿¡æ¯äº
2 def classOf[T <: Any : Manifest] : Class[T] = manifest[T].erasure.asInstanceOf[Class[Tï¼½
å ¶ä¸ T <: Any : Manifestï¼æåæ两é¨åæ¥ç
T <: Any
T æ¯Anyçåç±»åï¼å³å¯ä»¥æ¯ä»»æåºæ¬ç±»åscala.AnyVal åå¼ç¨ç±»å scala.AnyRef)
T : Manifest ç¸å½äºå¯¹classOf æ¹æ³currying
éå¼å¢å åæ°å表å¦ä¸ï¼(implicit evidence$1: Manifest[T])ï¼
éè¿manifest[T] æ¹æ³å³å¯è·åManifestå®ä¾
å¯è§å½¢å¼1 åå½¢å¼2å®è´¨æ¯ä¸æ ·çã
åºç¨ï¼
1æ常è§çæ¯è·åç±»ååæ°çClassï¼å½¢å¦someMethod[Type]
å¦akkaä¸æºç ï¼ def actorOf[T <: Actor : Manifest]: ActorRef = actorOf(manifest[T].erasure.asInstanceOf[Class[_ <: Actorï¼½)
class Worker extends Actor {
def receive = {
case Work(start, nrOfElements) =>
self reply Result(calculatePiFor(start, nrOfElements)) // perform the work
}
}
å°±å¯ä»¥å¦æ¤ä½¿ç¨äºï¼ val workerActorRef = actorOf[Worker]
2 ç¼ç¨æ¹å¼å建èåæ°ç»
def evenElems[T: ClassManifest](xs: Vector[T]): Array[T] = {
val arr = new Array[T]((xs.length + 1) / 2)
for (i <- 0 until xs.length by 2)
arr(i / 2) = xs(i)
arr
}
scala> evenElems(Vector("a","b","c"))
res: Array[java.lang.String] = Array(a, c)
Spark-Submit 源码剖析
直奔主题吧:
常规Spark提交任务脚本如下:
其中几个关键的参数:
再看下cluster.conf配置参数,如下:
spark-submit提交一个job到spark集群中,大致的经历三个过程:
代码总Main入口如下:
Main支持两种模式CLI:SparkSubmit;SparkClass
首先是checkArgument做参数校验
而sparksubmit则是通过buildCommand来创建
buildCommand核心是AbstractCommandBuilder类
继续往下剥洋葱AbstractCommandBuilder如下:
定义Spark命令创建的方法一个抽象类,SparkSubmitCommandBuilder刚好是实现类如下
SparkSubmit种类可以分为以上6种。SparkSubmitCommandBuilder有两个构造方法有参数和无参数:
有参数中根据参数传入拆分三种方式,然后通过OptionParser解析Args,构造参数创建对象后核心方法是通过buildCommand,而buildCommand又是通过buildSparkSubmitCommand来生成具体提交。
buildSparkSubmitCommand会返回List的命令集合,分为两个部分去创建此List,
第一个如下加入Driver_memory参数
第二个是通过buildSparkSubmitArgs方法构建的具体参数是MASTER,DEPLOY_MODE,FILES,CLASS等等,这些就和我们上面截图中是对应上的。是通过OptionParser方式获取到。
那么到这里的话buildCommand就生成了一个完成sparksubmit参数的命令List
而生成命令之后执行的任务开启点在org.apache.spark.deploy.SparkSubmit.scala
继续往下剥洋葱SparkSubmit.scala代码入口如下:
SparkSubmit,kill,request都支持,后两个方法知识支持standalone和Mesos集群方式下。dosubmit作为函数入口,其中第一步是初始化LOG,然后初始化解析参数涉及到类
SparkSubmitArguments作为参数初始化类,继承SparkSubmitArgumentsParser类
其中env是测试用的,参数解析如下,parse方法继承了SparkSubmitArgumentsParser解析函数查找 args 中设置的--选项和值并解析为 name 和 value ,如 --master yarn-client 会被解析为值为 --master 的 name 和值为 yarn-client 的 value 。
这之后调用SparkSubmitArguments#handle(MASTER, "yarn-client")进行处理。
这个函数也很简单,根据参数 opt 及 value,设置各个成员的值。接上例,parse 中调用 handle("--master", "yarn-client")后,在 handle 函数中,master 成员将被赋值为 yarn-client。
回到SparkSubmit.scala通过SparkSubmitArguments生成了args,然后调用action来匹配动作是submit,kill,request_status,print_version。
直接看submit的action,doRunMain执行入口
其中prepareSubmitEnvironment初始化环境变量该方法返回一个四元 Tuple ,分别表示子进程参数、子进程 classpath 列表、系统属性 map 、子进程 main 方法。完成了提交环境的准备工作之后,接下来就将启动子进程。
runMain则是执行入口,入参则是执行参数SparkSubmitArguments
Main执行非常的简单:几个核心步骤
先是打印一串日志(可忽略),然后是创建了loader是把依赖包jar全部导入到项目中
然后是MainClass的生成,异常处理是ClassNotFoundException和NoClassDeffoundError
再者是生成Application,根据MainClass生成APP,最后调用start执行
具体执行是SparkApplication.scala,那么继续往下剥~
仔细阅读下SparkApplication还是挺深的,所以打算另外写篇继续深入研读~