IDEA远程提交运行HDFS的Spark程序

之前提交运行spark程序,都是通过spark-submit提交运行的。
但是能不能再IDEA中就执行submit运行程序呢,
以前用过一种方式,就是通过远程ssh访问(远程ssh可以通过JSch实现),通过liunx命令去执行,但是这个显然不是我期望的。

我的spark程序都是提交给yarn运行的,如果程序直接与yarn通信,按spark-submit源码中的提交方式去做,是不是也能实现呢。

参考了一位博主的帖子和代码。
https://github.com/fansy1990
https://blog.csdn.net/fansy1990/article/details/78551986

修改写参数,整理后就:

     /**
     * spark-submit的一些参数
     */
     String[] runArgs=new String[]{
            "--class", "org.apache.spark.examples.SparkPi",
            "--jar", "hdfs://192.168.79.101:9000/user/hadoop/spark-examples_2.11-2.0.2.jar"
    };


    /**
     * sparkconf的设置
     */
    System.setProperty("SPARK_YARN_MODE", "true");
    SparkConf sparkConf = new SparkConf();
    sparkConf.set("spark.yarn.scheduler.heartbeat.interval-ms","1000");
    sparkConf.set("spark.submit.deployMode", "cluster");

    //设置stagingDir目录
    //不设置也可以,会获取windows用户名,在HDFS下创建一个/user/xxx/.SparkStaging的目录,用于提交application
    sparkConf.set("spark.yarn.stagingDir","hdfs://192.168.79.101:9000/user/hadoop/");

    sparkConf.set("spark.submit.deployMode","cluster");

    /**
     * hadoopconf 参数设置
     */
    Configuration conf = new Configuration();
    conf.setBoolean("mapreduce.app-submission.cross-platform",true);
    conf.set("fs.defaultFS","hdfs://192.168.79.101:9000");
    conf.set("mapreduce.framework.name","yarn");
    conf.set("yarn.resourcemanager.address","linux01:8032");
    conf.set("yarn.resourcemanager.scheduler.address","linux01:8030");
    conf.set("mapreduce.jobhistory.address","linux01:10020");


    /**
     * 封装参数提交
     * client.submitapplication()也可以提交,他会返回一个applicationid
     * run()方法里其实也是调用了submitapplication()方法
     */


    ClientArguments cArgs = new ClientArguments(runArgs);

    Client client = new Client(cArgs,conf, sparkConf);

    client.run();

直接运行后,报错,信息如下:
报错信息
上8088查日志后,发现找不到类
在这里插入图片描述
经查询发现,spark-submit提交时,会自动监测 {HADOOP_CONF_DIR} 中的配置文件,和 {SPARK_HOME} 下的jar包,并且上传至HDFS的sparkstaging目录下,配置文件打包为__spark_conf__.zip, jar包就打包为__spark_libs__xxxxxxxxx.zip。由此可以解决依赖问题和访问不到的情况。

19/01/16 17:59:56 WARN Client: Neither spark.yarn.jars nor spark.yarn.archive is set, falling back to uploading libraries under SPARK_HOME
根据log4j的日志可以看出,它会从SPARK_HOME下读取jar信息,上传到HDFS下。
那就在Windows环境配置好环境变量,spark_home,hadoop_home,hadoop_conf_dir

再次执行,任务一直处于ACCEPT状态下.
在这里插入图片描述

这是什么原因呢,我赶紧去yarn上查看日志的信息。
发现不是连不上0.0.0.0:8030.
在这里插入图片描述

为何它会去访问0.0.0.0呢?

我看了以下它准备上传的__spark_conf.zip包中的properties。
在这里插入图片描述
但是包里只有__spark_conf__.properties一个文件。没有关于HDFS和YARN的配置信息。

并且代码里也已经写死了ip和端口
在这里插入图片描述

在百思不得姐的时候,在刷博客的时候刷到一篇与我情况十分相似的,我顺着它的思路,在{spark_home}/jars/hadoop-yarn-common-2.6.4.jar 找到了yarn-default.xml,这个文件中设置的resource.host就是0.0.0.0

在这里插入图片描述
修改为正确ip,重新放回jar包。

再次运行,果然可以,成功的去访问正确的IP了。但是为何会读取这个配置文件中的IP,而不是优先级最高的代码呢,这个实在不能理解,最后也没解决。

spark的依赖jar包都是由本地上传至HDFS的,那如果HDFS本身存在这些jar包,那是不是就可以免去这一步了,这对于速度影响也十分大。

发现通过设置参数可以直接引用HDFS的jar包。
在这里插入图片描述
至于能否引用xml等配置文件,下次再试试。

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值