私の会社では、Hadoop で MapReduce アプリケーションを開発しています。これらのプロジェクトの依存関係の管理について議論が行われています。ご意見をお聞かせください。
Cloudera の Hadoop ディストリビューション (CDH) を使用しています。
開発ワークフロー:
- MapReduce プロジェクトは SVN リポジトリでホストされています
- それらのそれぞれには、依存関係が定義されたPOMファイルがあります(およびその他のものも)
- また、これらの MapReduce プロジェクトを POM の依存関係として定義し、MapReduce プロジェクトの実行フローを定義する責任を負う Oozie ワークフロー プロジェクトも作成します。
- Oozie プロジェクトのビルド アーティファクトは、使用するすべての MapReduce jar とその依存関係を含む jar ファイルです (Maven のアセンブリ プラグインを使用して圧縮します)。これは後で HDFS にデプロイするアーティファクトです (解凍後)。
- Jenkinsが管理するMavenでプロジェクトを構築します
- 成功したビルドは Archiva サーバーにデプロイされます
- HDFS へのデプロイは Archiva からオンデマンドで行われ、Oozie プロジェクト ビルドのアーティファクトを取得し、それを抽出して HDFS に配置します。
- 一部の依存関係 (つまり、Oozie で使用されるもの、Hive、Sqoop、MySQL コネクタ、Jline、commons-... など) は、プロジェクトのビルドには必要ありませんが、プロジェクトが機能するためには必要でした。
まだ私と一緒に?
現在の議論は、MapReduce および Oozie プロジェクトのこれらの依存関係を定義することです。二つの立場があります。
これらの依存関係 (つまり、プロジェクトのビルドに不要なもの) を POM ファイルで定義する必要はなく、代わりに HDFS の共有ディレクトリに配置し、常にそこにあると想定する必要があると言う人もいます。
長所:
- 開発者はこれらを処理する必要はありません (ただし、開発者は他の処理を行います)
- ほとんどの場合、CDH ディストリビューションを更新するときは、プロジェクトごとに個別に更新するよりも、共有ディレクトリでこれらを更新する方が簡単です (これが必要かどうかはわかりませんが)。
短所:
- プロジェクトに対していくつかの依存関係が定義されていますが、いくつかは正しくないと想定されています
- 共有ディレクトリは未使用の JAR のシンクになる可能性があり、どれがまだ使用されていてどれが使用されていないか誰もわかりません
- これらの JAR が適切なバージョンの HDFS に常に存在すると想定されるため、コードの移植性が低下します。
それで、あなたたちはどう思いますか?
編集:書くのを忘れましたが、2番目のオプションはすべての依存関係を定義することであることは明らかです-たとえそれらがほとんどのプロジェクトで繰り返され、メンテナンスが必要な場合でも。