DistributedCache は参照カウントを使用してキャッシュを管理します。org.apache.hadoop.filecache.TrackerDistributedCacheManager.CleanupThread
参照カウントが 0 の CacheDirs のクリーンアップを担当します。1 分ごとにチェックします (デフォルトの期間は 1 分です。「mapreduce.tasktracker.distributedcache.checkperiod」で設定できます)。
ジョブが終了または失敗すると、JobTracker は TaskTrackers に を送信しますorg.apache.hadoop.mapred.KillJobAction
。次に、TaskTracker が KillJobAction を受け取ると、アクションを tasksToCleanup に配置します。TaskTracker には、taskCleanupThread というバックグラウンド スレッドがあり、taskToCleanup からアクションを取得してクリーンアップ作業を行います。KillJobAction の場合、purgeJob を呼び出してジョブをクリーンアップします。このメソッドでは、この Job ( rjob.distCacheMgr.release();
) が使用する参照カウントを減らします。
上記の分析はに基づいていhadoop-core-2.0.0-mr1-cdh4.2.1-sources.jar
ます。も確認したhadoop-core-0.20.2-cdh3u1-sources.jar
ところ、この 2 つのバージョンにはわずかな違いがあることがわかりました。たとえば、 には がありませんでしorg.apache.hadoop.filecache.TrackerDistributedCacheManager.CleanupThread
た0.20.2-cdh3u1
。ジョブを初期化するとき、TrackerDistributedCacheManager は、このジョブの新しいキャッシュ ファイルを配置するのに十分なスペースがあるかどうかを確認します。そうでない場合は、参照カウントが 0 のキャッシュを削除します。
cdh4.2.1 を使用している場合は、「mapreduce.tasktracker.distributedcache.checkperiod」を増やして、クリーンアップ作業を遅らせることができます。次に、複数のジョブが同じ分散キャッシュを使用する確率が増加します。
cdh3u1 を使用している場合は、キャッシュ サイズの制限 (「local.cache.size」、デフォルトは 10G) とキャッシュの最大ディレクトリ (「mapreduce.tasktracker.cache.local.numberdirectories」、デフォルトは 10000) を増やすことができます。 )。これは cdh4.2.1 にも適用できます。