IDEA搭建Spark on Maxcompute 本地开发环境

1,734 阅读1分钟

环境准备

笔记本系统:windows 10
jdk版本:1.8.0_251
git版本:2.21.0
scala版本:2.11.12
maven版本:3.6.3

1.下载MaxCompute Spark客户端

MaxCompute Spark发布包作为客户端工具,它用于通过spark-submit方式提交作业到MaxCompute项目中运行。

spark-2.x 发布包

2. 设置环境变量

设置JAVA_HOME
变量名:JAVA_HOME
变量值:D:\work_soft\Java\jdk1.8.0_251
变量名:CLASSPATH
变量值:.;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar
添加到path:%JAVA_HOME%\bin 和 %JAVA_HOME%|jre\bin
设置SPARK_HOME
变量名:SPARK_HOME
变量值:D:\spark-2.3.0-odps0.32.2
添加到path: %SPARK_HOEM%\bin

3.配置spark-defaults.conf

下载MaxCompute Spark客户端(spark-2.3.0-odps0.32.5.tar.gz)后,直接解压并配置spark-defaults.conf

在 $SPARK_HOME/conf/ 下面有一个文件名称为 spark-defaults.conf.template 请将其重命名为 spark-defaults.conf 后再进行相关配置。

# 一般来说默认的template只需要再填上MaxCompute相关的账号信息就可以使用Spark
spark.hadoop.odps.project.name =
spark.hadoop.odps.access.id =
spark.hadoop.odps.access.key =

# 其他的配置保持自带值一般就可以了
spark.hadoop.odps.end.point = http://service.cn.maxcompute.aliyun.com/api
spark.hadoop.odps.runtime.end.point = http://service.cn.maxcompute.aliyun-inc.com/api
spark.sql.catalogImplementation=odps
spark.hadoop.odps.task.major.version = cupid_v2
spark.hadoop.odps.cupid.container.image.enable = true
spark.hadoop.odps.cupid.container.vm.engine.type = hyper

spark.hadoop.odps.cupid.webproxy.endpoint = http://service.cn.maxcompute.aliyun-inc.com/api
spark.hadoop.odps.moye.trackurl.host = http://jobview.odps.aliyun.com

Spark详细配置

4.配置windows端开发hadoop需要的环境

hadoop-common-2.2.0-bin-master.zip点击直接下载,并解压到一个目录。

变量名:HADOOP_HOME
变量值:D:\hadoop-common-2.2.0-bin-master
添加到path:%HADOOP_HOME%\bin

5.准备项目工程

MaxCompute Spark提供了项目工程模版,建议开发者下载模版复制后直接在模版里开发 可以看到模版工程里的关于spark的依赖的scope都是provided的,这个请务必不要更改,否则提交的作业无法正常运行

spark-2.x 模板及编译
git clone https://github.com/aliyun/MaxCompute-Spark.git
cd spark-2.x
mvn clean package

6.IDEA local执行须知

代码需要手动设置spark.master

val spark = SparkSession
      .builder()
      .appName("SparkPi")
      .config("spark.master", "local[4]") // 需设置spark.master为local[N]才能直接运行,N为并发数
      .getOrCreate()

在IDEA里手动添加MaxCompute Spark客户端的相关依赖

dependency>
    <groupId>org.apache.spark</groupId>
    <artifactId>spark-core_${scala.binary.version}</artifactId>
    <version>${spark.version}</version>
    <scope>provided</scope> // 因为上文中,要求在pom.xml中设置scope为provided,所以运行肯定会出现NoClassDefFoundError的问题
</dependency>
Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/spark/sql/SparkSession$
	at com.aliyun.odps.spark.examples.SparkPi$.main(SparkPi.scala:27)
	at com.aliyun.odps.spark.examples.SparkPi.main(SparkPi.scala)
Caused by: java.lang.ClassNotFoundException: org.apache.spark.sql.SparkSession$
	at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
	at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
	at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:335)
	at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
	... 2 more

手动加入MaxCompute Spark(D:\spark-2.3.0-odps0.32.2\jars)下面的jars目录到IDEA模板工程项目中,就可以保持scope=provided,又能在IDEA里直接运行

Local不能直接引用spark-defaults.conf里的配置 Local不能直接引用spark-defaults.conf里的配置

还有一个问题是,Local模式运行是不可以直接读取spark-defaults.conf里面的配置的,因为只有通过spark-submit提交的作业,才会去读取spark-defaults.conf里的配置,而local模式下启动的方式并不是通过spark-submit方式启动,故如果要在Local模式下IDEA调试代码,需要手动在代码里指定相关配置
比如说在local模式下如果要通过spark-sql读取MaxCompute的表,就要按如下所示
val spark = SparkSession
      .builder()
      .appName("SparkPi")
      .config("spark.master", "local[4]") // 需设置spark.master为local[N]才能直接运行,N为并发数
      .config("spark.hadoop.odps.project.name", "****")
      .config("spark.hadoop.odps.access.id", "****")
      .config("spark.hadoop.odps.access.key", "****")
      .config("spark.hadoop.odps.end.point", "http://service.cn.maxcompute.aliyun.com/api")
      .config("spark.sql.catalogImplementation", "odps")
      .getOrCreate()