【问题标题】:How to write self-contained YARN applications that can be ran with "hadoop -jar"?如何编写可以使用“hadoop -jar”运行的独立 YARN 应用程序?
【发布时间】:2015-02-04 21:20:22
【问题描述】:

我必须在 Hadoop 集群中运行一些不能用 Map/Reduce 表示的东西。我想为它写一个 YARN 应用程序。我发现 Spring Yarn 用于 spring-boot 并遵循入门(参见链接)。到目前为止,这是可行的,但存在一些缺陷:

  • 在本教程中,生成了三个 JAR(一个用于客户端,一个用于 appmaster,一个用于容器),在提交应用程序时,它们必须位于特定的文件夹结构中
  • 我必须在 application.yml 中硬编码 HDFS URI 和资源管理器主机/端口,或者将它们作为命令行参数提供
  • 由于它基于 Spring Boot,并且应用程序以java -jar 启动,因此创建的 JAR 文件非常大,其中基本上包含了整个 Hadoop 堆栈
  • JAR 文件的确切名称必须在 application.yml 中提及

我想要什么:

  • 单个 JAR,其中包含用于 appmaster 和容器的 JAR
  • 可从命令行使用hadoop jar 运行
  • 使用hadoop jar 运行时可用的配置(对于 MR2,这可以通过启动扩展Configured 的类并使用ToolRunner.run() 实现Tool 来实现,这使得Configuration 在工具中可用run方法)

我想到的办法是:

  1. 编写 Container 和 AppMaster,将 YARN 和 Hadoop 依赖项设置为在其 POM 中提供,并像我为 MR 作业那样使用 maven-shade-plugin 打包它们
  2. 编写客户端,添加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 中,它也被忽略了。

【问题讨论】:

    标签: java hadoop hadoop-yarn


    【解决方案1】:

    我发现了一种我称之为“解决方法”的方法,它足以满足我的用例:

    • 我使用 Spring YARN 构建我的应用程序,从而为客户端、容器和 AppMaster 生成单独的 JAR
    • 我将它们作为模块添加到控制版本号的主 POM(每当我在前三个项目之一中更改任何内容时,我都会增加主 POM 的版本)
    • 这个主 POM 本身就是一个模块,还有我的整个项目范围的大型父 POM
    • Master POM 的父级不是大型项目范围的 POM,而是spring-boot-starter-parent

    当由 Jenkins 构建时,这会创建上述三个 JAR,我目前手动将它们打包到一个文件夹中,旁边有一个启动脚本。这只是一个临时解决方案,因为此应用程序包含一个长时间运行的任务,该任务稍后将由用户从 Web 应用程序(也基于 Spring)启动。我仍然需要弄清楚如何从那里提交申请。

    我的想法如下,这类似于我目前在 MR 工作中的做法:

    • 将 JAR 作为依赖项添加到 Web 应用程序的 pom.xml
    • 在三个 JAR 中包含一个基本的 application.yml,但没有 YARN 和 JAR 信息
    • 使用与 Job.setJarByClass() 相同的技术来定位 AppMaster 和容器 JAR
    • 使用SpringApplication.run()调用客户端的主类,通过命令行传入连接属性和解析的JAR文件位置(args变量)

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

    【讨论】:

      【解决方案2】:

      我对此进行了更多研究,发现从其他 Spring Boot 应用程序中打包和生成 Spring Boot 应用程序并不容易。对于我的用例,从不使用 YARN 的 Spring Boot 应用程序调用 Spring YARN 应用程序,以下方法有效:

      1. 以“单文件模式”创建 Spring YARN 应用程序,如 this tutorial
      2. 将生成的 JAR 打包到要部署的应用程序中
        • 例如使用 Maven 时,可以将其添加为依赖项
      3. 确保 deploying 应用程序排除 YarnClientAutoConfiguration,如下所示:@EnableAutoConfiguration(exclude = YarnClientAutoConfiguration.class)
      4. 确保打包插件将 JAR 打包为整个档案,就像 maven-assembly-pluginspring-boot-maven-plugin 所做的那样(不是 maven-shade-plugin
      5. 将部署应用程序的大 JAR 解压到一个临时目录
      6. 使用ProcessBuilder 在要运行的Spring-YARN 应用程序上运行java -jar,在命令行中传递正确的配置选项

      这有点老套,Hadoop 肯定需要类似于 Job 的 MR 作业,它只是在 YARN 上运行。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多