Kafka는 broker를 통해서 중재되는 pub-sub (발급-구독) 모델의 메세지 큐 입니다. 발급자(producer)가 데이터를 보내줄때 남기는 로그를 관찰하거나, consumer를 통해 적재된 데이터를 확인하여 모니터링을 할 수 있습니다. 하지만 앞선 방법들로는 토픽의 실시간 흐름을 확인하기 어렵습니다. 카프카내에서 흘러가는 데이터를 뜰채로 건져(스냅샷) 컬럼값을 파싱 한 후, 현재시간과 비교 한다면 아주 좋은 모니터링이 될 수 있습니다.
kafka-console-consumer.sh은 kafka topic에 있는 데이터를 consume 가능한 쉘입니다. sh을 통해 커맨드를 날려도 걱정마세요! sh 이름이 consumer라고해서 실제로 소비되어 없어지는 것은 아닙니다 :P kafka는 consumer group과 offset 을 통해 데이터가 전송되니깐요 :) 참고로, kafka에 저장된 데이터는 운영자가 설정한 기간만큼 저장되었다가 삭제됩니다.
아래명령어를 사용한다면 현재 카프카에 저장된 토픽 userTopic_K 정보를 확인 할 수 있습니다. --max-messages 옵션을 사용하면 메세지 수를 조절할 수 있고, --from-beginning 을 통해 시작 위치를 지정할 수 있습니다
CLI)
/usr/lib/kafka/bin/kafka-console-consumer.sh --zookeeper zookeeper1.localhost.com:2181,zookeeper2.localhost.com:2181,zookeeper3.localhost.com:2181 --topic userTopic_K --max-messages N (--from-beginning)
제가 운영중인 빅데이터분석플랫폼들은 엄청나게 많은 데이터를 처리하고 있습니다. 크기는 무려 페타급 규모이며 어떤 테이블은 모든 파티션의 row가 수십조개나 됩니다. 이런 데이터들을 실시간으로 모니터링한다면 ? 생각만해도 참 숨이 막혀옵니다.
그 규모가 절대 작지 않습니다.
실시간데이터라고 규모가 작지 않습니다. 운영중인 클러스터는 수 십 PB급 규모이며, 수십 개 종류의 데이터를 TB단위로 실시간 적재/전송/처리/제공 하고있습니다.
File System대신 memory 친화적이다.
실시간데이터는 대부분 메모리를 통해 빠른전송방식을 택하고있다는것이 일반적이죠. 메모리를 활용하는 Software들은 File System에 제한적인 정보만 저장하기 때문에, 별도로 로그를 남기지 않는 이상 모든데이터를 검사하는것은 어렵습니다.
모든 데이터를 검사 하더라도, 실시간 데이터를 검사하기 위한 리소스도 많이필요할 것입니다.
그래도 좋은방법은 존재한다.
하지만 흘러가는 데이터의 스냅샷 등을 주기적으로 관찰하거나, 처리중인 데이터의 추이를 활용한다면? 클러스터에 부담가지 않으면서, 인력도 크게 필요하지 않은 효율적인 모니터링이 될것입니다.
이 문서를 통해서 빅데이터클러스터에서 실시간 데이터의 효율적인 모니터링 방법을 익혀보도록 합시다.
2. 모니터링 실전 적용
2.1. ActiveMQ
Apache ActiveMQ란 무엇인가?
Apache ActiveMQ는 다중프로토콜을 지원하는 Java기반의 메시지 브로커입니다. 아파치 재단의 OSS로 누구나 무료로 사용 할 수 있습니다.
ActiveMQ는 아래와 같은 특성을 가집니다.
Java, C, Python, php 등 다양한 언어 간 클라이언트 및 프토토콜을 지원합니다
JMS 1.1 및 J2EE 1.4 를 완벽하게 지원하며, 엔터프라이즈 통합 패턴 및 많은 고급 기능을 제공 합니다.
JMS(Java Message Service) 클라이언트와 메시지 브로커 모두에서 통합패턴에 대해 완벽히 지원합니다.
ActiveMQ의 메시지는 Producer → Broker → Consumer 구조로 처리되며, NexR에서 운영하는 클러스터는 Broker에 Queue 모델을 채택하여 클라이언트/서버 상황에 따라 메시지를 전송합니다.
ActiveMQ 웹 UI 콘솔을 활용한 모니터링
ActiveMQ 기본설치시 간단한 Operation을 위한 web ui도 설치됩니다.
Web UI에서는 ActiveMQ를 통해 전송되는 queue 상태를 확인 할 수 있을뿐만 아니라 세부 메세지 내역도 확인이 가능합니다
1. ActiveMQ 웹 콘솔 메뉴구성
ActiveMQ 웹 콘솔에 (디폴트 url : localhost:8161/admin/) 접속하면 위와 같은 메뉴구성을 만날 수 있습니다.
Home Broker의 이름, 버전, memory usage, uptime 등 메세지 시스템의 기본 구성을 보여줍니다
Queues ActiveMQ를 통해 전송되는 topic들의 queue 상태를 확인 할 수 있습니다.
Topics ActiveMQ를 통해 전송되는 topic들의 다양한 operation이 가능합니다.
2. Queues 탭
Queues 탭에서는 전송되는 topic들의 queue 현황을 확인할 수 있습니다.
보시면 # of pening Message에 숫자가 꽤 쌓여있는것을 볼 수 있습니다. 영문 그대로 "전송되지 못하고 보류중인 데이터"라는 뜻입니다. 이 숫자는 Enqueued 된 메시지중 Dequeued 되지 못한 메시지 수 와 동일합니다.
# of pening Message가 지속적으로 쌓인다면 agent가 제대로 메시지를 처리하지 못하고 있는 뜻인데요, 일부 유실되어도 괜찮은 데이터라면 모르지만 중요한 데이터라면 유실되지 않게 메모리 증설 등 튜닝을 진행하여 줍시다.
우측에 보면 3가지 수행이 가능한 Operation 공간이 있습니다.
Send to는 수동으로 message를 보낼 수 있는 기능입니다. Purge를 활용한다면 pending된 모든 메세지를 없앨 수 있습니다. 이 때 purge를 통해 없어진 데이터들은 모두 유실이 됩니다. delete는 해당 topic을 지울때 사용합니다. 왠만하면 누를일이 없기 바랍니다.
3. 메시지 확인
Queues탭에서 메시지 확인을 원하는 Topic을 클릭한다면, 위 와 같이 메시지들의 정보들을 확인 가능합니다.
Presto는 Facebook kickoff 프로젝트의 내용처럼 TB, PB급 데이터를 효율적으로 처리하기 위해 만들어졌습니다. 대용량의 데이터를 빠르게 추출하기 원하면 Hive 보다는 Presto를 사용하는 것이 적합합니다.
Presto의 핵심은 두가지입니다.
다양한 소스 지원 - Hive 메타스토어, RDBMS, 아마존 S3, HBase 등 다양한 소스로부터 데이터를 읽어올수 있다.
MR보다 빠르다 - MR Job 베이스의 Hive는 중간 단계별 결과를 Disk(HDFS or Local FS)상에 저장하는데, Presto는 이를 Memory상에 저장합니다.
아키텍쳐
에코관점의 Presto 아키텍쳐
Presto는 하나의 Coordinator와 실제로 job을 수행하는 여러개의 Worker로 나누어집니다. Coordinator는 HBase, Hive 등 다양한 데이터 소스등을 읽어와 worker에게 전달을 하는 인터페이스 역할을 합니다.
https://labs.gree.jp/blog/2014/12/12838/
내부 동작 과정 (Daemon)
Coordinator (HIVE의 리소스 매니저와 비슷) * Clinet와 직접적은 통신을 하는 Gateway 역할을 함. * Client를 통해 들어오는 쿼리를 관리하며, Worker가 data 처리를 하게끔 task를 보내줌(= excute).
Worker (HIVE의 노드 매니저와 비슷) * Coordinator를 통해 받은 task를 기반으로 data source에 접근함. * 리턴 결과를 Coordinator가 아닌 바로 Client로 보내 줌.
상세 동작 과정
0.Discovery Service : Worker 실행시 Coordinator의 Discovery Service로 리스트가 등록된다. 이 리스트를 기반으로 Coordinator는 Worker에게 excute를 전달 합니다.
1.Client가 HTTP 프로토콜로 쿼리를 Coordinator Parser 에 전달 합니다.
2.Coordinator는 Planner로 쿼리플랜을 작성 합니다.
3.Planner가 작성되면 Coordinator의 Scheduler는 Worker가 일을 수행하게끔 task를 전달합니다.(excute)
4.Worker는 Connector plugin을 통해 다양한 Data source로부터 데이터를 읽어옵니다. 이 작업은 Memory상에서 수행됩니다. (중요!) 메모리상에서 task가 진행되기 때문에 worker가 부담스러워 하지 않도록 client 딴에서 쿼리 튜닝이 필수입니다. 막 쓰다가 엔지니어와 싸움날 수 있습니다 :(
YARN 클러스터의 리소스를 사용하고자 하는 다른 플랫롬으로부터 요청을 받아 리소스 할당(스케줄링)
NodeManager
YARN 클러스터의 Worker 서버로 ResourceManager를 제외한 모든 서버에 실행
사용자가 요청한 프로그램을 실행하는 Container를 fork 시키고 Container를 모니터링 Container 장애 상황 또는 Container가 요청한 리소스보다 많이 사용하고 있는지 감시(요청한 리소스보다 많이 사용하면 해당 Container를 kill 시킴)
Yarn Architecture
1) 리소스매니저는 글러볼 스케줄러라고 정의할 수 있다. 리소스매니저는 전체 클러스터에서 가용한 모든 시스템 자원을 관리한다. 얀 클러스터에서 실행되는 애플리케이션이 리소스를 요청하면 이를 적절하게 분배하고, 리소스 사용 상태를 모니터링한다.
2) 노드매니저는 맵리듀스의 태스크트래커의 기능을 담당한다. 태스크트래커가 각 슬레이브 서버마다 하나의 데몬이 실행된 것처럼 노드매니저도 각 슬레이브에서 하나의 데몬이 실행된다. 노드매니저는 컨테이너(Container)를 실행하고, 컨테이너의 라이프 사이클을 모니터링한다.
3) 컨테이너는 노드매니저가 실행되는 서버의 시스템 자원을 표현한다. CPU, 메모리, 디스크, 네트워크 같은 다양한 시스템 자원을 표현한다. 맵리듀스의 태스크트래커가 태스크 단위로 잡을 실행했다면 노드매니저는 컨테이너 단위로 애플리케이션을 실행하고 각 상태를 스케줄링한다.
4) 애플리케이션마스터는 하나의 애플리케이션을 관리하는 마스터 서버다. 클라이언트가 얀에 애플리케이션 실행을 요청하면 얀은 하나의 애플리케이션에 하나의 애플리케이셔마스터를 할당한다. 예를 들어, 얀 클러스터에 하나의 맵리듀스 잡과 하나의 스톰 애플리케이션 실행을 요청했다면 두 개의 애플리케이션마스터가 실행된다. 애플리케이션마스터는 애플리케이션에 필요한 리소스를 스케줄링하고, 노드매니저에 애플리케이션이 필요한 컨테이너를 실행할 것을 요청한다.