跳转至

Spark编译

源码下载: https://spark.apache.org/downloads.html 注意: 1. Choose a Spark release:3.2.3(Nov 28,2022) 这里是3.2版本,之所以不选择3.3是因为3.3兼容性不好,各种支持,版本配置有许多问题,比如不适合Intelij 2. Choose a package type:Source Code 既然要魔改,自然是要用源码来编程 3. Download Spark:spark-3.2.3.tgz 下载在windows本地就行,编译是在windows上,运行考虑在linux上进行. 4. 安装InteliJ,有学生版免费,直接下ultimate,不用扣扣索索用社区版 5. 需要配置java 1.8.0,直接在IDEA里面自助下载环境就行,scala支持在插件里面下载,sbt那些不要管,maven命令会自己给你下好,scala要用最新的.

官方编译文档: https://spark.apache.org/docs/latest/building-spark.html#building-a-runnable-distribution

^1Spark参考教程 请先按这个参考教程配置POM,否则编译必错无疑,其中最为可恶的就是Failed to execute goal net.alchim31.maven:scala-maven-plugin

^2net.alchim31.maven报错 不要按这个参考教程来,你乱插dependency没用,而且语法也不对,这里主要是要在pom.xml里找net.alchim31.maven这个字段,只有三个条目,找到有version的地方,改成3.2.2(或者保留4.3.0也可以,注意只改有version的地方)即可.

编译命令: 在Spark源码根目录下打开GitBash

./build/mvn -Phadoop-3.2 -Pyarn -Dhadoop.version=3.2.2 -Phive -Phive-thriftserver -DskipTests clean package

此处需要20min,这个命令会自动将各种依赖包安装好,所以会占网络资源,需要在maven的settings里面配置阿里云镜像,参照^3. image

./dev/make-distribution.sh \ --name spark-3.2.3 \ --tgz -Phive \ -Phive-thriftserver \ -Pyarn -Phadoop-3.2 \ -Dhadoop.version=3.2.2 \ -Dscala.version=2.12.14

此处需要15min image

成功会在目录下产生spark-3.2.3-bin-spark-3.2.3.tgz,解压文件的目录下面就是编译成功的结果.

hadoop环境配置

这里主要参照^4,你只要按这个里面的傻瓜操作就行。 注意java版本都是1.8-361+ 这里配好后Yarn也一并完成了,Hadoop占用1.2个GB的硬盘资源,而且实际开发环境中的数据也会增长,占用在同一盘符里,所以注意不要放置到C盘里(空间大当我没说)。 我们的hadoop统一使用 3.2.2+ 以上版本,注意不要下载成2.7之类的 https://hadoop.apache.org/release/3.2.4.html 在链接页面最下方download ***.tar.gz即可,不要下载成src源码,因为我们并不是用rust调优Hadoop,不过说到这里,如果xk没有否掉我们的MapReduce改进的话,也许我们真的就来hadoop的src里面造作了。 解压后,因为是在windows下面安装的,所以要加上一个dll和一个exe文件 https://github.com/cdarlint/winutils/tree/master/hadoop-3.2.2/bin 在这里面只要下载winutils.exe和hadoop.dll,放置到hadoop的bin目录下面就可以了 之后就是按照^4的操作配置HADOOP_HOME,四个xml文件,最后节点格式化 hdfs namenode -format 然后配置scala,Spark环境变量什么的就ok了 当然,之前配置过的也不用再次配置,在IDEA里面开发估计不太需要配置Scala了,但是配置Spark后就可以在任意地方打开cmd运行Spark了,而且启用Hadoop后就开启了hdfs服务,Spark的命令行就不会爆一长串INFO和EXCEPTION了。

Spark启动后相当于一种服务,我们编写Spark应用程序后,运行这个程序就是在调用Spark服务 最后可以产生一台电脑上跑许多个cmd的盛况 cmds

开发简单的Spark程序

demo 配了这么多东西,总得来个demo试一试 之前我们仅仅改过一个Logo,现在我们开发一个可以跑的WordCount程序 在B站尚硅谷视频中,P4~P7就是开发的流程,但是他使用的Spark是哪里来的呢? 他在POM文件里配置依赖的时候,说过IDEA会自动检查依赖是否存在,如果不存在会 自动下载但是这样显然使用的不是我们自己编写的Spark,所以不要按他的去改POM文件,相反,我们应该去编译好的Spark根目录下寻找到jars目录,将整个目录复制到工作路径下,这里我给这个目录命名为SparkJars,jar是一种压缩文件格式,但是对于Scala/Java来说十分容易解析。右键目录,Add as Library,Add to Module选项填上你的Spark项目的模块,之后你在编写的scala文件里面就可以正常导入org.apache.spark...了

tip1: 有未导入的类时,鼠标移动到位置,快捷键Alt+Enter就可以自动导入,当然你如果IDEA解析不到的话就不行了,这个时候应该检查jar包是否正确导入。

tip2: IDEA可以提供类型补全,或者说你可以调用Spark的函数后,继续键入 .var然后回车就可以自动补全前面的一长串类型,然后命名变量后回车即可。但是如果你不是在他提示补全的红色框内命名变量的话,回车就会把整行回退到原来的未补全状态,就很烦。

在这里附上代码

package com.testCore

import org.apache.spark.rdd.RDD
import org.apache.spark.{SparkConf, SparkContext}
object Test {
  def main(args:Array[String]):Unit={
    //TODO 建立和Spark框架的连接
    val sparkConf = new SparkConf().setMaster("local").setAppName("WordCount")
    val sc=new SparkContext(sparkConf)
    //TODO 执行业务操作
    val lines: RDD[String] = sc.textFile(path="datas")
    val words: RDD[String] = lines.flatMap(_.split(" "))
    val wordGroup: RDD[(String, Iterable[String])] = words.groupBy(word => word)
    val wordToCount=wordGroup.map{
      case(word,list)=>{
        (word,list.size)
      }
    }

    val array: Array[(String, Int)] = wordToCount.collect()
    array.foreach(println)


    //TODO 关闭连接
    sc.stop()
  }
}

在根目录下datas文件夹下有两个txt文件,内容分别为 1.txt: Hello Spark Hello Text 2.txt: Hello YZX Hello Spark

重要注意事项

JDK1.8!!! Scala2.12!!! Hadoop 3.22+!!! Scala的配置注意你自己项目右键的add framework support和 File->ProjectStructure->Global Libraries的两个地方就可以

一定要是2.12,否则scala使用Spark运行时会报错。