简介: 本文将就MaxCompute Spark开发环境搭建、经常使用配置、做业迁移注意事项以及常见问题进行深刻介绍。
MaxCompute Spark是MaxCompute提供的兼容开源的Spark计算服务。它在统一的计算资源和数据集权限体系之上,提供Spark计算框架,支持用户以熟悉的开发使用方式提交运行Spark做业,以知足更丰富的数据处理分析场景。java
支持原生多版本Spark做业python
社区原生Spark运行在MaxCompute里,彻底兼容Spark的API,支持多个Spark版本同时运行mysql
统一的计算资源git
像MaxCompute SQL/MR等任务类型同样,运行在MaxCompute项目开通的统一计算资源中github
统一的数据和权限管理redis
遵循MaxCompute项目的权限体系,在访问用户权限范围内安全地查询数据sql
与开源系统相同的使用体验apache
提供原生的开源实时Spark UI和查询历史日志的功能windows
目前MaxCompute Spark支持如下适用场景:安全
离线计算场景:GraphX、Mllib、RDD、Spark-SQL、PySpark等
Streaming场景
读写MaxCompute Table
引用MaxCompute中的文件资源
读写VPC环境下的服务,如RDS、Redis、HBase、ECS上部署的服务等
读写OSS非结构化存储
使用限制
不支持交互式类需求Spark-Shell、Spark-SQL-Shell、PySpark-Shell等
不支持访问MaxCompute外部表,函数和UDF
只支持Local模式和Yarn-cluster模式运行
经过Spark客户端提交
Local模式
本质上也是Yarn-Cluster模式,提交任务到MaxCompute集群中
下载MC Spark客户端
Spark 1.6.3
Spark 2.3.0
环境变量配置
## JAVA_HOME配置 # 推荐使用JDK 1.8 export JAVA_HOME=/path/to/jdk export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar export PATH=$JAVA_HOME/bin:$PATH ## SPARK_HOME设置 # 下载上文提到的MaxCompute Spark客户端并解压到本地任意路径 # 请不要直接设置SPARK_HOME等于如下路径下述路径仅作展现用途 # 请指向正确的路径 export SPARK_HOME=/path/to/spark_extracted_package export PATH=$SPARK_HOME/bin:$PATH ## PySpark配置Python版本 export PATH=/path/to/python/bin/:$PATH
参数配置
参数配置参考下文
准备项目工程
git clone https://github.com/aliyun/MaxCompute-Spark.git cd spark-2.x mvn clean package
任务提交
// bash环境 cd $SPARK_HOME bin/spark-submit --master yarn-cluster --class com.aliyun.odps.spark.examples.SparkPi /path/to/MaxCompute-Spark/spark-2.x/target/spark-examples_2.11-1.0.0-SNAPSHOT-shaded.jar // 在windows环境提交的命令 cd $SPARK_HOME/bin spark-submit.cmd --master yarn-cluster --class com.aliyun.odps.spark.examples.SparkPi pathtoMaxCompute-Sparkspark-2.xtargetspark-examples_2.11-1.0.0-SNAPSHOT-shaded.jar
IDEA调试注意
IDEA运行Local模式是不能直接引用spark-defaults.conf里的配置,须要手动在代码里指定相关配置
必定要注意须要在IDEA里手动添加MaxCompute Spark客户端的相关依赖(jars目录),不然会出现如下报错:
the value of spark.sql.catalogimplementation should be one of hive in-memory but was odps
ODPS SPARK节点spark-submit主Java、Python资源app jar or python file配置项--conf PROP=VALUEMain Class--class CLASS_NAME参数[app arguments]选择JAR资源--jars JARS选择Python资源--py-files PY_FILES选择File资源--files FILES选择Archives资源
--archives
上传资源:
0~50MB:能够直接在DataWorks界面建立资源并上传
50MB~500MB:能够先利用MaxCompute客户端(CMD)上传,而后在DataWorks界面添加到数据开发,参考文档
资源引用:
任务运行时:资源文件默认会上传到Driver和Executor的当前工做目录
除此以外,须要将spark-default.conf中的配置逐条加到dataworks的配置项中
首先在调度->参数中添加参数,而后在Spark节点“参数”栏引用该参数。多个参数用空格分隔
该参数会传给用户主类,用户在代码中解析该参数便可
用户使用Maxcompute Spark一般会有几个位置能够添加Spark配置,主要包括:
位置1:spark-defaults.conf,用户经过客户端提交时在spark-defaults.conf文件中添加的Spark配置
位置2:dataworks的配置项,用户经过dataworks提交时在配置项添加的Spark配置,这部分配置最终会在位置3中被添加
位置3:配置在启动脚本spark-submit --conf选项中
位置4:配置在用户代码中,用户在初始化SparkContext时设置的Spark配置
Spark配置的优先级
用户代码 > spark-submit --选项 > spark-defaults.conf配置 > spark-env.sh配置 > 默认值
一种是必需要配置在spark-defaults.conf或者dataworks的配置项中才能生效(在任务提交以前须要),而不能配置在用户代码中,这类配置主要的特征是:
与Maxcompute/Cupid平台相关:通常参数名中都会带odps或者cupid,一般这些参数与任务提交/资源申请都关系:
显而易见,一些资源获取(如driver的内存,core,diskdriver,maxcompute资源),在任务执行以前就会用到,若是这些参数设置在代码中,很明显平台没有办法读到,因此这些参数必定不要配置在代码中
其中一些参数即便配置在代码中,也不会形成任务失败,可是不会生效
其中一些参数配置在代码中,可能会形成反作用:如在yarn-cluster模式下设置spark.master为local
访问VPC的参数:
这类参数也与平台相关,打通网络是在提交任务时就进行的
一种是在以上三种位置配置均可以生效,可是在代码配置的优先级最高
推荐把任务运行与优化相关的参数配置在代码中,而与资源平台相关的配置都配置在spark-defaults.conf或者dataworks的配置项中。
Master以及Worker的StdErr打印的是spark引擎输出的日志,StdOut中打印用户做业输出到控制台的内容
若是Driver中出现类或者方法找不到的问题,通常是jar包打包的问题
若是Driver中出现链接外部VPC或者OSS出现Time out,这种状况通常要去排查一下参数配置
根据Latency作排序,Latency表明了Executor的存活的时间,存活时间越短的,越有多是根因所在
Spark UI的使用与社区原生版是一致的,能够参考文档
注意
Spark UI须要鉴权,只有提交任务的Owner才能打开
Spark UI仅在做业运行时才能打开,若是任务已经结束,那么Spark UI是没法打开的,这时候须要查看Spark History Server UI
================
缘由在于用户没有正确地按照文档将Maxcompute Spark的jars目录添加到类路径,致使加载了社区版的spark包,须要按照文档将jars目录添加到类路径
问题二:IDEA Local模式是不能直接引用spark-defaults.conf里的配置,必需要把Spark配置项写在代码中
问题三:访问OSS和VPC:
Local模式是处于用户本机环境,网络没有隔离。而Yarn-Cluster模式是处于Maxcompute的网络隔离环境中,必需要要配置vpc访问的相关参数
Local模式下访问oss的endpoint一般是外网endpoint,而Yarn-cluster模式下访问vpc的endpoint是经典网络endpoint
=============
java/scala程序常常会遇到Java类找不到/类冲突问题:
类没有找到:用户Jar包没有打成Fat Jar或者因为类冲突引发
打包须要注意:
依赖为provided和compile的区别:
provided:代码依赖该jar包,可是只在编译的时候须要用,而运行时不须要,运行时会去集群中去寻找的相应的jar包
compile:代码依赖该jar包,在编译、运行时候都须要,在集群中不存在这些jar包,须要用户打到本身的jar包中。这种类型的jar包通常是一些三方库,且与spark运行无关,与用户代码逻辑有关
用户提交的jar包必须是Fat jar:
必需要把compile类型的依赖都打到用户jar包中,保证代码运行时能加载到这些依赖的类
须要设置为provided的jar包
groupId为org.apache.spark的Jar包
平台相关的Jar包
cupid-sdk
hadoop-yarn-client
odps-sdk
须要设置为compile的jar包
oss相关的jar包
hadoop-fs-oss
用户访问其余服务用到的jar包:
如mysql,hbase
用户代码须要引用的第三方库
===============
不少时候用户须要用到外部Python依赖
首先推荐用户使用咱们打包的公共资源,包含了经常使用的一些数据处理,计算,以及链接外部服务(mysql,redis,hbase)的三方库
## 公共资源python2.7.13 spark.hadoop.odps.cupid.resources = public.python-2.7.13-ucs4.tar.gz spark.pyspark.python = ./public.python-2.7.13-ucs4.tar.gz/python-2.7.13-ucs4/bin/python ## 公共资源python3.7.9 spark.hadoop.odps.cupid.resources = public.python-3.7.9-ucs4.tar.gz spark.pyspark.python = ./public.python-3.7.9-ucs4.tar.gz/python-3.7.9-ucs4/bin/python3
做者:亢海鹏
原文连接本文为阿里云原创内容,未经容许不得转载