在虚拟机使用idea sbt工程本地模式运行spark wordcount程序,报错Module ‘Main‘ production: sbt.internal.inc.CompileFailed

我在做《Spark与集群技术》实验中的wordcount中出现了如图问题,因为之前一直在hadoop集群相关实验遇到最多的问题是 库之间的版本不兼容。我开始就是这样认为的,当实际是版本没问题,而是虚拟机的idea反应慢,没有将所需的依赖导入完成。

以下是我的版本配置:

Spark 2.4.0

Scala 2.12.19

jdk11
这个配置是没问题的。

解决方案是多尝试几次如下实验流程(亲测有效)

实验流程:

1.File  --> Settings 

下载scala插件,下载完后会出现一个restart,点击restart重启idea即可

2.File --> new --> project

下载完插件scala后新建工程会多出scala这一栏

我们一般都是jdk1.8,这里是jdk11,没有的直接载idea里面下载。

3.

我们创建完后,左上角会提示我们 没有Scala sdk ,问题不大,点击右上角的Setup Scala SDK
下载我们需要的版本scala 2.12.19

4.

下载完后还需更改,build.sbt里的内容如图

name := "Main"

version := "0.1"

scalaVersion := "2.12.19"

libraryDependencies += "org.apache.spark" %% "spark-core" % "2.4.0"

记住更改完后,记得点击图右上角的我用红框标注的地方,开始导入我们所需的依赖,这里需要同学们有耐心,因为在虚拟机中导入慢,idea反应慢,一定要等到它导入完依赖,否则在没有导入完后就运行spark wordcount程序会出现我的错误。

运行结果:


附上wordcount代码,文件地址记得改成自己的呦0.o

object WordCount {
  import org.apache.spark.rdd.RDD
  import org.apache.spark.{SparkConf, SparkContext}

  def main(args: Array[String]): Unit = {
    //1.创建SparkConf对象,设置appName和Master地址
    val sparkconf = new SparkConf().setAppName("wordCount").setMaster("local[2]")
    //2.创建SparkContext对象,它是所有任务计算的源头,它会创建DAGScheduler和TaskScheduler
    val sparkContext = new SparkContext(sparkconf)
    //设置日志级别
    //sparkContext.setLogLevel("WARN")
    //3.读取数据文件,RDD可以简单的理解为是一个集合,集合中存放的元素是String类型
    val data : RDD[String] = sparkContext.textFile("要统计单词文件地址")
    //4.切分每一行,获取所有的单词
    val words :RDD[String] = data.flatMap(_.split(" "))
    //5.每个单词记为1,转换为(单词,1)
    val wordAndOne :RDD[(String, Int)] = words.map(x =>(x,1))
    //6.相同单词汇总,前一个下划线表示累加数据,后一个下划线表示新数据
    val result: RDD[(String, Int)] = wordAndOne.reduceByKey(_+_)
    //7.收集打印结果数据:从分布式内存中收集计算结果,是一个数组
    val finalResult: Array[(String, Int)] = result.collect()
    //将定长数组转为不定长数组,并打印每个元素后换行
    finalResult.foreach{ case (word, count) => println(s"$word: $count\n") }
    //8.关闭sparkContext对象
    sparkContext.stop()
  }
}

小知识分享:sparkContext.textFIle()中,总的来说有两个参数,分别是文件的路径和最小分区数,文件的路径可以是文档、文件夹、一个包含多个文件路径的列表和使用通配符来匹配多个文件。最小分区数也就是(minPartitions参数),minPartitions 参数在 Spark 中用于指定 RDD 的最小分区数。当使用 sc.textFile 方法读取文本文件时,Spark 会将文件分割成多个分区,每个分区由一个或多个记录组成。minPartitions 参数可以帮助你控制分区的数量,从而影响数据处理的并行度。分区数不应该太小,否则可能会导致单个分区过大,影响处理效率。同样,分区数也不应该太大,否则可能会导致每个分区过小,增加调度开销。

### 导致 `sbt internal inc CompileFailed` 的原因 `sbt internal inc CompileFailed` 是一个常见的 SBT 编译错误,通常表示模块的生产代码未能成功编译。这种问题可能由多种因素引起,包括但不限于以下几点: 1. **Scala 和 JDK 版本不兼容** 如果使用的 Scala 版本与 JDK 不匹配,则可能导致编译失败。例如,某些 Scala 版本仅支持特定范围内的 JDK 版本[^2]。 2. **依赖项缺失或冲突** 项目中的 Maven 或 SBT 配置文件(如 `pom.xml` 或 `build.sbt`)可能存在未声明的依赖项,或者存在版本冲突的情况。例如,缺少 Janino 库可能会引发类似的异常[^1]。 3. **构建配置错误** 构建工具的配置文件(如 `build.sbt`)中可能出现语法错误或其他不当设置。例如,指定的库版本过旧或不存在也可能导致此问题[^3]。 4. **源码本身存在问题** 如果项目的源代码中有语法错误、逻辑错误或不符合当前环境的要求,则也会触发该错误。 --- ### 解决方案 #### 方法一:检查并调整 Scala 和 JDK 版本 确保所选的 Scala 版本与其对应的 JDK 版本相匹配。可以通过修改 IDE 设置来完成这一操作。具体来说: -IntelliJ IDEA 中,进入 `File -> Project Structure -> Project Settings -> Modules`,确认 Scala SDK 是否正确安装。 - 同时,验证 Java Target Version 是否满足需求,建议将其设为 `-target:jvm-1.8` 或更高版本以适应现代开发环境。 #### 方法二:完善依赖管理 对于因缺乏必要依赖而产生的问题,需仔细审查 `build.sbt` 文件的内容。以下是推荐的一个基础配置模板供参考: ```scala name := "Main" version := "0.1" scalaVersion := "2.12.19" libraryDependencies ++= Seq( "org.apache.spark" %% "spark-core" % "2.4.0", "org.codehaus.janino" % "janino" % "3.0.8" // 添加 janino 支持 ) ``` 上述代码片段展示了如何引入 Spark Core 及其所需的额外组件——Janino 来处理动态编译场景下的潜在缺陷。 #### 方法三:清理缓存重试 有时本地缓存的数据会干扰正常流程执行,因此可以尝试清除这些数据后再重新运行命令: ```bash rm -rf ~/.ivy2/cache/ sbt clean compile ``` 通过删除 `.ivy2/cache/` 下的所有内容再发起新的构建过程,有助于排除由于残留垃圾引起的不稳定状况。 #### 方法四:排查源码质量 最后一步便是逐一分析每一部分业务实现是否存在隐患之处;尤其是当继承自废弃接口 (`Application`) 而非标准入口类(`App`)时更应格外留意此类变更带来的连锁反应。 --- ### 总结 综上所述,针对 `sbt internal inc CompileFailed` 错误可以从四个方面入手解决问题:一是核验语言级别参数设定是否合理;二是补充遗漏的关键外部资源引用关系;三是借助强制刷新机制消除历史遗留影响;四是细致梳理内部算法表达形式避免低级失误发生。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值