首页 文章

如何编写可以使用“hadoop -jar”运行的自包含YARN应用程序?

提问于
浏览
1

我必须在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 回答

  • 0

    我找到了一种我称之为“解决方法”的东西,它足以满足我的用例:

    • 我使用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)

    如果这是一个可行的情况,如果有人可以给我一个提示,请告诉我 .

  • 0

    我对此进行了一些挖掘,发现从其他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-pluginspring-boot-maven-plugin (不是 maven-shade-plugin

    • 将部署应用程序的大型JAR解压缩到临时目录

    • 使用 ProcessBuilder 在Spring-YARN应用程序上运行 java -jar 来运行,在命令行传递正确的配置选项

    这就是所有类型的hacky,Hadoop肯定需要类似于 Job 的MR作业,这些作业只能在YARN上运行 .

相关问题