복붙노트

[HADOOP] 싱크가 실패한 후에 Flume-NG가 강제로 이벤트 백 로그를 처리하도록하려면 어떻게해야합니까?

HADOOP

싱크가 실패한 후에 Flume-NG가 강제로 이벤트 백 로그를 처리하도록하려면 어떻게해야합니까?

내가 서버의 무리 (주로 Tomcat 인스턴스와 아파치 Httpd를 실행하는)에서 로그의 다양한 종류를 수집하고 5 노드 Hadoop 클러스터에서 HDFS로 덤프 Flume - NG를 설치하려고합니다. 설정은 다음과 같습니다.

각 응용 프로그램 서버는 관련 로그를 Exec Source 중 하나 (즉, 각 로그 유형별로 하나씩 : java, httpd, syslog)로 꼬리는데,이 파일은 FileChannel을 통해 Avro 싱크에 전달됩니다. 각 서버에서 서로 다른 소스, 채널 및 싱크가 하나의 에이전트에 의해 관리됩니다. 이벤트는 Hadoop Cluster (SecondaryNameNode와 Jobtracker를 호스팅하는 노드)에있는 AvroSource에 의해 선택됩니다. 각 로그 유형에는 AvroSource가 다른 포트에서 수신 대기합니다. 이벤트는 FileChannel을 통해 HDFS 싱크로 이동합니다. HDFS 싱크는 FlumeEventAvro EventSerializer 및 Snappy 압축을 사용하여 이벤트를 저장합니다.

문제 : JVM의 힙 크기를 변경하지 않았으므로 HDFS 싱크를 관리하는 Hadoop 노드의 에이전트 (각 로그 유형마다 하나씩)가 몇 시간 후에 실패했습니다. 그때부터 Hadoop 노드의 FileChannel이 최대 용량에 도달했기 때문에 해당 노드의 FileChannel과 그 이후에 Application Server의 FileChannel에서 많은 이벤트가 수집되었습니다. 문제를 해결할 때 Hadoop 노드의 에이전트가 백 로그를 신속하게 처리하여 정상 작동을 재개 할 수 없었습니다. FileChannel이 이벤트를 저장하기 전에 저장하는 tmp 디렉토리의 크기는 계속 증가합니다. 또한 HDFS 기록은 실제 속도가 느린 것으로 보입니다. Flume이 새 이벤트를 처리하기 전에 백 로그를 먼저 처리하도록 강제 할 수있는 방법이 있습니까? 다음 구성이 최적입니까? 어쩌면 관련성이 있습니다 : HDFS에 기록되는 파일은 실제로 1 - 3MB 정도의 작은 크기입니다. 64MB의 HDFS 기본 블록 크기와 미래의 MR 작업과 관련하여 확실히 최적이 아닙니다. HDFS 블록 크기만큼 큰 파일에서 이벤트를 수집하려면 어떤 설정을 사용해야합니까? Hadoop 노드의 설정이 올바르지 않다는 느낌이 들었습니다. BatchSize, RollCount 및 관련 매개 변수의 값이 의심 스럽지만 최적 값이 무엇인지 잘 모르겠습니다.

agent.sources=syslogtail httpdtail javatail
agent.channels=tmpfile-syslog tmpfile-httpd tmpfile-java
agent.sinks=avrosink-syslog avrosink-httpd avrosink-java

agent.sources.syslogtail.type=exec
agent.sources.syslogtail.command=tail -F /var/log/messages
agent.sources.syslogtail.interceptors=ts
agent.sources.syslogtail.interceptors.ts.type=timestamp
agent.sources.syslogtail.channels=tmpfile-syslog
agent.sources.syslogtail.batchSize=1

...

agent.channels.tmpfile-syslog.type=file
agent.channels.tmpfile-syslog.checkpointDir=/tmp/flume/syslog/checkpoint
agent.channels.tmpfile-syslog.dataDirs=/tmp/flume/syslog/data

...

agent.sinks.avrosink-syslog.type=avro
agent.sinks.avrosink-syslog.channel=tmpfile-syslog
agent.sinks.avrosink-syslog.hostname=somehost
agent.sinks.avrosink-syslog.port=XXXXX
agent.sinks.avrosink-syslog.batch-size=1
agent.sources=avrosource-httpd avrosource-syslog avrosource-java
agent.channels=tmpfile-httpd tmpfile-syslog tmpfile-java
agent.sinks=hdfssink-httpd hdfssink-syslog hdfssink-java

agent.sources.avrosource-java.type=avro
agent.sources.avrosource-java.channels=tmpfile-java
agent.sources.avrosource-java.bind=0.0.0.0
agent.sources.avrosource-java.port=XXXXX

...

agent.channels.tmpfile-java.type=file
agent.channels.tmpfile-java.checkpointDir=/tmp/flume/java/checkpoint
agent.channels.tmpfile-java.dataDirs=/tmp/flume/java/data
agent.channels.tmpfile-java.write-timeout=10
agent.channels.tmpfile-java.keepalive=5
agent.channels.tmpfile-java.capacity=2000000

...

agent.sinks.hdfssink-java.type=hdfs
agent.sinks.hdfssink-java.channel=tmpfile-java
agent.sinks.hdfssink-java.hdfs.path=/logs/java/avro/%Y%m%d/%H
agent.sinks.hdfssink-java.hdfs.filePrefix=java-
agent.sinks.hdfssink-java.hdfs.fileType=DataStream
agent.sinks.hdfssink-java.hdfs.rollInterval=300
agent.sinks.hdfssink-java.hdfs.rollSize=0
agent.sinks.hdfssink-java.hdfs.rollCount=40000
agent.sinks.hdfssink-java.hdfs.batchSize=20000
agent.sinks.hdfssink-java.hdfs.txnEventMax=20000
agent.sinks.hdfssink-java.hdfs.threadsPoolSize=100
agent.sinks.hdfssink-java.hdfs.rollTimerPoolSize=10

해결법

  1. ==============================

    1.문제를 일으킬 수있는 설정이 몇 가지 있습니다.

    문제를 일으킬 수있는 설정이 몇 가지 있습니다.

    tail -F를 사용하는 경우 새로운 스풀 디렉토리 소스를 사용해 보는 것이 좋습니다. 이 소스를 사용하려면 로그 파일을 스풀 디렉토리 소스가 처리하는 디렉토리로 회전 시키십시오. 이 원본은 불변 파일 만 처리하므로 로그 파일을 순환시켜야합니다. 실행 소스에 tail -F를 사용하면 Flume User Guide에 설명 된대로 문제가 발생합니다.

  2. from https://stackoverflow.com/questions/14613761/how-can-i-force-flume-ng-to-process-the-backlog-of-events-after-a-sink-failed by cc-by-sa and MIT license