이전 글: https://kgw7401.tistory.com/107
이벤트 데이터 파이프라인 구축하기 (1) - 카프카 구축하기
이전 글: https://kgw7401.tistory.com/105 이벤트 데이터 파이프라인 구축하기 (0) - 개요 깃허브: https://github.com/kgw7401/event-data-pipeline GitHub - kgw7401/event-data-pipeline: 대용량 이벤트 데이터를 위한 파이프라
kgw7401.tistory.com
깃허브: https://github.com/kgw7401/event-data-pipeline
GitHub - kgw7401/log-data-pipeline: 대용량 이벤트 데이터를 위한 파이프라인을 구축하는 프로젝트
대용량 이벤트 데이터를 위한 파이프라인을 구축하는 프로젝트. Contribute to kgw7401/log-data-pipeline development by creating an account on GitHub.
github.com
데이터 엔지니어링 프로젝트를 진행할 때 항상 고민되는 부분은 어떻게 데이터를 가져올 것인가 일 것이다. 파이프라인을 구성하기 위한 좋은 데이터를 구하는 것은 항상 어려운 일이다. 나 또한 이번 이벤트 데이터 파이프라인을 구축하면서 가장 많이 서치한 부분이 데이터 소스이기도 했다...
특히 이벤트 데이터의 경우는 실제 기반을 두고 있는 서비스가 없다면 더더욱 구하기 힘든 것이 사실인데 이번 프로젝트에서 나는 더미 데이터를 만들 때 가장 많이 사용하는 faker 라이브러리를 이용해서 데이터를 생성하기로 했다.
faker 모듈 자체는 어렵지 않게 사용할 수 있지만 이번에 나는 전체적으로 go를 이용해서 어플리케이션을 구축해보기로 하였기 때문에 약간의 어색함이 있었다. 하지만 go 또한 faker 라이브러리가 굉장히 잘 되어 있는 편이라 크게 어렵지 않게 사용할 수 있었다.
Go Faker
위에서 언급한 것처럼 faker 라이브러리 자체는 그리 어렵지 않게 사용할 수 있다. README 정도만 읽어봐도 금방 사용할 수가 있을 것이다. 나는 여기서 약간 더 발전(?)을 시켜서 사용했다. 이벤트를 생성하는 것도 중요하지만 결국 이번 프로젝트의 핵심은 대용량의 이벤트를 처리하고 자동으로 스키마를 검증하는 것이다. 특히 두번째 스키마 검증은 가장 핵심이라고 볼 수 있을 것 같다.
결국 내가 만든 파이프라인이 제대로 스키마를 검증하고 있는지를 확인하려면 잘못된 이벤트도 생성하여야 하는 것이다. 이를 위해 Faker를 이용해서 간단한 라이브러리를 만들어볼까도 생각했었는데 일단 그건 약간 뒤로 미뤄두고.... 이번에는 아주 간단한 방법으로 잘못된 이벤트를 생성할 수 있도록 하였다.
아래는 기존에 올바른 데이터만 보내주는 faker 메서드이다.
type ViewHome struct {
EventName string `json:"event_name,omitempty"`
UserID string `faker:"username" json:"user_id,omitempty"`
DeviceID string `faker:"uuid_hyphenated" json:"device_id,omitempty"`
Platform string `faker:"oneof: web, ios, android" json:"platform,omitempty"`
}
func GenerateViewHome() {
var data []byte
ViewHome := ViewHome{EventName: "view_home"}
err := faker.FakeData(&ViewHome)
if err != nil {
panic(err)
}
data, err = json.Marshal(ViewHome)
if err != nil {
panic(err)
}
sendMessage("view_home", data)
}
나는 그냥 잘못된 이벤트만 보내는 것이 아니라 올바른 이벤트와 잘못된 이벤트의 생성 비율을 정해서 보내는 것이 필요했다. 이를 위해 비율을 지정하여 각각의 이벤트가 해당 확률만큼 생성될 수 있도록 코드를 추가하였다.
type ViewHome struct {
EventName string `json:"event_name,omitempty"`
UserID string `faker:"username" json:"user_id,omitempty"`
DeviceID string `faker:"uuid_hyphenated" json:"device_id,omitempty"`
Platform string `faker:"oneof: web, ios, android" json:"platform,omitempty"`
}
type WrongViewHome struct {
EventName string `json:"event_name,omitempty"`
UserID int `json:"user_id,omitempty"`
DeviceID int `json:"device_id,omitempty"`
Platform string `faker:"oneof: web, ios, android" json:"platform,omitempty"`
}
func GenerateViewHome() {
var data []byte
if maybeSetField(0.5) {
ViewHome := ViewHome{EventName: "view_home"}
err := faker.FakeData(&ViewHome)
if err != nil {
panic(err)
}
data, err = json.Marshal(ViewHome)
if err != nil {
panic(err)
}
} else {
WrongViewHome := WrongViewHome{EventName: "view_home"}
err := faker.FakeData(&WrongViewHome)
if err != nil {
panic(err)
}
data, err = json.Marshal(WrongViewHome)
if err != nil {
panic(err)
}
}
sendMessage("view_home", data)
}
위의 코드는 50% 확률로 올바른 이벤트와 잘못된 이벤트를 생성하는 메서드이다. 사실 위의 코드도 잘 짠 코드는 아니다. 매번 잘못된 데이터에 대한 구조체도 만들어야 하고 약간 귀찮은 부분이 많다. 하지만 일단 현재 단계에서는 충분히 쓸만한 코드여서 일단 전체 파이프라인을 모두 완성할 때까지는 사용하려고 한다.(시간이 되면 로그 생성기 오픈소스를 만들어도 보고싶다)
참고
https://github.com/go-faker/faker
GitHub - go-faker/faker: Go (Golang) Fake Data Generator for Struct, previously https://github.com/bxcodec/faker
Go (Golang) Fake Data Generator for Struct, previously https://github.com/bxcodec/faker - GitHub - go-faker/faker: Go (Golang) Fake Data Generator for Struct, previously https://github.com/bxcodec/...
github.com