Flume 설치 및 기본 설정, sink 테스트 - mongoDB sink 1 of 2

2020. 4. 21. 16:51Development/[Dev] 개발일반

728x90

플룸 설치 및 기본 설정을 통해 telnet 으로 logger 를 보는 sink를 지난 포스트에서 해보았다면 이번에는

sink 방식을 mongoDB와 연결하는 방식이다.

 

지난시간과 마찬가지로 나는 아직 나의 mac을 중고로운 평화나라에 팔지 않은 상태이므로

아래의 모든 내용은 mac을 기준으로 한다..

 

오늘의 요리 순서는 다음과 같다.

(1) flume.conf 파일 수정 : mongoDB sink 향으로 수정
(2) mongoDB sink 를 수행하는 java jar 만들기
(3) sink jar를 flume의 lib 디렉토리에 넣기
(4) flume 실행

 

 

[ 사전 준비 ]

미리 준비해야 할 사항은 로컬에 mongoDB client 가 설치되어 있는 편이 좋으며,

사전지식으로 java 패키지를 jar로 내보내는 것에 대한 개념 (실행가능한 라이브러리)이 다소 필요하다.

 

- 우선 mongoDB sink jar를 만들기 위한 자바 프로젝트 참고 소스는 

https://github.com/nossralf/flume-mongodb-sink

에서 다운로드하여 인텔리j 에서 프로젝트를 오픈해둔다.

 

프로젝트를 오픈하고, 일부 패키지명을 나의 입맛에 맞게 아래와 같이 바꾸었다.

com.sentilab 이하에 클래스 파일이 2개 들어있다

 


(1) flume.conf 파일 수정 : mongoDB sink 향으로 수정

 

$ vi $FLUME_HOME/conf/flume.conf

agent.source = seqGenSrc
agent.channels = hdfschannel
agent.sinks = sink1

# For each one of the sources, the type is defined
agent.sources.seqGenSrc.type = seq
agent.sources.seqGenSrc.channels = hdfschannel
agent.sources.seqGenSrc.port = 9090

agent.sinks.sink1.type = com.sentilab.MongoSink
agent.sinks.sink1.channel = hdfschannel

agent.sinks.sink1.hostNames = localhost
agent.sinks.sink1.database = flume
agent.sinks.sink1.collection = json
agent.sinks.sink1.user = admin
agent.sinks.sink1.password = admin

agent.channels.hdfschannel.type = memory
agent.channels.hdfschannel.capacity = 100
---------------------------------------------
:wq!

*. MongoSink 클래스가 핵심

 


(2) mongoDB sink 를 수행하는 java jar 만들기

  1) build.gradle 파일 변경

  *. 각종 클래스패스 설정 등이 귀찮기때문에 다음과 같이 build.gradle 파일을 수정한다. 

 

plugins {
    id 'jacoco'
    id 'java-library'
    id 'org.sonarqube' version '2.8'
    id 'com.github.johnrengelman.shadow' version '5.2.0'
}

repositories {
    mavenCentral()
}

def flumeVersion = '1.9.0'

dependencies {
    api "org.apache.flume:flume-ng-configuration:${flumeVersion}"
    api "org.apache.flume:flume-ng-core:${flumeVersion}"
    api "org.apache.flume:flume-ng-sdk:${flumeVersion}"

    implementation 'org.apache.commons:commons-lang3:3.10'
    implementation 'org.mongodb:mongodb-driver:3.12.3'
    implementation 'org.slf4j:slf4j-api:1.7.30'
    implementation 'com.google.code.gson:gson:2.8.6'
    implementation 'com.alibaba:fastjson:1.2.61'

    testImplementation 'junit:junit:4.13'
    testImplementation 'org.hamcrest:hamcrest:2.2'
    testCompile 'org.testcontainers:testcontainers:1.14.0'
}

group = 'com.sentilab'
version = '0.1'
description = 'flume-mongodb-sink'
sourceCompatibility = '1.8'

jacoco {
    toolVersion = '0.8.5'
}


check.dependsOn jacocoTestReport

sonarqube {
    properties {
        property 'sonar.projectKey', 'nossralf_flume-mongodb-sink'
    }
}


jar {
    finalizedBy shadowJar
    manifest {
        attributes 'Main-Class': 'com.sentilab.MySink',
                'Implementation-Title': 'MySink'
    }

    from { configurations.compile.collect { it.isDirectory() ? it : zipTree(it) } }
}

tasks.withType(JavaCompile) {
    options.encoding = 'UTF-8'
    options.deprecation = true
}

*. 핵심은 jar { .. } 부분인데, 이는 shadowJar 라는 라이브러리를 통해서, 본 프로젝트에 해당하는 외부 라이브러리들을 하나로 묶어서 jar 안에 다 넣어버리는 역할을 한다. (이렇게 하는게 플룸의 클래스패스 설정 스트레스를 벗어날 수 있다.. 물론 용량은 좀 커져버리는..)

 

 2) java jar 만들기

 1. 빌드 옵션 일부 수정

  -  인텔리j의 우측 [Gradle] 에서 프로젝트 > Tasks > build > jar 를 따라가서 우클릭

-  Arguments 에 Flume Home 디렉토리 경로/lib/*을 넣는다 ( 이 내용은 빼도 되는지 아닌지 확인중)

*. 입력 : -cp /usr/local/Cellar/flume/1.9.0_1/libexec/lib/*

argu 설정

 - 빌드 : 창을 닫고 다시 jar 더블클릭

저 항목을 더블클릭하면 빌드가 시작된다.

*. 정상 빌드 완료시 다음 위치에 2가지 버전으로 jar 파일들이 생성된다.  (외부라이브러리가 함께 들어있는 버전, 아닌버전)

 

 


(3) sink jar를 flume의 lib 디렉토리에 넣기

  1) 바로 전에 만든 (2)번단계 마지막에 생성된 jar 파일중, 외부라이브러리가 함께 포함된 ~~all.jar 파일을 flume의 lib 디렉토리로 복사하여 넣는다.

 


(4) flume 실행

$ cd $FLUME_HOME/lib 

 

$ $FLUME_HOME/bin/flume-ng agent -c conf/ --conf-file ../conf/flume.conf --name agent --classpath "$FLUME_HOME/lib/*" -Dflume.root.logger=INFO,console

 

*. flume.conf 파일의 상대경로에 주의한다.

*. sentilab.MongoSink: MongoDB sink started

 

 

다음 시간은 아마도 이곳에 데이터를 실제로 밀어넣어 몽고DB에 쌓이는 걸 해야겠지....

아..쿠크리가 필요해

728x90