我必须在Hadoop集群中运行一些无法用Map / Reduce表示的东西 . 我想过为它写一个YARN应用程序 . 我发现Spring Yarn用于spring-boot并遵循Getting Started(参见链接) . 这项工作到目前为止,但有一些缺陷:
-
在本教程中,生成了三个JAR(一个用于客户端,一个用于appmaster,一个用于容器),在提交应用程序时必须处于特定的文件夹结构中
-
我必须在application.yml中硬编码HDFS URI和资源管理器主机/端口,或者将它们作为命令行参数提供
-
由于它基于Spring Boot,并且应用程序以
java -jar
启动,因此创建的JAR文件非常大,基本上包含整个Hadoop堆栈 -
必须在application.yml中提及JAR文件的确切名称
我想要的是:
-
单个JAR,其中包含appmaster和容器的JAR
-
使用
hadoop jar
从命令行运行 -
使用
hadoop jar
运行时可用的配置(对于MR2,可以通过启动扩展Configured
的类并使用ToolRunner.run()
实现Tool
来实现,这使得Configuration
在工具的run
方法中可用)
我想到的方法是:
-
编写容器和AppMaster,设置其POM中提供的YARN和Hadoop依赖关系,将它们与maven-shade-plugin一起打包,就像我为MR作业一样
-
编写客户端,将AppMaster和Container添加为依赖项,使用maven-assembly-plugin打包它以防止提取JAR
我试过斜纹,但无济于事 . 我明白了
java.lang.NoSuchMethodError: com.google.common.collect.Sets.newCopyOnWriteArraySet()Ljava/util/concurrent/CopyOnWriteArraySet;
因为我的Hadoop安装使用Guava 11和Twill需要13.即使Guava 13被遮蔽到Jar中,它也会被忽略 .
2 回答
我找到了一种我称之为“解决方法”的东西,它足以满足我的用例:
我使用Spring YARN构建我的应用程序,从而为Client,Container和AppMaster生成单独的JAR
我将它们作为模块添加到控制版本号的主POM中(每当我在前三个项目之一中更改任何内容时,我都会增加Master POM的版本)
这个Master POM本身就是一个模块,我的整个项目范围内的父POM
大师POM的父母不是项目范围内的大POM,但
spring-boot-starter-parent
当由Jenkins构建时,这会创建上面提到的三个JAR,我现在手动将它们打包到一个文件夹中,旁边有一个启动脚本 . 这只是一个临时解决方案,因为此应用程序包含一个长时间运行的任务,后来由用户从Web应用程序(也基于Spring)启动 . 我仍然需要弄清楚如何从那里提交申请 .
我的想法如下,这类似于我目前为MR工作做的事情:
将JAR作为依赖项添加到Web应用程序的pom.xml中
包含一个基本
application.yml
,三个JAR中没有YARN和JAR信息使用与
Job.setJarByClass()
用于查找AppMaster和Container JAR相同的技术使用
SpringApplication.run()
通过命令行传递连接属性和JAR文件的已解析位置来调用客户端的主类(args
variable)如果这是一个可行的情况,如果有人可以给我一个提示,请告诉我 .
我对此进行了一些挖掘,发现从其他Spring Boot应用程序中打包和生成Spring Boot应用程序并不容易 . 对于我的用例,从不使用YARN的Spring Boot应用程序调用Spring YARN应用程序,以下方法有效:
在"single file mode"中创建Spring YARN应用程序,如this tutorial
将生成的JAR打包到要从中部署它的应用程序中
例如使用Maven时,可以将其添加为依赖项
确保 deploying 应用程序排除了
YarnClientAutoConfiguration
,如下所示:@EnableAutoConfiguration(exclude = YarnClientAutoConfiguration.class)
确保打包插件将JAR打包为整个档案,如
maven-assembly-plugin
或spring-boot-maven-plugin
(不是maven-shade-plugin
)将部署应用程序的大型JAR解压缩到临时目录
使用
ProcessBuilder
在Spring-YARN应用程序上运行java -jar
来运行,在命令行传递正确的配置选项这就是所有类型的hacky,Hadoop肯定需要类似于
Job
的MR作业,这些作业只能在YARN上运行 .