現在のプロジェクトの 1 つのインフラストラクチャを構築しているときに、既存の HDFS ファイルを置き換えるという問題に直面しました。より正確には、次のことを行いたいです。
継続的にログを生成しているいくつかのマシン ( log-server ) があります。log-serverからログ チャンク (各チャンクの長さは約 30 分、サイズは 500 ~ 800 MB) を受信し、それらを前処理し、Hadoop クラスターの HDFS にアップロードする専用マシン ( log-preprocessor ) があります。 .
前処理は 3 つのステップで行われます。
- 各logserver : フィルター (並列) 受信したログ チャンク (出力ファイルは約 60 ~ 80 MB)
- ステップ 1 からのすべての出力ファイルを結合 (マージソート) し、マイナーなフィルタリングを行います (さらに、30 分のファイルは 1 時間のファイルに結合されます)。
- 外部 DB からの現在のマッピングを使用して、ステップ 2 のファイルを処理して最終的なログ ファイルを取得し、このファイルを HDFS に配置します。
最終的なログファイルは、HADOOP クラスターで実行されているいくつかの periodoc HADOOP アプリケーションの入力として使用されます。HDFS では、ログファイルは次のように保存されます。
hdfs:/spool/.../logs/YYYY-MM-DD.HH.MM.log
問題の説明:
ステップ 3 で使用されるマッピングは時間の経過とともに変化するため、ステップ 3 を再計算し、古い HDFS ファイルを新しいファイルに置き換えることで、これらの変更を反映する必要があります。この更新は、少なくとも過去 12 時間は一定の周期 (10 ~ 15 分ごとなど) で実行されます。マッピングが変更された場合、同じ入力ファイルに step3 を適用した結果が大幅に異なる可能性があることに注意してください(以前の結果の単なるスーパーセット/サブセットにはなりません)。したがって、HDFS の既存のファイルを上書きする必要があります。
ただし、一部の HADOOP アプリケーションが一時的に削除されたファイルを使用している場合、アプリが失敗する可能性があるため、hadoop fs -rmを実行してから hadoop fs -copyToLocalを実行することはできません。私が使用する解決策 - 新しいファイルを古いファイルの近くに置きます。ファイルの名前は同じですが、ファイルのバージョンを示す接尾辞が異なります。現在、レイアウトは次のとおりです。
hdfs:/spool/.../logs/2012-09-26.09.00.log.v1
hdfs:/spool/.../logs/2012-09-26.09.00.log.v2
hdfs:/spool/.../logs/2012-09-26.09.00.log.v3
hdfs:/spool/.../logs/2012-09-26.10.00.log.v1
hdfs:/spool/.../logs/2012-09-26.10.00.log.v2
開始 (セットアップ) 中の Hadoop アプリケーションは、最新バージョンのファイルを選択し、それらを操作します。そのため、何らかの更新が行われている場合でも、入力ファイルが削除されないため、アプリケーションで問題が発生することはありません。
質問:
この複雑で醜いファイルのバージョン管理を使用しない、この問題へのより簡単なアプローチを知っていますか?
一部のアプリケーションは、現在アップロード中だがまだアップロードされていない HDFS ファイルの使用を開始する場合があります (アプリケーションは HDFS でこのファイルを参照しますが、一貫性があるかどうかはわかりません)。gzip ファイルの場合、これによりマッパーが失敗する可能性があります。どうすればこの問題を処理できるかアドバイスをいただけますか? ローカルファイルシステムの場合、次のようなことができることを知っています:
cp infile /finaldir/outfile.tmp && mv /finaldir/output.tmp /finaldir/output
mvはアトミック操作であるため、これは機能しますが、これが HDFS の場合かどうかはわかりません。従来のローカル ファイル システムでHDFS にmv のようなアトミック操作があるかどうかアドバイスをいただけますか?
前もって感謝します!