flume 정리.

Hadoop 2014. 10. 8. 19:17
flume을 막연히 해보려니 하기가 싫다. 
가장 큰 이유는 windows에 설치 하다가 실패해서 인듯.. 역시 안되면 재미가 없넹..
스터디 목적으로 대충 정리를 하니까 할수 있다는 자신감이 생긴다.ㅎ

Flume : Cloudera 에서 공개한 오픈소스 로그 수집기 
(안정성과, 가용성이 높다)

Flume OG : 0.9.x 버전 Cloudera
Flume NG : 1.0 버전 apache

번거로운 Flume OG 의 설정을 개선하기 위해 NG 가 등장.

아키텍쳐가 바뀜

Flume OG

Flume NG



Event : 헤더와 데이터(payload)로  구성되며 agent를 통해 이동되는 단위
Flow : 원점에서 최종 목적지 까지 이벤트들의 흐름
Client : 이벤트의 출발 지점에서 동작 하여 flume으로 전달되는 인터페이스의 구현
           일반적으로 데이터를 소비하는 어플리케이션의 프로세스 골간에서 동작 하며
           예로 Flume Log4j Appender 가 client가 됩니다. 
Agent : sources, channels , sinks 로 구성됨 agent간 이벤트를 이동할 수 있다.
Source : 특정 메커니즘을 통해 전달된 이벤트를 소비 할수 있는 인터페이스 구현 (종류는 아래 참조)
           예로 avro source는 다른 agent로 부터 전달된 avro 이벤트를 수신하기 위해 사용 될수 있는 source 구현 입니다. 
           source는 이벤트를 수신하면 하나 이상의 채널로 넘겨줍니다.
Cannel : event에 대한 일시적인 저장소, sink가 전송 후 해당 이벤트가 제거될때 까지 event는 channel에 유지됩니다. 
           예로 embeded database 백업 파일 시스템을 사용 하는 JDBC 채널이 있습니다.
           channel은 flow 에서 내구성을 보장하는 중요한 역할을 합니다 
Sink : 채널에서 이벤트를 읽어와 출력 대상에 씀 sink가 출력 대상에 이벤트(데이터) 전달을 완료 하면 채널에서 해당 이벤트를 삭제합니다.

이러한 컨셉은 flume의 아키텍쳐 , 구현, 설정, 배포에 도움이 됩니다. 

Folw 구성 종류

Multi-agent (에이전트 간 연결)


Consolidation (다수의 노드를 한곳으로)


Multiplexing (한 이벤트를 다양한 방식으로 처리할 때)


source 의 종류 

Spooling Directory Source : 디렉토리에 새롭게 추가되는 파일을 데이터로 사용
Exec Source : 명령행을 실행하고 콘솔 출력 내용을 데이터 입력으로 사용
Avro Source : 외부 Avro 클라이언트에서 전송하는 데이터 수신해서 입력으로 사용
Trift Source : 외부 Thrift 클라이언트에서 전송하는 데이터 수신해서 입력으로 사용
JMS Source : JMS 메세지를 입력으로 사용
Syslog Source : 시스템 로그를 입력으로 사용
NetCat source : TCP 로 라인 단위 입력 받음

Sink의 종류

HDFS Sink : HDFS에 데이터 파일로 씀
HBase Sink : HBase에 데이터를 씀
Avro Sink : 다른 Avro 서버 (Avro Source) 에 이벤트를 전달 함
Thrift Sink : 다른 Thrift 서버 (Thrift Source)에 이벤트를 전달 함
File Roll Sink : 로컬 파일에 데이터를 씀
MorphlineSolrSink : 데이터를 변환 해서 Solr 서버에 씀
ElasticSearchSink : 데이터를 변환 해서 ElasticSearch 클러스터에 씀.
Null Sink : 이벤트를 버림
 
Interceptor 

 Source로 들어온 이벤트 수정 또는 버릴 때 사용
- Source로 들어온 이벤트는 interceptor 를 거친 뒤에 채널에 전달

Timestamp : 이벤트 헤더에 현재 시간 값 추가
Static Interceptor : 이벤트 헤더에 지정한 값 추가
Regex filtering interceptor : 정규 표현식에 일치하는지 여부에 따라 이벤트를 버릴지 결정

한 개 이상 interceptor 적용 가능





맥에서는 한방에 됨..

참조사이트 : 도움이 많이 되었습니다. 








'Hadoop' 카테고리의 다른 글

windows 에서 hadoop 시작 하기.  (0) 2014.08.14
windows 에서 hadoop 설치  (3) 2014.08.13
Posted by 마법수정화살
,

tomcat 을 사용하고 jsp 소스코드를 수정하여 반영 하는 상황이라고 가정.

오래된 시스템 tomcat 5 이하? 라고 가정

2011년 8월 달에 작업된 파일을 2014년 10월에 수정하는 것으로 가정. 

작업을 진행 하려 했으나 실패하여 롤백을 해야하는 상황이라고 가정

운영서버에 바로 반영 하는 것으로 가정


이런 가정이 맞아 떨어지면 무서운 경험을 할 수 있다. 


꼼꼼한 사람들은 작업전에 기존파일을 이쁘게 백업 해 놓는다


test.jsp : 수정일자 2011년 08월 10일

test.jsp : 수정일자 2014년 10월 8일


반영을 하고 테스트를 하는데.. 뭔가 잘안되서 롤백을 하는 상황.

예전 파일을 다시 운영서버에 덮었는데 정상 동작 하지 않는다. 


여기서 집중력을 잃으면 홀로 헤메이다 큰 낭패를 보며 식은땀을 등으로 흘릴 수 있다.

집중력을 있다면  디버깅을 시작한다.

센스가 있다면 원인을 추측하여 소스보기를 통해 빨리 원인을 찾는다.

경험이 있다면 롤백파일을 수정해서 수정일을 최신화 하거나 tomcat의 work 디렉토리에 해당 파일을 확인하고 지운다.


배신자 톰캣은 때로는 아래와 같은 행동을 하는데 버전별로 어떤지는 모른다.

이전날짜 jsp 파일은 컴파일을 안한다.

톰캣 재시작을 아무리 해도. 컴파일을 안한다. 

Posted by 마법수정화살
,

thread 덤프를 획득 했다면 분석을 해보자.


툴을 이용하자. 

SUM JDK :  TDA , visualvm 플러그인으로도 사용 가능 하다.

IBM JDK : TMDA 

jar 하나이고 java -Xmx500m -jar jca455.jar > 이런식으로 실행할 수 있다. 

TMDA :http://pic.dhe.ibm.com/infocenter/isa/v4r1m0/index.jsp?topic=%2Fcom.ibm.esupport.tool.tmda.doc%2Fdocs%2Freadme.htm


thread 덤프를 확인해 보자


전체적인 문제라면 

전체에서 사용하는 객체에서 lock이 있거나 threadpool을 차서 더이상 요청을 처리할 수 없을때. 

특정 동작이 문제라면 

해당 Thread를 찾아 stack trace로 확인한다.


1. 전체 thread 숫자 와 상태 확인 (IBM JDK의 경우 더많은 시스템 정보를 제공한다.)

- 전체 thread가 was에서 허용 가능한 자원을 다 썼다면 해당 웹 어플리케이션은 응답이 없을 것이다.

2. 각 thread의 상태 확인.

NEW: 새로운 쓰레드로 아직 시작되지 않음
RUNNABLE: JVM이 동작중. 이는 항상 동장하고 있다는 것은 아님. 리소스 획득을 위해서 잠시 대기 중일 수 있다.
BLOCKED: 쓰레드가 synchronized block 혹은 method에 진입하기 위해 대기.
WAITING: 대기 상태로 다른 쓰레드가 작업 중임을 의미. 이는 Object.wait 메소드 호출 후에도 진입되는 상태
TIMED_WAITING: 쓰레드가 특정 시간을 대기함을의미. 이는 Thread.sleep(), Object.wait()로 시간 인자가 들어간 메소드가 호출될때 진입되는 상태. 혹은 LockSupport, ParkNanos, LockSupport, ParkUntil 메소드도 동일
TERMINATED: run 메소드에서 빠져나온 경우 또는 예외가 발생하여 빠져나온 경우

데드락이 없는지 BLOCKED나 WAIT를 유심히 확인한다.

thread는 각각 고유한 정보인 THreadID를 가지고 있다. 문제가 있는 Thread 우선 확인해야 한다. 


Thread 덤프는 한 시점에 대한 정보이므로 여러번 수집하여 어떻게 동작하는지 확인해야 하는 경우도 있다.

3. thread의 stack trace를 유심히 보자.  (아래와 같은 상황을 찾을 수 있다.)

- 어떤 메서드를 실행 중인지

- 어떤 메서드에서 대기중인지 (해당 메서드에 동기화 처리가 되어있는지 확인해 본다)

- DB 풀을 기다리는지 

- DB의 응답을 기다리는지 

등등 

Posted by 마법수정화살
,