데이터 엔지니어링은 어떤 방법을 사용하는가?
위 만화는 내가 정말 좋아하는 반-바지님이 그린 단편이다. 이 단편은 한 가지 사실을 다시 한번 알려주고 있다. 모든 프로그램은 처리하는 데이터의 양에 따른 제약을 받는다는 것이다. 이 제약을 해결하는 것이 엔지니어링의 역할이다.
이전의 글에서, 데이터 엔지니어링은 데이터의 형태,공간,속도의 문제를 해결해야 한다고 했다.
다시 말하면 다음과 같다.
먼저, 다양한 형태의 데이터를 모두 처리할 수 있어야 한다.
다음으로, 데이터의 용량이 점점 커지면서 생기는 공간 부족의 문제를 해결해야 한다.
마지막으로, 데이터를 처리하는 데 걸리는 시간은 늘어나는데, 요구되는 속도는 점점 빨라지는 문제를 해결해야 한다.
그렇다면 과연 어떤 방법으로 이런 문제를 해결하고 있을까?
형태의 문제는 이미지, 텍스트 등 다른 형태의 데이터를 다루는 방법에 대한 문제라고 했다.
더 진행하기 전에, 다른 형태의 데이터라는 말을 짚고 넘어가야 한다.
다른 형태라는 말은, 기존에 자주 쓰이거나 익숙한 형태의 데이터가 있다는 말인데, 그게 뭘까?
그건 바로 정형 데이터이다.
정형 데이터는 다른 것이 아니라, 표로 정리될 수 있는 데이터를 말한다.
바로 위와 같은 데이터이다.
그리고 표의 형태로 정리될 수 없는 이미지, 텍스트와 같은 데이터를 비정형 데이터라고 부른다.
비정형 데이터를 가지고 데이터 엔지니어링은 아래와 같은 두 가지 일을 수행해야 한다.
비정형 데이터를 정형 데이터로 바꾸는 일 (그래서 비정형 데이터 기반의 프로그램들이 활용할 수 있도록)
비정형 데이터를 다른 프로그램에서 사용할 수 있는 형태(어떤 형태이든)로 만드는 일
이걸 해결하는 방법은 한 가지로 표현할 수 없다.
여기서는 이해를 도울 수 있는 방법 몇 가지를 소개하고 넘어가겠다.
프로그램이 무엇인가를 기록하기 위해 남기는 파일을 로그라고 부른다. 보통 텍스트의 형태로, 비정형 데이터이다. 표의 형태는 아니지만, 기록을 남길 때에는 일정한 규칙을 따르게 된다. (일기라면 제목/날짜/본문이 나뉘어지는 것과 마찬가지다.) 이 규칙을 이용해서 텍스트 로그를 정형 데이터로 바꾸는 프로그램을 만들 수 있다.
회의록과 같이 사람이 말한 것을 그대로 적은 경우, 위에서 말한 것과 같은 규칙이 있다고 기대할 수 없다. 이런 경우에는 대화 처리에 특화된 방법을 사용해야 한다. 간단하게는 문장을 분리해서 주어/목적어별로 구분하거나 조사를 제거하는 방법부터, 문장의 감정상태를 인식하는 방법까지 연구되어 있다. 결과물은 정형 데이터가 아닐 수도 있다. 하지만 데이터 엔지니어링의 목적에서 말했듯이, 다른 프로그램이 원하는 형태로 만들어 줄 수 있다면 엔지니어링의 역할을 충실하게 수행하는 셈이다.
앞으로는 정형 데이터, 비정형 데이터라는 말이 점점 들리지 않게 될 것이다.
비정형 데이터를 잘 쓰지 않게 되어서가 아니다. 이미지/텍스트 등 비정형 데이터를 사용하는 것이 점점 당연한 것이 될 것이기 때문이다. 당연한 일에 새로운 이름을 붙여서 구분할 필요가 있을까?
그리고 비정형 데이터를 처리하는 방법이 너무나 다양해질 것이기 때문이기도 하다.
각 데이터의 형태에 따라 이름을 붙이면 되지, 굳이 하나의 이름을 붙이는 일 자체도 큰 의미가 없다.
속도와 공간의 문제는 같이 다루겠다. 바로 앞의 글에서 이 두가지 모두 물리적인 문제라고 했기 때문이다.
물리적인 문제의 본질은 결국 모든 시스템이 물리적인 하드웨어의 성능에 제약을 받는다는 것이다.
그리고 이 성능 제약은 우리가 매일 쓰는 스마트폰이나 컴퓨터가 가지는 제약과 다르지 않다.
바로 네트워크 속도, 저장할 수 있는 용량과 읽고 쓰는 속도, 계산 속도이다.
이 문제를 해결하기 위해 흔히 쓰이는 방법 3가지를 소개한다.
데이터 엔지니어링을 여러 개의 하드웨어가 나누어 처리하게 하는 것이다.
그렇게 하면 작업을 나누는 만큼 처리 속도도 빨라지게 된다.
또, 데이터 저장도 분산해서 하면 공간의 문제도 해결할 수 있다. 여러 개의 하드웨어가 나누어서 데이터를 저장하게 하고, 각각 저장된 데이터에 대해서만 업무를 처리하면 된다. 물론 저장은 하나의 하드웨어에서 하고, 처리만 분산해서 하는 방법도 있다.
처리해야 하는 데이터를 모두 메모리에 올려 두고 작업을 하는 것이다.
디스크에 읽고 쓰는 속도보다 메모리에 읽고 쓰는 속도가 훨씬 빠르기 때문이다.
극단적으로 항상 모든 데이터를 메모리에 올려둘 수도 있고, 작업에 필요한 데이터를 메모리에 우선 모두 올린 후 작업을 시작할 수도 있다. 어떤 방법을 쓰든 핵심은 디스크를 읽고 쓰는 작업을 최소화하는 것이다.
극단적으로 빨리 처리해야 하는 경우에 특히 유용하다. 빨리 처리할 작업과 천천히 처리할 작업을 나누어서, 각각 다른 시스템이 처리하게 하는 것이다.
위에 말한 방법들을 조합해서 사용할 수도 있다. 예를 들자면, 메모리에서 분산 처리를 하는 것처럼 말이다.
데이터 엔지니어링이 형태/속도/공간의 문제를 해결하는 방법은 다음과 같다.
형태
비정형 데이터가 가지고 있는 규칙을 활용
해당 데이터 형태에 특화된 처리 방법을 활용
속도/공간
분산해서 처리
메모리에서 처리
데이터 파이프라인을 분리
위에서 말한 방법론들을 사용해서 우리가 처음부터 프로그램을 개발해야 하는 것은 아니다.
이미 그 방법론에 기반해서 수많은 프로그램과 프레임워크들이 개발되어 있다.
빅데이터나 데이터 사이언스를 배운다고 할 때 듣게 되는 수많은 이름들이 바로 그것이다.
마지막으로, 만화의 출처
https://twitter.com/bahnbazi/status/934378617718546432