HDFS-5274使用开源跟踪库Apache HTrace添加了对通过HDFS跟踪请求的支持。设置跟踪非常简单,但是它需要对客户端代码进行一些非常小的更改。
跟踪系统通过收集称为“跨度”的结构中的信息来工作。由您决定如何使用与HTrace捆绑在一起的SpanReceiver接口的实现或自己实现接收信息的方式。
HTrace提供了诸如
有关HTrace配置键的说明,请参见core-default.xml。在某些情况下,您还需要将包含要使用的SpanReceiver的jar添加到每个节点上Hadoop的类路径中。(在上面的示例中,与Hadoop捆绑在一起的htrace-core4 jar中包含LocalFileSpanReceiver。)
$ 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关联的已加载跨度接收器的列表。
$ hadoop trace -list -host 192.168.56.2:9000 ID类别 1个org.apache.htrace.core.LocalFileSpanReceiver $ hadoop trace -list -host 192.168.56.2:9867 ID类别 1个org.apache.htrace.core.LocalFileSpanReceiver
hadoop trace -remove从服务器删除跨度接收器。-remove选项将跨度接收器的id作为参数。
$ hadoop跟踪-删除1-主机192.168.56.2:9000 删除了跟踪跨度接收器1
hadoop trace -add将跨度接收器添加到服务器。您需要将span接收器的类名称指定为-class选项的参数。您可以通过-Ckey = value选项指定与跨度接收器关联的配置。
$ 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 添加了具有配置hadoop.htrace.local.file.span.receiver.path = /tmp/htrace.out的跟踪跨度接收器2 $ hadoop trace -list -host 192.168.56.2:9000 ID类别 2 org.apache.htrace.core.LocalFileSpanReceiver
如果集群是Kerberized,则必须使用-principal选项指定服务主体名称。例如,要显示名称节点的跨度接收器列表:
$ hadoop trace -list -host NN1:8020 -principal namenode/NN1@EXAMPLE.COM
或者,对于数据节点:
$ hadoop trace -list -host DN2:9867 -principal datanode/DN1@EXAMPLE.COM
为了进行跟踪,您将需要使用跟踪范围来包装被跟踪的逻辑,如下所示。运行跟踪范围时,跟踪信息将与RPC请求一起传播到服务器。
导入org.apache.hadoop.hdfs.HdfsConfiguration; 导入org.apache.htrace.core.Tracer; 导入org.apache.htrace.core.TraceScope; ... ... TraceScope ts = tracer.newScope(“ Gets”); 尝试{ ... //追踪逻辑 }最后{ ts.close(); }
下面显示的TracingFsShell.java是FsShell的包装,它在调用HDFS Shell命令之前开始跟踪范围。
导入org.apache.hadoop.fs.FileSystem; 导入org.apache.hadoop.fs.Path; 导入org.apache.hadoop.conf.Configuration; 导入org.apache.hadoop.conf.Configured; 导入org.apache.hadoop.tracing.TraceUtils; 导入org.apache.hadoop.util.Tool; 导入org.apache.hadoop.util.ToolRunner; 导入org.apache.htrace.core.Tracer; 导入org.apache.htrace.core.TraceScope; 公共类示例扩展已配置的工具Tool { @Override public int run(String argv [])引发异常{ FileSystem fs = FileSystem.get(getConf()); Tracer tracer =新的Tracer.Builder(“ Sample”)。 conf(TraceUtils.wrapHadoopConf(“ sample.htrace。”,getConf()))。 建立(); int res = 0; 试试(TraceScope scope = tracer.newScope(“ sample”)){ Thread.sleep(1000); fs.listStatus(new Path(“ /”)); } tracer.close(); 返回资源; } 公共静态void main(String argv [])引发异常{ ToolRunner.run(new Sample(),argv); } }
您可以如下所示编译并执行此代码。
$ javac -cp`hadoop classpath` Sample.java $ java -cp。:`hadoop classpath`示例\ -Dsample.htrace.span.receiver.classes = LocalFileSpanReceiver \ -Dsample.htrace.sampler.classes = AlwaysSampler
FileSystem Shell可以启用按配置属性进行的跟踪。
通过属性fs.client.htrace.sampler.classes和fs.client.htrace.spanreceiver.classes在core-site.xml或命令行中配置跨度接收器和采样器。
$ hdfs dfs -Dfs.shell.htrace.span.receiver.classes = LocalFileSpanReceiver \ -Dfs.shell.htrace.sampler.classes = AlwaysSampler \ -ls /
DFSClient可以在内部启用跟踪。这使您可以将HTrace与客户端一起使用,而无需修改客户端源代码。
通过属性fs.client.htrace.sampler.classes和fs.client.htrace.spanreceiver.classes在hdfs-site.xml中配置跨度接收器和采样器。fs.client.htrace.sampler.classes的值可以是NeverSampler,AlwaysSampler或ProbabilitySampler。
<属性> <name> hadoop.htrace.span.receiver.classes </ name> <value> LocalFileSpanReceiver </ value> </ property> <属性> <name> fs.client.htrace.sampler.classes </ name> <value> ProbabilitySampler </ value> </ property> <属性> <name> fs.client.htrace.sampler.fraction </ name> <值> 0.01 </值> </ property>