Spark开发--IDEA--编程环境搭建(六)
一、环境准备
IntelliJ IDEA 2018.2
-
安装scala
安装scala
配置环境变量:
SCALA_HOME:C:\Program Files (x86)\scala
path:%SCALA_HOME%\bin
-
安装scala插件
安装scala插件
安装scala插件 -
配置全局的Scala SDK
项目配置
下载安装
下载完成
选择Scala
选择Browser:
本地加载 设置结果
二、构建maven工程
-
项目创建
项目创建
- 导入依赖
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<spark.version>2.4.4</spark.version>
<scala.version>2.12</scala.version>
</properties>
<dependencies>
<!--core包-->
<dependency>
<groupId>org.apache.spark</groupId>
<artifactId>spark-core_${scala.version}</artifactId>
<version>${spark.version}</version>
</dependency>
</dependencies>
-
新建Scala文件
Scala
新建Scala文件
package com.xtsz
import org.apache.spark.{SparkConf, SparkContext}
object MySpark {
def main(args: Array[String]) {
// 定义应用名称
val conf = new SparkConf().setAppName("mySpark")
// setMaster("local") 本机的spark就用local,远端的就写ip
// 如果是打成jar包运行则需要去掉 setMaster("local")因为在参数中会指定。
conf.setMaster("local")
val sc =new SparkContext(conf)
// parallelize()函数创建RDD
val rdd =sc.parallelize(List(1,2,3,4,5,6)).map(_*3)
// 过滤器
val mappedRDD=rdd.filter(_>10).collect()
// 对集合求和
println(rdd.reduce(_+_))
println("数学就是工作")
}
}
-
运行
运行
运行结果 -
打包
项目设置
打包设置
选择入口类
选择入口类
确定
设定jar包
构建jar包
去掉代码中的:
conf.setMaster("local")
构建jar包
构建结果:
构建结果
三、传统导包方式
请安装:
1. 新建项目
新建项目2.导入Spark依赖
新建目录导入依赖
导入依赖jar包
3. 打包上传
删除多余的包打包
四、上传运行(独立模式运行)
-
文件上传
文件上传 -
提交作业
root@master:/usr/local/spark-2.4.4-bin-hadoop2.7# ./bin/spark-submit --class com.xtsz.MySpark --master spark://master:7077 /root/sparkexam.jar
运行结果:
运行结果
Spark运行基本流程:
Spark的基本运行流程如下:
- 当一个Spark应用被提交时,首先需要为这个应用构建起基本的运行环境,即由任务控制节点(Driver)创建一个SparkContext,由SparkContext负责和资源管理器(Cluster Manager)的通信以及进行资源的申请、任务的分配和监控等。SparkContext会向资源管理器注册并申请运行Executor的资源;
- 资源管理器为Executor分配资源,并启动Executor进程,Executor运行情况将随着“心跳”发送到资源管理器上;
SparkContext根据RDD的依赖关系构建DAG图,DAG图提交给DAG调度器(DAGScheduler)进行解析,将DAG图分解成多个“阶段”(每个阶段都是一个任务集),并且计算出各个阶段之间的依赖关系,然后把一个个“任务集”提交给底层的任务调度器(TaskScheduler)进行处理;Executor向SparkContext申请任务,任务调度器将任务分发给Executor运行,同时,SparkContext将应用程序代码发放给Executor; -
任务在Executor上运行,把执行结果反馈给任务调度器,然后反馈给DAG调度器,运行完毕后写入数据并释放所有资源。
Spark运行基本流程
六、独立模式远程运行
- 代码编写
package com.neuedu
import org.apache.spark.{SparkConf, SparkContext}
object MySpark {
def main(args: Array[String]) {
// 定义应用名称
val conf = new SparkConf().setAppName("mySpark")
// setMaster("local") 本机的spark就用local,远端的就写ip
// 如果是打成jar包运行则需要去掉 setMaster("local")因为在参数中会指定。
// 本地环境,如果是独立环,注释以下内容及 conf.setMaster("spark://master:7077")
// conf.setMaster("local")
// YARN环境
conf.setMaster("spark://master:7077")
// 此处可以是相对路径,也可是绝对路(上传要改为linux路径)
conf.setJars(Array("/root/sparkexam1.jar"))
val sc = new SparkContext(conf)
// parallelize()函数创建RDD
val rdd = sc.parallelize(List(1, 2, 3, 4, 5, 6)).map(_ * 3)
// 过滤器
val mappedRDD = rdd.filter(_ > 10).collect()
// 对集合求和
println(rdd.reduce(_ + _))
println("数学就是工作")
}
}
说明:
如果远程运行,请注意:
conf.setJars(Array("/root/spark-test.jar"))
这个路径,报错找不到jar包,打包后,请将jar拷贝到报错相应路径即可。
jar路径
注意:
打包时,要将除自身外其它的jar全部删除。
-
运行
直接运行
六、常见问题:
-
Using Spark's default log4j profile: org/apache/spark/log4j-defaults.properties
-
java.io.IOException: Could not locate executable null\bin\winutils.exe in the Hadoop binaries.
解决:
配置HADOOP_HOME并拷贝:winutils.exe 到bin目录。 -
Exception in thread "main" java.lang.NoSuchMethodError: scala.Predef$.intArrayOps([I)[I
原因:
scala版本不一致。 -
idea搭建maven spark环境(解决java.lang.ClassNotFoundException异常)
在idea中执行成功 但是在spark submit提交会出现ClassNotFoundException异常,可以看下解决异常图,要选择copy to the output将所有的jar分开。
注意:
检查包名与提交运行是否一致。
package com.neuedu
运行命令:
./bin/spark-submit --class com.xtsz.MySpark --master spark://master:7077 /root/sparkexam.jar