如何编写可以使用" hadoop -jar&#34 ;?运行的自包含YARN应用程序?

时间:2015-01-28 15:44:55

标签: java hadoop yarn

我必须在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文件的确切名称

我想要的是什么:

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

我想到的方法是:

  1. 编写容器和AppMaster,设置其POM中提供的YARN和Hadoop依赖关系,将它们与maven-shade-plugin一起打包,就像我为MR作业打包一样
  2. 编写客户端,将AppMaster和Container添加为依赖项,使用maven-assembly-plugin打包以防止提取JAR
  3. 我试过斜纹,但无济于事。我得到了

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

    因为我的Hadoop安装使用Guava 11和Twill需要13.即使Guava 13被遮蔽到Jar中,它也会被忽略。

1 个答案:

答案 0 :(得分:0)

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

  • 我使用Spring YARN构建我的应用程序,为Client,Container和AppMaster生成单独的JAR
  • 我将它们作为模块添加到控制版本号的主POM中(每当我在前三个项目之一中更改任何内容时,我都会增加Master POM的版本)
  • 这个Master 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和Container JAR
  • 使用SpringApplication.run()通过命令行(args变量)传递连接属性和JAR文件的已解析位置来调用客户端的主类

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