在我的公司,我们正在 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 中并具有正确的版本
那你们怎么看?
编辑:忘记写了,但很明显,第二个选项是定义所有依赖项——即使它们会在大多数项目中重复并且需要一些维护。