HDFS-5274 は、オープンソースのトレースライブラリであるApache HTrace を使用して、HDFSを介したリクエストのトレースをサポートする機能を追加しました。トレースの設定は非常に簡単ですが、クライアントコードに小さな変更を加える必要があります。
トレースシステムは、「Span」と呼ばれる構造体に情報を収集することで機能します。SpanReceiverインターフェースの実装(HTraceにバンドルされているもの)を使用するか、独自に実装することで、この情報を受信する方法を選択できます。
HTraceは、次のようなオプションを提供しています。
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
トレースするには、以下に示すように、トレースされるロジックを**トレーススパン**でラップする必要があります。トレーススパンが実行されている場合、トレース情報は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();
}
以下に示す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.classesとfs.client.htrace.spanreceiver.classesプロパティを使用して、Spanレシーバとサンプラーを設定します。
$ hdfs dfs -Dfs.shell.htrace.span.receiver.classes=LocalFileSpanReceiver \
-Dfs.shell.htrace.sampler.classes=AlwaysSampler \
-ls /
DFSClientは内部的にトレースを有効にすることができます。これにより、クライアントのソースコードを変更せずに、クライアントでHTraceを使用できます。
hdfs-site.xmlで、fs.client.htrace.sampler.classesとfs.client.htrace.spanreceiver.classesプロパティを使用して、Spanレシーバとサンプラーを設定します。fs.client.htrace.sampler.classesの値は、NeverSampler、AlwaysSampler、またはProbabilitySamplerにすることができます。
<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>