0

在我的公司,我们正在 Hadoop 上开发 MapReduce 应用程序。关于这些项目的依赖管理存在争论,我想听听你的意见。

我们正在使用 Cloudera 的 Hadoop 发行版 (CDH)。

我们的开发工作流程:

  • MapReduce 项目托管在 SVN 存储库中
  • 他们每个人都有一个定义了依赖项的 POM 文件(以及其他一些东西)
  • 我们还创建了 Oozie 工作流项目,这些项目将这些 MapReduce 项目定义为 POM 中的依赖项,并负责定义 MapReduce 项目的执行流程
  • Oozie 项目的构建工件是一个 jar 文件,其中包含它使用的所有 MapReduce jar 及其依赖项(我们使用 Maven 的程序集插件对其进行压缩),这是我们稍后部署到 HDFS 的工件(解压缩后)
  • 我们使用 Maven 构建项目,由 Jenkins 管理
  • 成功的构建被部署到 Archiva 服务器
  • 部署到 HDFS 是 Archiva 按需提供的,获取 Oozie 项目构建的工件,将其提取并放入 HDFS
  • 构建项目不需要一些依赖项(即 Oozie 使用的依赖项;Hive、Sqoop、MySQL 连接器、Jline、commons-...等),但它们需要它才能工作

还在我这儿?

现在的争论是关于定义 MapReduce 和 Oozie 项目的这些依赖关系。有两种观点。

有人说不需要在 POM 文件中定义这些依赖项(即构建项目不需要的依赖项),而是将它们放在 HDFS 的共享目录中,并始终假定它们在那里。

优点:

  • 开发人员不需要照顾这些(但是,他们会照顾其他一些人)
  • 最有可能的是,在更新 CDH 发行版时,在共享目录中更新它们比在每个项目个性中更容易(但不确定这是否有必要)

缺点:

  • 为项目定义了一些依赖项,假设有些依赖项感觉不对
  • 共享目录可能成为未使用 JAR 的接收器,没有人知道哪些仍在使用,哪些未使用
  • 代码变得不那么可移植了,因为它假定这些 JAR 始终存在于 HDFS 中并具有正确的版本

那你们怎么看?

编辑:忘记写了,但很明显,第二个选项是定义所有依赖项——即使它们会在大多数项目中重复并且需要一些维护。

4

1 回答 1

0

我投票支持第二个,这意味着处理和维护每个项目的依赖关系而不是共享目录。因为问题是共享目录会随着时间的推移而改变,一段时间后其他项目将不再工作,导致有人删除了一些依赖项等。所以最好将依赖项保存到他们打算使用的 pom 中。此外,任何项目都将开箱即用,而不依赖于共享目录的当前状态。

您可能会考虑包含一些应该使用的默认依赖项的父 pom。这可以通过dependencyManagement 部分中的定义来处理,并且特定项目定义了没有版本的真正依赖项。另一种解决方案可能是使用import scope

<dependency>
  <groupId>yourGroupIdy</groupId>
  <artifactId>YourArtifactId</artifactId>
  <version>1.0</version>
  <scope>import</scope>
</dependency>

通过这个,可以有一组已定义的依赖项,这些依赖项不需要在每个项目中维护,仅在负责依赖项的单个 pom 项目中。

于 2012-05-14T18:43:27.990 回答