当前位置: 首页 > 知识库问答 >
问题:

使用Thread客户端或任何其他方式从Spring Web应用程序运行Apache spark作业

壤驷德宇
2023-03-14

我最近开始使用spark,我想从SpringWeb应用程序运行spark作业。

我的情况是,我正在使用Spring boot在Tomcat服务器上运行web应用程序。我的web应用程序收到一个REST web服务请求,它需要触发纱线集群中的火花计算作业。由于我的作业可能需要更长的时间才能运行,并且可以访问来自HDFS的数据,因此我希望在纱线集群模式下运行spark作业,并且我不希望在我的web层中保持spark上下文的活动状态。另一个原因是我的应用程序是多租户的,所以每个租户都可以运行自己的作业,所以在纱线集群模式下,每个租户的作业都可以启动自己的驱动程序并在自己的spark集群中运行。在web app JVM中,我假设我不能在一个JVM中运行多个spark上下文。

我想在我的Web应用程序中从java程序以纱线集群模式触发火花作业。实现这一点的最佳方法是什么。我正在探索各种选项并寻找您的指导,看看哪一个是最好的

1)我可以使用Spark提交命令行shell来提交我的作业。但是要从我的Web应用程序触发它,我需要使用JavaProcessBuilder api或基于java ProcessBuilder构建的某个包。这有两个问题。首先,这听起来不像是一种干净的方法。我应该有一种触发我的火花应用程序的编程方式。第二个问题是我将失去监控提交的应用程序并获取其状态的能力...唯一粗糙的方法是读取Spark提交shell的输出流,这听起来也不是一个好方法。

2) 我尝试使用Thread客户端提交spring应用程序中的作业。以下是我使用Thread客户端提交spark作业时使用的代码:

Configuration config = new Configuration();
System.setProperty("SPARK_YARN_MODE", "true");        
SparkConf conf = new SparkConf();
ClientArguments cArgs = new ClientArguments(sparkArgs, conf);
Client client = new Client(cArgs, config, conf);
client.run();

但当我运行上述代码时,它只会尝试在localhost上连接。我收到以下错误:

5/08/05 14:06:10 INFO Client: Retrying connect to server: 0.0.0.0/0.0.0.0:8032. Already tried 0 time(s); retry policy is RetryUpToMaximumCountWithFixedSleep(maxRetries=10, sleepTime=1000 MILLISECONDS) 15/08/05 14:06:12 INFO Client: Retrying connect to server: 0.0.0.0/0.0.0.0:8032. Already tried 1 time(s); retry policy is RetryUpToMaximumCountWithFixedSleep(maxRetries=10, sleepTime=1000 MILLISECONDS)

所以我认为它无法连接到远程机器。

请建议,使用最新版本的spark执行此操作的最佳方式是什么。稍后,我计划在amazon EMR中部署整个应用程序。所以,这种方法也应该在那里奏效。

提前感谢

共有2个答案

邓欣可
2023-03-14

我在尝试运行连接到纱线集群的Spark应用程序时也遇到了类似的问题-没有集群配置,它试图连接到本地机器,就像连接集群的主节点一样,这显然失败了。

当我放置核心站点时,它对我有效。xml和纱线网站。将xml转换为类路径(典型sbt或Maven项目结构中的src/main/resources)-应用程序正确连接到集群。

使用spark提交时,这些文件的位置通常由HADOOP\u CONF\u DIR环境变量指定,但对于独立应用程序,它并没有效果。

吴高洁
2023-03-14

Spark JobServer可能有帮助:https://github.com/spark-jobserver/spark-jobserver,此项目接收RESTful web请求并启动spark作业。结果作为json响应返回。

 类似资料:
  • 在SpringJSFWeb应用程序中将Netty客户端处理程序配置为消息接收点,有没有具体的方法? 如果一些独立的Java应用程序充当Netty服务器,我如何接收到SpringJSFWeb应用程序的消息?

  • 问题内容: 这是我桌子上的风景。首先,我必须按照ITime asc的顺序查找,但如果ITime中有相同的记录,则记录顺序为``减->失败->撤回’‘。请检查下面的临时表。 我该怎么做?提前致谢。 问题答案:

  • 问题内容: 我需要从自己的Java程序中运行其他几个程序,基本上我需要运行这些命令行语句。 和 并且我需要在自己的程序中使用从这些程序写入控制台的文本输出。我已经尝试过使用svn运行Runtime.getRuntime()。exec(),但是它似乎没有做任何事情,因为它没有生成svn.log文件。同样,两个程序都需要在不同的地方调用,svn行需要从一个文件夹内调用,而java行需要从另一文件夹内调

  • 问题内容: 我对React还是很陌生,我正在开发一个应用程序,它将获取网页的实际屏幕截图,并且该应用程序可以在所截取的屏幕截图之上绘制并添加涂鸦。最初,我使用html2canvas和domToImage拍摄客户端屏幕快照,但它无法完全呈现网页中显示的图像。 Reddit用户/ pamblam0建议我调查Google的Puppeteer。它的工作方式是启动无头铬浏览器,该浏览器转到我在本地主机上的r

  • 我们如何用Quartz调度器或任何Java/Spring api来实现这一点? 例如,假设任何石英作业启动,并且间隔设置为10分钟,因此在理想情况下,作业将在下一个10分钟间隔内运行。但每次作业运行时,我们都希望从数据库中获取最新的时间间隔并对其进行调度。 10:00作业运行且在数据库中的时间间隔设置为10分钟10:10作业运行且在数据库中的时间间隔设置为20分钟 所以下一次作业应该在10:30运

  • 问题内容: 我有一个Java程序,希望可以在计算机上的任何位置运行。我想从Cygwin命令提示符下运行它。我编写了脚本来调用Java程序。我将Java程序的位置添加到类路径中,并且当我从Java程序的目录运行它们时,脚本可以工作。但是,当我尝试从任何其他目录运行时,我得到: 这是我的脚本: 将Java行更改为以下内容: 产生相同的结果。 问题答案: 在尝试了所有我能想到的一切之后,我回显了该命令,