环境准备
笔记本系统: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项目中运行。
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
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()