jar”运行的自包含应用程序?

s5a0g9ez  于 2021-06-04  发布在  Hadoop
关注(0)|答案(2)|浏览(382)

我必须在hadoop集群中运行一些不能用map/reduce表示的东西。我想写一份申请书。我发现了SpringBoot的SpringYarn,并遵循了入门指南(参见链接)。到目前为止,这是可行的,但也有一些缺陷:
在本教程中,生成了三个jar(一个用于客户端,一个用于appmaster,一个用于容器),在提交应用程序时,这些jar必须位于特定的文件夹结构中
我必须在application.yml中硬编码hdfs uri和resource manager主机/端口,或者将它们作为命令行参数提供
因为它是基于spring引导的,并且应用程序是从 java -jar ,创建的jar文件非常大,基本上是一个完整的hadoop堆栈
jar文件的确切名称必须在application.yml中提及
我想要的是:
带有appmaster的jar和 Package 在其中的容器的单个jar
从命令行运行 hadoop jar 使用运行时可用的配置 hadoop jar (对于mr2,可以通过启动类扩展 Configured 实施 ToolToolRunner.run() ,这使得 Configuration 可在工具的 run 方法)
我想到的方法是:
编写容器和appmaster,将yarn和hadoop依赖项设置为poms中提供的依赖项,像我为jobs先生所做的那样使用maven shade插件打包
编写客户机,添加appmaster和容器作为依赖项,用maven汇编插件将其打包以防止jar被提取
我试过斜纹布,但没用。我明白了

java.lang.NoSuchMethodError: com.google.common.collect.Sets.newCopyOnWriteArraySet()Ljava/util/concurrent/CopyOnWriteArraySet;

因为我的hadoop安装使用Guava11,twill需要13。即使Guava13是阴影入罐,它只是被忽略。

njthzxwz

njthzxwz1#

我对此进行了深入研究,发现从其他spring boot应用程序内部打包和派生spring boot应用程序并不容易。对于我的用例,从不使用yarn的spring boot应用程序调用spring yarn应用程序,以下方法有效:
在“单文件模式”中创建SpringYarn应用程序,如本教程所示
将生成的jar打包到要部署它的应用程序中
e、 g.当使用maven时,可以将其添加为依赖项
确保部署应用程序排除 YarnClientAutoConfiguration 像这样: @EnableAutoConfiguration(exclude = YarnClientAutoConfiguration.class) 确保打包插件将jar打包为整个归档文件,如 maven-assembly-plugin 或者 spring-boot-maven-plugin 是否(不是 maven-shade-plugin )
将部署应用程序的大jar解压到一个临时目录中
使用 ProcessBuilderjava -jar 在要运行的spring应用程序上,在命令行传递正确的配置选项
这是所有的黑客,hadoop肯定需要一些类似于 Job 对乔布斯先生来说,他只不过是在胡说八道。

1tu0hz3e

1tu0hz3e2#

我发现了一个我称之为“变通方法”的东西,它对我的用例足够有效:
我用springyarn构建应用程序,为客户机、容器和appmaster生成单独的jar
我将它们作为模块添加到控制版本号的主pom中(每当我更改前三个项目中的任何一个时,我都会增加主pom的版本)
这个主pom本身就是一个模块,有我整个项目范围的父pom
主pom的父级不是大项目范围的pom,而是 spring-boot-starter-parent 当由jenkins创建这三个jar时,我现在手动将它们打包到一个文件夹中,旁边有一个start脚本。这只是一个临时解决方案,因为此应用程序包含一个长时间运行的任务,用户稍后将从一个web应用程序(也基于spring)启动该任务。我还得想办法从那里提交申请。
我的想法如下,这与我目前为乔布斯先生所做的类似:
将jar作为依赖项添加到web应用程序的pom.xml中
包括基本的 application.yml 三个jar里没有Yarn和jar的信息
使用与相同的技术 Job.setJarByClass() 用于定位appmaster和容器jar
调用客户机的主类 SpringApplication.run() 通过命令行传入连接属性和jar文件的解析位置( args 变量)
如果有人能给我一个提示,如果这是一个可行的情况,请让我知道。

相关问题