【云计算】spark系列之通过yarnapi提交Spark任务
小标 2019-01-07 来源 : 阅读 1635 评论 0

摘要:本文主要向大家介绍了【云计算】spark系列之通过yarnapi提交Spark任务,通过具体的内容向大家展现,希望对大家学习云计算有所帮助。

本文主要向大家介绍了【云计算】spark系列之通过yarnapi提交Spark任务,通过具体的内容向大家展现,希望对大家学习云计算有所帮助。

在工作中,大部使用的都是hadoop和spark的shell命令,或者通过java或者scala编写代码。最近工作涉及到通过yarn api处理spark任务,感觉yarn的api还是挺全面的,但是调用时需要传入很多参数,而且会出现一些诡异的问题。虽然最终使用livy来提交任务,但是通过yarn api提交任务可以帮助使用者更好的理解yarn,而且使用yarn查询任务还是不错的。至于livy的安装和使用,我也会通过后面的文章分享出来。


前期准备


本篇的开发环境为Hadoop 2.6、Spark 2.3.1,版本有些差异也无所谓。 我使用的是postman来调用yarn api,你也可以使用编程语言来实现http请求。

首先启动yarn 启动hdfs

start-hdfs.sh




4. 准备一个spark jar包,如果没有可以使用spark样例spark-examples_2.11-2.3.1.jar,并上传到hdfs上


hdfs dfs -put $SPARK_HOME/examples/jars/spark-examples_2.11-2.3.1.jar /


准备需要引入的spark库,打包成zip文件,并上传到hdfs上

cd $SPARK_HOME/jars
zip -q -r __spark_libs__.zip *
hdfs dfs -put __spark_libs__.zip /




6. 启动yarn


start-yarn.sh


正篇


本篇基本都是参考hadoop官方文档,有兴趣的可以阅读一下,里面有很多API接口


创建spark任务


从官方文档中找到创建spark任务的api


//localhost:8088/ws/v1/cluster/apps/new-application


查看jar包的属性


//localhost:50070/webhdfs/v1/spark-examples_2.11-2.3.1.jarop=GETFILESTATUS


查看spark库zip文件属性


//localhost:50070/webhdfs/v1/__spark_libs__.zipop=GETFILESTATUS


提交spark任务


//localhost:8088/ws/v1/cluster/apps

 


这里的__app__.jar和__spark_libs__的相关参数,就是使用上面的通过hdfs API获得的两个文件的属性。
{
  "application-id": "application_1534993174414_0001", 
  "application-name": "SparkPi", 
  "application-type": "YARN", 
  "keep-containers-across-application-attempts": false, 
  "max-app-attempts": 1, 
  "resource": {
    "memory": 1024, 
    "vCores": 1
  }, 
  "unmanaged-AM": false, 
  "am-container-spec": {
    "commands": {
      "command": "java -server -Xmx1024m -Dspark.yarn.app.container.log.dir= -Dspark.master=yarn -Dspark.submit.deployMode=cluster -Dspark.executor.cores=1 -Dspark.executor.memory=1g -Dspark.app.name=SparkPi org.apache.spark.deploy.yarn.ApplicationMaster --class org.apache.spark.examples.SparkPi --jar __app__.jar 1>/stdout 2>/stderr"
    }, 
    "environment": {
      "entry": [
        {
          "key": "SPARK_USER", 
          "value": "luoxinliang"
        }, 
        {
          "key": "SPARK_YARN_MODE", 
          "value": true
        }, 
        {
          "key": "SPARK_YARN_STAGING_DIR", 
          "value": "hdfs://localhost:9000/user/luoxinliang/.sparkStaging/application_1534993174414_0001"
        }, 
        {
          "key": "CLASSPATH", 
          "value": "{{PWD}}{{PWD}}/__app__.jar{{PWD}}/__spark_libs__/*$HADOOP_CONF_DIR$HADOOP_COMMON_HOME/share/hadoop/common/*$HADOOP_COMMON_HOME/share/hadoop/common/lib/*$HADOOP_HDFS_HOME/share/hadoop/hdfs/*$HADOOP_HDFS_HOME/share/hadoop/hdfs/lib/*$HADOOP_YARN_HOME/share/hadoop/yarn/*$HADOOP_YARN_HOME/share/hadoop/yarn/lib/*$HADOOP_MAPRED_HOME/share/hadoop/mapreduce/*$HADOOP_MAPRED_HOME/share/hadoop/mapreduce/lib/*{{PWD}}/__spark_conf__/__hadoop_conf__"
        }, 
        {
          "key": "SPARK_DIST_CLASSPATH", 
          "value": "{{PWD}}{{PWD}}/__app__.jar{{PWD}}/__spark_libs__/*$HADOOP_CONF_DIR$HADOOP_COMMON_HOME/share/hadoop/common/*$HADOOP_COMMON_HOME/share/hadoop/common/lib/*$HADOOP_HDFS_HOME/share/hadoop/hdfs/*$HADOOP_HDFS_HOME/share/hadoop/hdfs/lib/*$HADOOP_YARN_HOME/share/hadoop/yarn/*$HADOOP_YARN_HOME/share/hadoop/yarn/lib/*$HADOOP_MAPRED_HOME/share/hadoop/mapreduce/*$HADOOP_MAPRED_HOME/share/hadoop/mapreduce/lib/*{{PWD}}/__spark_conf__/__hadoop_conf__"
        }
      ]
    }, 
    "local-resources": {
      "entry": [
        {
          "key": "__app__.jar", 
          "value": {
            "resource": "hdfs://localhost:9000/spark-examples_2.11-2.3.1.jar", 
            "size": 1997556, 
            "timestamp": 1534953699017, 
            "type": "FILE", 
            "visibility": "APPLICATION"
          }
        },
        {
          "key": "__spark_libs__", 
          "value": {
            "resource": "hdfs://localhost:9000/__spark_libs__.zip", 
            "size": 232213530, 
            "timestamp": 1534955145924, 
            "type": "ARCHIVE", 
            "visibility": "APPLICATION"
          }
        }
      ]
    }
  }
}


上面的传入参数会容易理解,但是收集这些参数很麻烦。值得注意的一个地方是command这个参数,使用的是java运行spark的一个类org.apache.spark.deploy.yarn.ApplicationMaster,而不是我们熟悉的spark-submit命令。笔者也尝试的使用spark-submit来作为command,结果是提交了两个任务,一个是通过yarn api提交的伤,另一个是spark-submit命令提交的任务。前者状态显示失败,而后一个是成功。原因是ApplicationMaster在执行后,会返回一个ExitCode=0。当把java运行ApplicationMaster改成spark-submit是不会有返回ExitCode。

有兴趣的读者还可以尝试一下spark-shell –master yarn,看看它启动时的yarn日志。


通过yarn api提交spark任务并不难,但是需要准备的参数以及包是很麻烦的。此篇只是通过另一个角度帮助读者熟悉yarn的工作原理。在项目开发时还是建议使用livy来远程提交spark任务。livy不仅可以提交spark jar包,还可以提交spark代码片断,功能上更加丰富。


          

本文由职坐标整理并发布,希望对同学们有所帮助。了解更多详情请关注职坐标大数据云计算大数据安全频道!

本文由 @小标 发布于职坐标。未经许可,禁止转载。
喜欢 | 0 不喜欢 | 1
看完这篇文章有何感觉?已经有1人表态,0%的人喜欢 快给朋友分享吧~
评论(0)
后参与评论

您输入的评论内容中包含违禁敏感词

我知道了

助您圆梦职场 匹配合适岗位
验证码手机号,获得海同独家IT培训资料
选择就业方向:
人工智能物联网
大数据开发/分析
人工智能Python
Java全栈开发
WEB前端+H5

请输入正确的手机号码

请输入正确的验证码

获取验证码

您今天的短信下发次数太多了,明天再试试吧!

提交

我们会在第一时间安排职业规划师联系您!

您也可以联系我们的职业规划师咨询:

小职老师的微信号:z_zhizuobiao
小职老师的微信号:z_zhizuobiao

版权所有 职坐标-一站式AI+学习就业服务平台 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
 沪公网安备 31011502005948号    

©2015 www.zhizuobiao.com All Rights Reserved