用IDEA开发基于Spark3.4.1和Scala2.12.18的Spark项目的sbt方式配置,超详细哦

注:本次我用到的Scala版本为Scala2.12.18版本,Spark版本为3.4.1版本,IDEA版本为IntelliJ IDEA 2019.2.3 x64版本(IDEA版本如果是其它的版本的话,可能有些许地方不一样,但都是同样的道理) 

下载安装Scala2.12.18

The Scala Programming Language

打开上面的网址,点击install

跳转后找到下图所示的地方点进去 

找到Scala2.12.18版本点进去

下滑找到Windows平台的zip包下载

下载下来解压到任意一个地方,最好是放在此处之后不再移动,因为要配环境变量,移动了后要重新配环境变量

如果是Win11系统请打开设置照下面的顺序点进去

在用户变量里点击新建(要配置系统变量也行,同样的操作)

找下面图中的内容输入变量名,点击浏览目录,到解压的目录的bin文件夹所在的同级路径下点击确定再确定 

点击Path点编辑

点击新建,加入如图所示内容,点击确认、确认再确认即可

win+R输入cmd回车,在命令框输入scala -version回车,出现如图情况说明成功了(直接键入scala就可以在命令行写scala程序了,要退出来键入:quit回车即可,scala编程这里就不介绍了,感兴趣的可以自己去学习哦)

打开IDEA,然后安装scala插件,按如下图示,先点击配置(configure),然后点击插件(plugin)

然后再搜索框输入scala,安装如下图标的插件,如果没有安装过会显示install按钮,如果已经安转过的就会像我的一样显示installed,安装好后点击OK回到主界面,然后重启IDEA

重新打开IDEA,新建项目

照下图点击操作

图中的名称、地址自己填,唯独注意的是jdk版本选择自己当前所安装的jdk(建议jdk1.8以上,如果没安装好jdk的请先安装好哦),sbt版本用默认就行(IDEA版本和我一样的就像我一样即可),scala版本选择2.12.18版本,最后点击finally

进去后等待构建成功

配置sbt依赖

这里只演示基于sbt添加spark-sql和spark-core依赖,其它的依赖自己添加即可

展开项目,在build.sbt文件里配置

添加如下配置,其中包含了将国外源改为国内的阿里源,然后点击如图所示位置下载依赖

name := "SparkSbt"

version := "0.1"

scalaVersion := "2.12.18"
lazy val root = (project in file("."))
  .settings(
    // 指定国内源
    resolvers += "central" at "https://maven.aliyun.com/repository/public",
    // 屏蔽默认的maven central源
    externalResolvers := Resolver.combineDefaultResolvers(resolvers.value.toVector, mavenCentral = false),
    updateOptions := updateOptions.value.withCachedResolution(true),
    libraryDependencies += "org.apache.spark" %% "spark-core" % "3.4.1",
    libraryDependencies += "org.apache.spark" %% "spark-sql" % "3.4.1"
  )

等待成功即可

创建Spark项目结构如下,一般在scala下创建包,再在包中创建Spark项目

在创建好的包下创建项目

代码测试,写好后点一下代码界面,右键点运行

package Test

import org.apache.spark.{SparkConf, SparkContext}

object RDD {
  def main(args:Array[String]): Unit ={

    //创建SparkContext对象
    val conf = new SparkConf().setAppName("RDDtest1").setMaster("local[2]")
    val sc = new SparkContext(conf)
    // Spark处理逻辑代码
    val datas = Array(8,10,3,9,5)
    val distData = sc.parallelize(datas)
    val i: Int = distData.reduce((a, b) => a + b)
    //关闭SparkContext对象
    println(i)
    sc.stop()
  }

}

运行如下图,结果正确

至此,教程完毕。 

我这个是在Ubuntu运行sbt run发生的 root@Ubuntu:/home/rt/chisel-examples/hello-world# sbt run [info] welcome to sbt 1.10.11 (Ubuntu Java 21.0.6) [info] loading project definition from /home/rt/chisel-examples/hello-world/project [info] loading settings for project hello-world from build.sbt... [info] set current project to hello-world (in build file:/home/rt/chisel-examples/hello-world/) [info] compiling 1 Scala source to /home/rt/chisel-examples/hello-world/target/scala-2.12/classes ... [info] Non-compiled module &#39;compiler-bridge_2.12&#39; for Scala 2.12.15. Compiling... error: bad constant pool index: 0 at pos: 48454emental 2s while compiling: <no file> during phase: globalPhase=<no phase>, enteringPhase=<some phase> library version: version 2.12.15 compiler version: version 2.12.15 reconstructed args: -bootclasspath /root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala-library/2.12.15/scala-library-2.12.15.jar -nowarn -classpath /root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/compiler-interface/1.10.8/compiler-interface-1.10.8.jar:/root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/util-interface/1.10.7/util-interface-1.10.7.jar:/root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/compiler-bridge_2.12/1.10.8/compiler-bridge_2.12-1.10.8-sources.jar:/root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala-compiler/2.12.15/scala-compiler-2.12.15.jar:/root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala-reflect/2.12.15/scala-reflect-2.12.15.jar:/root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/modules/scala-xml_2.12/1.0.6/scala-xml_2.12-1.0.6.jar:/root/.cache/coursier/v1/https/repo1.maven.org/maven2/jline/jline/2.14.6/jline-2.14.6.jar -d /tmp/sbt_bc12c207 -Xmaxwarns 0 last tree to typer: EmptyTree tree position: <unknown> tree tpe: <notype> symbol: null call site: <none> in <none> =
03-27
<think>好的,我现在需要解决用户在Ubuntu上运行sbt时遇到的编译错误,具体是“bad constant pool index”问题,使用的Scala版本是2.12.15。首先,我需要理解这个错误的原因。 根据用户提供的引用内容,尤其是引用[2]提到SBT支持跨版本编译,可以设置不同的Scala版本。而引用[3][4]中使用的Scala版本是2.12.18,这可能暗示版本兼容性问题。用户当前使用的是2.12.15,可能存在与某些依赖库的版本冲突,导致常量池索引错误。 接下来,我应该考虑几个可能的原因。首先,检查项目Scala版本是否与其他依赖库兼容。例如,如果某些库是为更高版本的Scala编译的,可能会引发此类问题。其次,检查JDK版本是否与Scala 2.12.15兼容。Scala 2.12通常需要JDK 8或11,如果用户使用的是更新的JDK版本,可能会出现兼容性问题。 另外,清理sbt的缓存也是一个常见的解决步骤,因为旧的缓存文件可能损坏或与新设置冲突。用户可以通过删除`target`目录`sbt.boot`目录来清理缓存。此外,确保项目中的交叉编译设置正确,支持当前的Scala版本,如引用[2]中提到的设置`supportedScalaVersions`。 如果问题依旧,可能需要升级Scala版本到2.12.18,如引用[3][4]中的版本,或者检查依赖库是否有更新版本兼容当前Scala版本。同时,检查IDE(如IDEA)中的Scala插件是否与项目版本一致,避免版本不匹配导致的语法问题,如引用[1]所述。 最后,如果所有方法都无效,建议用户提供完整的错误日志`build.sbt`文件内容,以便更精准地诊断问题。</think>### 逐步解决方案 #### 1. **确认Scala版本与依赖兼容性** - **检查`build.sbt`中的Scala版本声明**: ```scala scalaVersion := "2.12.15" // 确保此处与本地安装的Scala版本一致 ``` 若本地安装的是其他版本(如2.12.18),需同步修改[^3][^4]。 - **检查依赖库的Scala版本兼容性**:部分库可能仅支持特定Scala版本。例如,Spark 3.4.1要求Scala 2.12.18[^5],若使用2.12.15可能引发冲突。 #### 2. **清理sbt缓存** ```bash # 进入项目目录后执行 sbt clean # 清理编译缓存 rm -rf ~/.sbt # 删除全局sbt配置缓存(谨慎操作,会重置sbt设置) rm -rf ~/.ivy2/cache # 清理依赖缓存 ``` #### 3. **升级Scala版本** - 将`build.sbt`中的Scala版本调整为更稳定的2.12.18(与Spark 3.4.1兼容): ```scala scalaVersion := "2.12.18" ``` #### 4. **检查JDK版本** - Scala 2.12.x要求**JDK 8或11**,若使用JDK 17+可能引发`bad constant pool index`错误: ```bash java -version # 确认JDK版本 ``` - 若版本不匹配,通过以下方式切换: ```bash sudo update-alternatives --config java # 选择兼容的JDK版本 ``` #### 5. **检查交叉编译设置** -项目支持多版本Scala编译,需在`build.sbt`中明确声明支持的版本范围[^2]: ```scala crossScalaVersions := Seq("2.12.15", "2.12.18") // 添加兼容版本 ``` #### 6. **检查IDE插件一致性** - 确保IDEAScala插件版本与项目Scala版本匹配(如IDEA 2019.2.3对应Scala 2.12.x)[^3]。 #### 7. **验证依赖冲突** - 执行`sbt dependencyTree`查看依赖树,检查是否有版本冲突: ```bash sbt dependencyTree > dependencies.txt ``` - 若存在冲突,通过`exclude`排除旧版本依赖: ```scala libraryDependencies += ("org.example" % "module" % "1.0").exclude("org.conflict", "artifact") ``` --- ### 常见错误场景与修复示例 #### 场景1Spark依赖与Scala版本不匹配 ```scala // build.sbt错误配置示例 libraryDependencies += "org.apache.spark" %% "spark-core" % "3.4.1" // 需要Scala 2.12.18 ``` **修复**:升级Scala版本至2.12.18或降级Spark至适配2.12.15的版本。 #### 场景2:JDK版本过高 ```log 错误信息: java.lang.ClassFormatError: Bad constant pool index ``` **修复**:切换至JDK 8或11--- ### 相关问题 1. **如何排查sbt项目的依赖冲突?** > 使用`sbt dependencyTree`生成依赖树,或通过`sbt evicted`查看被排除的版本[^2]。 2. **如何在Ubuntu上管理多个JDK版本?** > 使用`update-alternatives --config java`切换默认JDK。 3. **为什么需要配置SBT的交叉编译?** > 跨版本编译确保代码在不同Scala版本下兼容。 4. **IDEA中如何正确关联Scala SDK?** > 在Project Structure中手动指定SDK路径,确保与`build.sbt`中的版本一致[^1]。 --- ### 引用 [^1]: Scala版本与IDE插件不匹配会导致语法解析错误。 : SBT通过`crossScalaVersions`支持多版本编译。 : Spark 3.4.1需搭配Scala 2.12.18。 [^4]: IDEA需正确配置Scala插件SDK路径。 : Spark RDD代码需兼容Scala版本。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

長琹

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值