Spark任务提交至YARN运行的3种方式与Mapreduce提交任务的几种形式

一: Spark任务提交至YARN运行的3种方式

Spark作为新一代计算平台的闪亮明星,在我们的大数据平台中具有非常重要的作用,SQL查询、流计算和机器学习等场景都能见到它的身影,可以说平台应用的数据处理、计算和挖掘等场景都可以使用Spark进行开发。在默认的情况下,如果想向Spark提交计算任务,通常会使用Spark提供的Spark-Submit脚本来提交含有业务逻辑的jar文件程序。这种方式虽然简单,但有悖于服务化的设计理念,所以需要为Spark提供一套任务管理的RESTful服务
在大数据平台中,Spark是以Spark on YARN的方式运行的,在这种模式下,整个集群的资源调度是由YARN统一控制的Spark只是作为运行在YARN上的一个应用客户端而存在。本文将介绍提交Spark任务至YARN运行的3种方式。如下图所示:
在这里插入图片描述

1. 第一种方式:使用Spark-Submit脚本提交
Spark本身提供了Spark-Submit脚本用于提交任务,可以借助Java的Process-Builder调用脚本,将其包装成RESTful服务。
 ./spark-submit --class com.learn.spark.SimpleApp --master yarn --deploy-mode client --driver-memory 2g --executor-memory 2g --executor-cores 3 ../spark-demo.jar
2. 第二种方式:使用Spark Client提交
 除了Spark-Submit脚本之外,Spark还提供了一套Java客户端接口用于提交任务。在使用这套接口之后,程序就可以去掉对Spark-Submit脚本的依赖,这样一来提交任务的服务程序就可以运行在应用服务器之上,使得以远程的方式向集群提交任务成为可能。
  提交方式是已JAVA API编程的方式提交,这种方式不需要使用命令行,直接可以在IDEA中点击Run 运行包含Job的Main类就行。Spark 提供了以SparkLanuncher 作为唯一入口的API来实现。这种方式很方便(试想如果某个任务需要重复执行,但是又不会写linux 脚本怎么搞?我想到的是以JAVA API的方式提交Job, 还可以和Spring整合,让应用在tomcat中运行),官网的示例:[官网示例链接](http://spark.apache.org/docs/latest/api/java/index.html?org/apache/spark/launcher/package-summary.html)

根据官网的示例,通过JAVA API编程的方式提交有两种方式:
第一种是调用SparkLanuncher实例的startApplication方法,但是这种方式在所有配置都正确的情况下使用运行都会失败的,原因是startApplication方法会调用LauncherServer启动一个进程与集群交互,这个操作貌似是异步的,所以可能结果是main主线程结束了这个进程都没有起起来,导致运行失败。解决办法是调用new SparkLanuncher().startApplication后需要让主线程休眠一定的时间后者是使用下面的例子:

package com.learn.spark; 

import org.apache.spark.launcher.SparkAppHandle; 
import org.apache.spark.launcher.SparkLauncher; 

import java.io.IOException; 
import java.util.HashMap; 
import java.util.concurrent.CountDownLatch; 

public class LanuncherAppV {
    
    public static void main(String[] args) throws IOException, InterruptedException {
    

        HashMap env = new HashMap(); 
        //这两个属性必须设置 
        env.put("HADOOP_CONF_DIR", "/usr/local/hadoop/etc/overriterHaoopConf"); 
        env.put("JAVA_HOME", "/usr/local/java/jdk1.8.0_151"); 
        //可以不设置 
        //env.put("YARN_CONF_DIR",""); 
        CountDownLatch countDownLatch = new CountDownLatch(1); 
        //这里调用setJavaHome()方法后,JAVA_HOME is not set 错误依然存在 
        SparkAppHandle handle = new SparkLauncher(env) 
        .setSparkHome("/usr/local/spark") 
        .setAppResource("/usr/local/spark/spark-demo.jar") 
        .setMainClass("com.learn.spark.SimpleApp") 
        .setMaster
  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值