我必须在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
实施 Tool
与 ToolRunner.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是阴影入罐,它只是被忽略。
2条答案
按热度按时间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解压到一个临时目录中
使用
ProcessBuilder
跑java -jar
在要运行的spring应用程序上,在命令行传递正确的配置选项这是所有的黑客,hadoop肯定需要一些类似于
Job
对乔布斯先生来说,他只不过是在胡说八道。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
变量)如果有人能给我一个提示,如果这是一个可行的情况,请让我知道。