0

私たちは最近、NameNode 関連のメモリとガベージ コレクションの問題を調査するための支援として、いくつかのクラスター (正確なバージョンは異なります) で Hadoop NameNode の GC ロギングを有効にすることを決定しました。クラスタ内のすべての NameNode (アクティブとスタンバイ、またはプライマリとセカンダリ) にこれが必要です。また、発生する可能性があることがわかっている次の 2 つの問題も回避したいと考えています。

  • なんらかの理由で NameNode が再起動したときのログ ファイルの上書き
  • ログがディスク容量を使いすぎて、ディスクがいっぱいになる

プロセスの Java GC ロギングが開始されると、同じ名前のファイルの内容が置き換えられるように見えます。これは、注意しないと、GC ロギングが必要になる可能性が高いときに、GC ロギングが失われることを意味します。

クラスターを十分長く実行し続けると、管理しない限り、ログ ファイルがディスクをいっぱいにします。GC ロギングが現在大量ではない場合でも、ロギング レートが急上昇する原因となる異常な状況が発生するリスクを管理したいと考えています。

4

1 に答える 1

1

起動時に NameNode の JVM パラメータを渡すために hadoop-env.sh で設定できる環境変数には、いくつかの選択肢があります。

  • HADOOP_OPTS(「hadoop dfs」であっても、「hadoop」で始まるすべてのクライアントとサーバーの呼び出しに適用されます)
  • HADOOP_NAMENODE_OPTS(NameNode HA を使用すると、これはアクティブおよびスタンバイ NameNode に影響し、NameNode HA を使用しない場合は、プライマリ NameNode に影響します)
  • HADOOP_SECONDARYNAMENODE_OPTS(NameNode HA がない場合、セカンダリ NameNode に影響します)

HADOOP_NAMENODE_OPTS質問は特に NameNode に関するものであるため、JVM パラメータをand HADOOP_SECONDARYNAMENODE_OPTS(関連する場合)に追加したいと考えています。ここで、そこに含める JVM パラメーターについて説明します。

ファイルへの GC ロギングを有効にするには、-verbose:gc -Xloggc:<log-file-location>.

NameNode が再始動されるたびに上書きされないように、ログ・ファイル名には特別な考慮が必要です。すべての呼び出しに一意の名前を付ける必要があるように思われるため、タイムスタンプを追加することが最善の選択肢のようです。`date +'%Y%m%d%H%M'` のようなものを含めて、タイムスタンプを追加できます。この例では、YYYYMMDDHHMM の形式になっています。Java の一部のバージョンでは、ログ ファイルの場所に「%t」を入れることができます。これは、YYYY-MM-DD_HH-MM-SS 形式の NameNode 起動タイムスタンプに置き換えられます。

次に、ディスク容量の使用を管理します。私が持っているものよりも簡単な方法があればうれしいです。

まず、Java に組み込まれている GC ログ ファイルのローテーションを利用します。-XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=10 -XX:GCLogFileSize=10Mは、このローテーションを有効にする例です。JVM から最大 10 個の GC ログ ファイルがあり、それぞれのサイズは 10 MB 以下です。10 x 10MB は 100MB の最大使用量です。

最大 10 個のファイルを使用して GC ログ ファイルのローテーションを行うと、指定したファイル名に '.0'、'.1'、... '.9' が追加されますXloggc。.0 が最初で、.9 に達した後は .0 を置き換え、ラウンド ロビン方式で続行します。Java の一部のバージョンでは、現在書き込まれているログ ファイルの名前の末尾に「.current」が追加されます。

一意のファイル命名により、上書きを避ける必要があり、NameNode プロセス呼び出しごとに 100MB を使用できるため、これは NameNode GC ログで使用されるディスク領域を管理するための完全なソリューションではありません。最終的に、各 NameNode サーバーに最大 10 個の GC ログ ファイルのセットが作成されます。これは時間の経過とともに増加する可能性があります。これに対する最善の解決策 (*nix の下) は、logrotate ユーティリティ (または他のユーティリティ) を使用して、過去 N 日間変更されていない NameNode GC ログを定期的にクリーンアップすることです。

必ず計算を行い、十分なディスク容量があることを確認してください。

多くの場合、デフォルトよりも多くの詳細とコンテキストが GC ログに必要になるため、追加することを検討して-XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+PrintGCDateStampsください。

これをまとめると、次のようなものを hadoop-env に追加できます。

TIMESTAMP=`date +'%Y%m%d%H%M'`
# location/name prior to .n addition by log rotation
NAMENODE_GC_LOG_NAME="{{hdfs_log_dir_prefix}}/$USER/hdfs-namenode-gc.log-$TIMESTAMP"

NAMENODE_GC_LOG_ENABLE_OPTS="-verbose:gc -Xloggc:$NAMENODE_GC_LOG_NAME"
NAMENODE_GC_LOG_ROTATION_OPTS="-XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=10 -XX:GCLogFileSize=10M"
NAMENODE_GC_LOG_FORMAT_OPTS="-XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+PrintGCDateStamps"

NAMENODE_GC_LOG_OPTS="$NAMENODE_GC_LOG_ENABLE_OPTS $NAMENODE_GC_LOG_ROTATION_OPTS $NAMENODE_GC_LOG_FORMAT_OPTS" 

これは、設定されている場所の上のどこかに挿入する必要がありHADOOP_NAMENODE_OPTSますHADOOP_SECONDARYNAMENODE_OPTS。次に、既存の GC ロギング関連パラメータの代わりにand (存在する場合) を追加$HADOOP_NAMENODE_OPTSします。HADOOP_NAMENODE_OPTSHADOOP_SECONDARYNAMENODE_OPTS

上記では{{hdfs_log_dir_prefix}}/$USER、GC ログをどこにでも移動したい場所に変更できます (おそらく、NameNode ログと同じ場所に移動したいでしょう)。ログ ファイルの名前も変更できます。

Hadoop クラスターを Apache Ambari で管理している場合、これらの変更は HDFS サービス > 構成 > 詳細設定 > 高度な hadoop-env > hadoop-env テンプレートにあります。Ambari では{{hdfs_log_dir_prefix}}、フィールドの数行上に定義された Hadoop ログ ディレクトリ プレフィックスに自動的に置き換えられます。

NameNode の再起動時に GC ロギングが開始されます。NameNode HA があり、両方の NameNode がオンラインの場合、ダウンタイムなしで一度に 1 つずつ再起動できます。

于 2016-10-04T18:27:27.010 に答える