Hadoop에서 Dapper 스타일 추적 활성화

Hadoop에서 Dapper 스타일 추적 활성화

이 문서는 HDFS를 통해 요청을 추적(tracing)하기 위해 Apache HTrace를 설정하는 방법을 설명합니다.

출처: Enabling Dapper-like Tracing in Hadoop

HTrace

HDFS-5274는 오픈소스 추적 라이브러리인 Apache HTrace를 사용해 HDFS를 통한 요청 추적 지원을 추가했습니다. 추적 설정은 꽤 간단하지만 클라이언트 코드에 아주 약간의 변경이 필요합니다.

SpanReceiver

추적 시스템은 'Span'이라고 하는 구조체에 정보를 수집하는 방식으로 동작합니다. 이 정보를 어떻게 수신할지 선택하는 것은 사용자의 몫입니다. HTrace에 번들된 SpanReceiver 인터페이스 구현을 사용하거나 직접 구현할 수 있습니다.

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 명령을 사용해 각 서버의 추적 설정을 보고 업데이트할 수 있습니다. namenode나 datanode의 IPC 서버 주소를 -host 옵션으로 지정해야 합니다. 모든 서버의 설정을 업데이트하려면 모든 서버에 대해 명령을 실행해야 합니다.

hadoop trace -list는 id와 연결된 로드된 span receiver 목록을 보여줍니다.

$ 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 receiver를 서버에서 제거합니다. -remove 옵션은 span receiver의 id를 인자로 받습니다.

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

hadoop trace -add는 span receiver를 서버에 추가합니다. -class 옵션의 인자로 span receiver의 클래스 이름을 지정해야 합니다. -Ckey=value 옵션으로 span receiver와 연결된 설정을 지정할 수 있습니다.

$ 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라면 서비스 주체 이름(service principal name)을 -principal 옵션으로 지정해야 합니다. 예를 들어 namenode의 span receiver 목록을 보려면:

$ hadoop trace -list -host NN1:8020 -principal namenode/[email protected]

또는 datanode의 경우:

$ hadoop trace -list -host DN2:9867 -principal datanode/[email protected]

HTrace API로 추적 span 시작하기

추적하려면 아래처럼 추적할 로직을 추적 span으로 감싸야 합니다. 실행 중인 추적 span이 있으면 추적 정보가 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 셸 명령을 호출하기 전에 추적 span을 시작하는 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

FileSystem Shell로 추적 span 시작하기

FileSystem Shell은 설정 속성으로 추적을 활성화할 수 있습니다.

core-site.xml이나 커맨드라인에서 fs.client.htrace.sampler.classes와 fs.client.htrace.spanreceiver.classes 속성으로 span receiver와 sampler를 구성합니다.

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

HDFS 클라이언트 설정으로 추적 span 시작하기

DFSClient는 내부적으로 추적을 활성화할 수 있습니다. 이를 통해 클라이언트 소스 코드를 수정하지 않고도 클라이언트에서 HTrace를 사용할 수 있습니다.

hdfs-site.xml에서 fs.client.htrace.sampler.classes와 fs.client.htrace.spanreceiver.classes 속성으로 span receiver와 sampler를 구성합니다. fs.client.htrace.sampler.classes의 값은 NeverSampler, AlwaysSampler 또는 ProbabilitySampler가 될 수 있습니다.

  • NeverSampler: namenode와 datanode에 대한 모든 요청에서 HTrace가 OFF.
  • AlwaysSampler: namenode와 datanode에 대한 모든 요청에서 HTrace가 ON.
  • ProbabilitySampler: namenode와 datanode에 대한 요청 중 일정 비율(%)에서 HTrace가 ON.
<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>

더 알아보기 (Learn more)