IDEA 编译:Saprk 2.2 上的WordCount

IDEA搭建Spark+Scala环境
本文介绍如何在IntelliJ IDEA中配置Scala环境并创建Spark项目,解决因Scala版本不同导致的编译错误问题。

本地编译

IDEA需要添加scala插件,本机环境需要有scala环境
本地: Scala 2.12
集群: Spark 2.11 Scala 2.11.8


在IDEA上创建Scala项目 最简单的WordCount代码 :

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

object WordCount {
  def main(args: Array[String]): Unit = {
    if (args.length < 2) {
      System.err.print("Usage: WordCount")
      System.exit(1)
    }

    val conf = new SparkConf()
    val sc = new SparkContext(conf)
    val line = sc.textFile(args(0))


    //输出到文件
    line.flatMap(_.split(" ")).map((_, 1)).reduceByKey(_ + _).saveAsTextFile(args(1))
    //输出到屏幕
    line.flatMap(_.split(" ")).map((_, 1)).reduceByKey(_ + _).collect().foreach(println)
  }
}

注意:编写代码的时候需要导入一个依赖包:spark-assembly-1.6.3-hadoop2.6.0
!注意:这个依赖包原本是在 spark-hadoop.gz (就是官网下的Saprk下载地址),的lib之中,但是现在Saprk在2.0之后已经把lib文件夹拆分,对应的 Jar 依赖也找不到了,所以我们需要在旧版本的文件中寻找依赖,我用的是 Spark 1.6 版本下的依赖包!


在IDEA中选择 Project Stucture -> Libaries 选择添加依赖
在Artifactis中选择压缩成jar: Artifactis -> Jar ->From moudles…
这个都很简单

接着把对应生成的 jar 传入系统中的linux 里头。

记着要提前开启hadoop 和 spark 集群
使用以下命令:

./bin/spark-submit --master spark://192.168.244.129:7077 --class WordCount /home/hadoop/Public/scalaforspark.jar hdfs://192.168.244.129:9001/user/spark/wordcount/input/README.txt hdfs://192.168.244.129:9001/user/spark/wordcount/output

结果:

(package,1)
(this,1)
(Version"](http://spark.apache.org/docs/latest/building-spark.html#specifying-the-hadoop-version),1)
(Because,1)
(Python,2)
(page](http://spark.apache.org/documentation.html).,1)
(cluster.,1)
([run,1)
(its,1)
(YARN,,1)
(have,1)
(general,3)
(pre-built,1)
(locally,2)
(locally.,1)
(changed,1)
(sc.parallelize(1,1)
(only,1)
(Configuration,1)
...

说下遇到的问题:

Exception in thread "main" java.lang.BootstrapMethodError: java.lang.NoClassDefFoundError: scala/runtime/java8/JFunction1$mcII$sp
    at com.henvealf.spark.learn.mapPartitonsTest$.main(mapPartitonsTest.scala:33)
    at com.henvealf.spark.learn.mapPartitonsTest.main(mapPartitonsTest.scala)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at org.apache.spark.deploy.SparkSubmit$.org$apache$spark$deploy$SparkSubmit$$runMain(SparkSubmit.scala:736)
    at org.apache.spark.deploy.SparkSubmit$.doRunMain$1(SparkSubmit.scala:185)
    at org.apache.spark.deploy.SparkSubmit$.submit(SparkSubmit.scala:210)
    at org.apache.spark.deploy.SparkSubmit$.main(SparkSubmit.scala:124)
    at org.apache.spark.deploy.SparkSubmit.main(SparkSubmit.scala)
Caused by: java.lang.NoClassDefFoundError: scala/runtime/java8/JFunction1$mcII$sp
    ... 11 more
Caused by: java.lang.ClassNotFoundException: scala.runtime.java8.JFunction1$mcII$sp
    at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
    ... 11 more

这是由于版本不匹配造成的:
本地: Scala 2.12
集群: Spark 2.11 Scala 2.11.8
把本地的Scala 改成 2.11.8 重新打包, 记住要把原来的Scala 2.12 SDK 换成 Scala 2.11.8 SDK

再次运行,成功!

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值