私は、エンティティセットを作成し、大規模なコーパスからペアワイズ類似性を計算できるNLPプロジェクトに取り組んでいます。現在、Hadoopストリーミングを使用しており、 Pythonですべてのマッパーとリデューサーを実装しています。アルゴリズムには数ラウンドのmap-reduceが必要なため、シェルスクリプトを使用してジョブをチェーンします。
これが私の懸念事項であり、次に何をしたいのかです。
[懸念1]。ジョブチェーンとジョブ制御。Hadoopストリーミングジョブの連鎖には問題があります。ジョブシーケンス(job1-job2-job3)のjob2が失敗した場合は、出力フォルダーを手動で削除し、ジョブを起動するスクリプトファイルを調整して、ジョブシーケンスを途中から再実行する必要があります。これを行うためのよりスマートな方法を見つけたいと思っています。アルゴリズムのパラメーターとロジックを頻繁に調整する必要があるため、これらの手順を何度も繰り返したくありません。
[懸念2]。スピードと効率。時間コストの大部分は、テキストを数値に解析するためのものであり、そのような形式変換プロセスはまったく不要だと思います。開発中にこれらのほぼ重複するPythonコードを入力してテストするのにも、多くの時間がかかります。
[懸念3]。保守と配布のしやすさ。プロジェクトが大きくなっているので(私は20以上のmap-reduceジョブを持っています)、プロジェクト全体をモジュール化する必要があります。オブジェクト指向にし、IDEを使用してプロジェクトを開発および保守し、さまざまな内部データ構造と形式をより快適に処理できるようにしたいと考えています。また、他の人が恩恵を受けることができるように、自分のプロジェクトをパッケージとして配布したいと思います。プロジェクト全体をIDEにインポートして、簡単に配布できるようにする簡単な方法が必要です。
私は解決策の可能性についていくつかの調査を行いました:
代替案1.Hadoopカスタムjar:これを行う最良の方法は、プロジェクト全体をjava(hadoopカスタムjar)に変換することだと思われます。これにより、ジョブチェーン、効率、メンテナンスの問題など、すべての問題が解決する可能性があります。しかし、かなり時間がかかる場合があり、効率的なデバッグを行う方法を見つけました。
代替案2.豚:この質問への回答は、いつ豚を使用するか(使用しないか)を判断するのに非常に役立つことがわかりました。答えの中で、Arun_sureshは、「Map / reduce関数内で実行する必要のある非常に具体的な計算がある場合は、独自のjarをデプロイすることを検討する必要があります」と述べています。私の仕事には、瓦礫、ハッシュ、最小ハッシュ、順列などが含まれます。PigLatinを使用して実装できますか?Pig Latinプログラムがどれほど複雑な計算を行うことができるかについてのアイデアを得ることができる場所はありますか?
代替案3.Mahout:新しくリリースされたApache Mahoutバージョンには、私が行っていることと重複するいくつかの機能があることがわかりましたが、それは私の作業を置き換えることはできません。プロジェクトのベースをMahoutにしましょうか。
私は基本的に自分でこの仕事をしており、ハウスキーピング作業全体を行うのに約2週間の時間予算と、それを改善するための約1か月しかありませんので、効率的で信頼できる方法を見つける必要があります。選択肢の1つを選択するのを手伝ってください。または、より良い解決策があるかどうか教えてください。