저는 데이터 엔지니어로서, 2019년부터 Flink를 사용하여, stream processing을 업무에 적용하고 있습니다. 데이터 처리에 Flink 사용한 경험을 바탕으로, 데이터 엔지니어로서 Flink를 선택한 이유, Flink를 사용하는 여러가지 방법 그리고 어떤 상황에서 Flink가 가장 사용하기 적합한지를 블로그로 남기고자 합니다. 이 글은 시리즈로 적어 볼까 합니다.
데이터 엔지니어는 데이터와 밀접하게 일하는 직군으로서, 데이터를 수집, 변환 그리고 관리하며, 궁극적으로는 데이터를 필요한 모든 분에게 접근하기 쉽고, 사용하기 좋은 데이터를 제공해주는 직군이라고 생각 합니다.
사실 위에 처럼 거창하게 말했지만, 실제로는 아래와 같은 문제를 해결하는 게 대부분 입니다.
통상적으로 데이터 엔지니어가 푸는 문제: data1 -> processing -> data2
데이터 엔지니어는 위와 같이 data1 모양을 data2 모양으로 변경하는 문제를 풀며, 품질적인 부분으로는 아래와 같은 것들을 고민을 합니다.
사실 가장 중요하다고, 생각하는 5가지 부분만 적은 것이지, 실제로는 list of system quality attributes를 data의 기준으로 대입한다면, 데이터 엔지니어로서 데이터 처리에 대한 높은 퀄리티를 달성할 수 있다고 생각합니다.
데이터 엔지니어와 같은 직군이 생긴 이유는 다음과 같다고 생각 합니다.
이외에도 여러가지 이유가 있겠지만, 위 설명드린 부분들이, 제가 현업에서 데이터 엔지니어로서 일하면서, 실질적으로 회사에 도움을 주었다고 생각되는 부분입니다.
데이터 처리 쪽을 경험 하신 개발자분이시라면, stream processing에 대해서는 한번은 들어보셨을 거라고 예상합니다. 명칭을 그대로 직역해 본다면 흐르며 처리한다... 라고 할 수 있습니다. 기존에 많이 사용되던 batch processing이 발전하여, 보다 소규모 단위로 처리하는 mini-bactch가 되었고, 여기서 더 발전하여, 더 이상 데이터적으로 나뉘면 의미가 없는 단위 바로 직전까지 나뉘어 처리하는 방식을 stream processing 이라고도 부를 수 있을거 같습니다. (이 단위는 작업하는 domain에 따라 row, event, line, document 등이 될수 있습니다.)
하지만, 가장 좋은 정의는 역시 wikipedia 겟죠? 위키에서는 이렇게 정의 합니다. 짧게 요약해서, "Stream processing은 하나의 programming paradigm이며, 어플리케이션을 개발할때, 특별한 병렬처리에 기술을 사용하지 않고도, 단순하게 병렬처리를 할수 있게 도와줍니다." 여기서 키포인트는 단순하게 병렬처리를 할수 있게 해준다는 부분인거 같습니다. 병렬처리 자체도 개발적으로 힘들지만, 처리해야 하는 데이터양이 많아지면, 많아질수록, 병렬처리 난이도는 더 올라가기 때문입니다.
Stream processing은 컴퓨터 개발의 paradigm으로서 간단하게 검색만해도 아주 많은 검색결과로 사용해야하는
이유를 찾을 수 있을것입니다. 하지만, 제 경험을 바탕으로 개발을 진행하면서 stream processing으로 처리하지
않으면 안되겟구나!? 라고 피부로 와닿았던 상황은 아래와 같습니다. (통상적으로 stream processing을 반댓말로 batch processing을 말하기에 batch를 기준으로 상황을 기재 하였습니다.)
Apache Flink는 Apache incubator를 통해, Apache Software Foundation 공식으로 등록된, Apache license 2.0을 가진 open source framework입니다. Apache Flink를 사용하는 대표 회사로서는 사용자로서, Alibaba, AWS Kinesis, Uber, Netflix 등 아주 큰규모로서 많이 사용되었으며, 특히 Alibaba 같은 경우 blink라는 새로운 branch를 만들어 따로 운영하며, 회사 굵직한 서비스에 해당 기술을 사용하고 있습니다. 추가로 Alibaba는 Apache Flink를 만든 회사 Data Artians를 인수할정도로, Flink를 중요시 생각하는 듯 합니다. (필자는 blink라고 불리는 branch가 flink에 merge가 되기를 희망하고 잇기도 합니다....)
Apache Flink 사용자들 - https://flink.apache.org/poweredby.html
Apache Flink는 stream processing을 쉽게 구현할 수 있게 다양한 상황에 사용 가능한 API를 제공합니다. 아래는 해당 API들의 큰 카테고리 입니다. (추후 다른 시리즈로 작성 예정)
간단한 데이터 처리로 flink가 어떻게 동작하는 지 알아 보려고 합니다. 저는 scala와 maven을 사용하겠으며, 목표는 아래와 같습니다.
저는 여기서 ratings.csv 파일만 사용 하려 합니다. (https://grouplens.org/datasets/movielens/)
파일 | 데이터 구조 (ratings.csv) |
---|---|
Flink 프로젝트를 만드는 가장 쉬운 방법은, maven archtype을 통한 방법입니다. 아래의 스크린샷을 통해 InteliJ로 만들어 보겠습니다.
scala
<groupId>org.apache.flink</groupId>
<artifactId>flink-quickstart</artifactId>
<version>1.13.1</version>
결과만 빨리 보려면, 아래 코드 복사 붙여넣기! (자신의 BatchJob package 명으로 변경해주세요!!)
예제코드
package io.gizer
import org.apache.flink.api.scala.ExecutionEnvironment
import org.apache.flink.streaming.api.scala.{StreamExecutionEnvironment, _}
import org.apache.flink.util.Collector
object BatchJob {
def main(args: Array[String]) {
val env = ExecutionEnvironment.getExecutionEnvironment // flink 환경 구성
val result = env.readTextFile("path/to/file") // movielens 파일 읽기
.flatMap((event: String, out: Collector[(String, Int)]) => {
try {
val values = event.split(",") // csv ',' 나누어, 3번째 rating column만 사용
out.collect(values(2), 1) // tuple (String, Int) 데이터 내보내기
} catch {
case e: Exception => // 첫번째 헤더는 에러 처리 무시
}
})
.groupBy(0) // tuple에 첫번째를 기준으로 데이터 모으기
.sum(1) // 각 그룹에 tuple에 두번째 필드기준으로 더하기
result.print() // 결과 프린트!
// execute program
env.execute("MovieLens rate counter")
}
}
실행하게 되면 결과는 아래와 같이 console.log에!
(3.5,3177318)
(4.5,2200539)
(5.0,3612474)
(1.5,399490)
(2.5,1262797)
(3.0,4896928)
(rating,1)
(0.5,393068)
(1.0,776815)
(2.0,1640868)
(4.0,6639798)
저는 Flink를 사용하기 전보다 확실히 데이터 처리하는 코드가 간결해지고, 재사용이 가능한 형식으로 봐뀌는 것을 경험 하였습니다. 데이터 처리 서버관리도, flink에서 제공하는 checkpoint와 savepoint라는 기능을 사용하면, 보다 안정적으로 새로운 코드를 출시할수 있었으며, 데이터 integrity도 잘 지켜지고 있습니다. (checkpoint와 savepoint는 다음에 따로 적어보겟습니다 ㅎ)
다음 시리즈는 위에 사용된 transformation 포함 더 많은 transformation 대한 사용법 및 실무 적용했던 경험을 적어볼 예정입니다. 혹시라도, Flink 사용에 망설이고 계신 데이터 엔지니어 분이 있다면, 이 글이 조금이나마 도움이 되기를 바랍니다.
Apache Flink (공식) - https://flink.apache.org/flink-applications.html
Techcrunch - https://techcrunch.com/2019/01/08/alibaba-data-artisans/
데이터 엔지니어가 고민해야 하는 것들과 언제 stream processing을 고려해야 하는지 알 수 있어서 좋았습니다.
Flink 맛보기도 감사합니다. OOM과 processing time 때문에 좌절하는 순간이 오면 Python으로 Flink 다루는 것을 시도해봐야겠군요. 감사합니다~