HadoopにおけるDapperライクなトレースの有効化

HadoopにおけるDapperライクなトレース

HTrace

HDFS-5274 は、オープンソースのトレースライブラリであるApache HTrace を使用して、HDFSを介したリクエストのトレースをサポートする機能を追加しました。トレースの設定は非常に簡単ですが、クライアントコードに小さな変更を加える必要があります。

Spanレシーバ

トレースシステムは、「Span」と呼ばれる構造体に情報を収集することで機能します。SpanReceiverインターフェースの実装(HTraceにバンドルされているもの)を使用するか、独自に実装することで、この情報を受信する方法を選択できます。

HTraceは、次のようなオプションを提供しています。

  • FlumeSpanReceiver
  • HBaseSpanReceiver
  • HTracedRESTReceiver
  • ZipkinSpanReceiver

HTraceの設定キーについては、core-default.xmlを参照してください。場合によっては、使用しているSpanReceiverを含むjarを各ノードのHadoopのクラスパスに追加する必要がある場合もあります。(上記の例では、LocalFileSpanReceiverはHadoopにバンドルされているhtrace-core4 jarに含まれています。)

    $ cp htrace-htraced/target/htrace-htraced-4.1.0-incubating.jar $HADOOP_HOME/share/hadoop/common/lib/

トレース設定の動的更新

hadoop traceコマンドを使用して、各サーバーのトレース設定を表示および更新できます。-hostオプションで、namenodeまたはdatanodeのIPCサーバーアドレスを指定する必要があります。すべてのサーバーの設定を更新する場合は、すべてサーバーに対してコマンドを実行する必要があります。

hadoop trace -listは、IDに関連付けられたロードされたSpanレシーバのリストを表示します。

  $ hadoop trace -list -host 192.168.56.2:9000
  ID  CLASS
  1   org.apache.htrace.core.LocalFileSpanReceiver

  $ hadoop trace -list -host 192.168.56.2:9867
  ID  CLASS
  1   org.apache.htrace.core.LocalFileSpanReceiver

hadoop trace -removeは、サーバーからSpanレシーバを削除します。-removeオプションには、SpanレシーバのIDを指定します。

  $ hadoop trace -remove 1 -host 192.168.56.2:9000
  Removed trace span receiver 1

hadoop trace -addは、サーバーにSpanレシーバを追加します。-classオプションの引数として、Spanレシーバのクラス名を指定する必要があります。-Ckey=valueオプションで、Spanレシーバに関連付けられた設定を指定できます。

  $ hadoop trace -add -class org.apache.htrace.core.LocalFileSpanReceiver -Chadoop.htrace.local.file.span.receiver.path=/tmp/htrace.out -host 192.168.56.2:9000
  Added trace span receiver 2 with configuration hadoop.htrace.local.file.span.receiver.path = /tmp/htrace.out

  $ hadoop trace -list -host 192.168.56.2:9000
  ID  CLASS
  2   org.apache.htrace.core.LocalFileSpanReceiver

クラスタがKerberizedされている場合は、-principalオプションを使用してサービスプリンシパル名を指定する必要があります。たとえば、namenodeのSpanレシーバのリストを表示するには、

$ hadoop trace -list -host NN1:8020 -principal namenode/NN1@EXAMPLE.COM

または、datanodeの場合は

$ hadoop trace -list -host DN2:9867 -principal datanode/DN1@EXAMPLE.COM

HTrace APIによるトレーススパンの開始

トレースするには、以下に示すように、トレースされるロジックを**トレーススパン**でラップする必要があります。トレーススパンが実行されている場合、トレース情報はRPCリクエストとともにサーバーに伝播されます。

    import org.apache.hadoop.hdfs.HdfsConfiguration;
    import org.apache.htrace.core.Tracer;
    import org.apache.htrace.core.TraceScope;

    ...


    ...

        TraceScope ts = tracer.newScope("Gets");
        try {
          ... // traced logic
        } finally {
          ts.close();
        }

HTrace APIによるトレースのサンプルコード

以下に示すTracingFsShell.javaは、HDFSシェルコマンドを呼び出す前にトレーススパンを開始するFsShellのラッパーです。

    import org.apache.hadoop.fs.FileSystem;
    import org.apache.hadoop.fs.Path;
    import org.apache.hadoop.conf.Configuration;
    import org.apache.hadoop.conf.Configured;
    import org.apache.hadoop.tracing.TraceUtils;
    import org.apache.hadoop.util.Tool;
    import org.apache.hadoop.util.ToolRunner;
    import org.apache.htrace.core.Tracer;
    import org.apache.htrace.core.TraceScope;
    
    public class Sample extends Configured implements Tool {
      @Override
      public int run(String argv[]) throws Exception {
        FileSystem fs = FileSystem.get(getConf());
        Tracer tracer = new Tracer.Builder("Sample").
            conf(TraceUtils.wrapHadoopConf("sample.htrace.", getConf())).
            build();
        int res = 0;
        try (TraceScope scope = tracer.newScope("sample")) {
          Thread.sleep(1000);
          fs.listStatus(new Path("/"));
        }
        tracer.close();
        return res;
      }
      
      public static void main(String argv[]) throws Exception {
        ToolRunner.run(new Sample(), argv);
      }
    }

このコードは、以下のようにコンパイルして実行できます。

$ javac -cp `hadoop classpath` Sample.java
$ java -cp .:`hadoop classpath` Sample \
    -Dsample.htrace.span.receiver.classes=LocalFileSpanReceiver \
    -Dsample.htrace.sampler.classes=AlwaysSampler

ファイルシステムシェルによるトレーススパンの開始

ファイルシステムシェルは、設定プロパティによってトレースを有効にすることができます。

core-site.xmlまたはコマンドラインで、fs.client.htrace.sampler.classesfs.client.htrace.spanreceiver.classesプロパティを使用して、Spanレシーバとサンプラーを設定します。

$ hdfs dfs -Dfs.shell.htrace.span.receiver.classes=LocalFileSpanReceiver \
           -Dfs.shell.htrace.sampler.classes=AlwaysSampler \
           -ls /

HDFSクライアントの設定によるトレーススパンの開始

DFSClientは内部的にトレースを有効にすることができます。これにより、クライアントのソースコードを変更せずに、クライアントでHTraceを使用できます。

hdfs-site.xmlで、fs.client.htrace.sampler.classesfs.client.htrace.spanreceiver.classesプロパティを使用して、Spanレシーバとサンプラーを設定します。fs.client.htrace.sampler.classesの値は、NeverSampler、AlwaysSampler、またはProbabilitySamplerにすることができます。

  • NeverSampler: namenodeとdatanodeへのすべてのリクエストに対してHTraceは無効になります。
  • AlwaysSampler: namenodeとdatanodeへのすべてのリクエストに対してHTraceが有効になります。
  • ProbabilitySampler: namenodeとdatanodeへのリクエストの一定の割合に対してHTraceが有効になります。
      <property>
        <name>hadoop.htrace.span.receiver.classes</name>
        <value>LocalFileSpanReceiver</value>
      </property>
      <property>
        <name>fs.client.htrace.sampler.classes</name>
        <value>ProbabilitySampler</value>
      </property>
      <property>
        <name>fs.client.htrace.sampler.fraction</name>
        <value>0.01</value>
      </property>