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>