-
[Embulk] yml 파일 작성 형식 알아보기 Liquid template 이용하여 yml 파일안에서 변수 사용하기데이터 엔지니어링/Embulk 2022. 8. 30. 22:30반응형
안녕하세요 까치입니다. 회사에서 Embulk를 이용하여 데이터를 s3에 올리는 작업을 하고 있는데 s3에 날짜 별로 폴더를 만들 수 있는지 공부 중에 있었습니다. 방법은 찾았는데 전체적으로 Embulk에서 yml파일을 작성하는 법과 변수를 만들어 사용하는 법 파일을 모듈로 작성하여 사용하는 법에 대해 알아 보려고 합니다.
홈페이지 참조하기
Embulk 공식 홈페이지에 yml파일을 작성하는 방법에 대해 나와있습니다. 아래의 주소로 들어가서 확인 이 가능합니다. 내용을 간략히 살펴 보면
in(source)과 out(sink)을 사용하여 나누고 in과 out은 plugin을 다운받아 사용이 가능하다고 나와있습니다. 자신이 원하는 plugin을 다운받아 사용하고 그 plugin에 맞는 형식으로 in과 out을 설정 하면 됩니다. file 형식 formatter 에서 in은 parser와 decorder를 이용하여 읽을 수 있는 format을 설정이 가능하며, out에는 formatter와 encoder를 이용하여 파일을 쓸 수 있다고 합니다. 아래의 예제를 보면 확인 할 수 있습니다.
in: type: file path_prefix: ./mydata/csv/ decoders: - {type: gzip} parser: charset: UTF-8 newline: CRLF type: csv delimiter: ',' quote: '"' escape: '"' null_string: 'NULL' skip_header_lines: 1 columns: - {name: id, type: long} - {name: account, type: long} - {name: time, type: timestamp, format: '%Y-%m-%d %H:%M:%S'} - {name: purchase, type: timestamp, format: '%Y%m%d'} - {name: comment, type: string} filters: - type: speedometer speed_limit: 250000 out: type: stdout
Using Variables
또한 변수를 사용할 수 있다고 나옵니다. Liquid Template Engine(jinja template같은 template인데 shopify에서 만든 template이다.)이 내장 되어있어 Liquid Template Engine 형식으로 사용하면 된다고 합니다. 이 기능은 시험삼아 해보는 것이고 이후 버전에서는 없어질 수 있다고 합니다. 변수를 사용하는 것이 liquid template engine을 사용하는 것이기 때문에 꼭 파일 명은 {파일명}.yml.liquid 형식으로 작성해야 하며 실행도 embulk run {파일명}.yml.liquid 형식으로 실행 하여야 합니다. 또한 환경변수 설정 한 것을 가져다가 사용할 수 있다고 합니다. env로 만들어 사용할 수 있습니다. liquid engine 사용법은 liquid engine 홈페이지에 자세히 나와 있습니다. 아래 내용을 참고해 주세요
liquid template 사용법 간단하게 알아보기
# 변수 만들어 사용하기 가능 # 변수 선언 {% assign my_variable = "tomato" -%} # 변수 사용하기 {{ my_variable }} # 조건문 사용가능 {% assign username = "John G. Chalmers-Smith" %} {% if username and username.size > 10 %} Wow, {{ username }} , you have a long name! {% else %} Hello there! {% endif %} # operator 사용가능 # basic {% if product.title == "Awesome Shoes" %} These shoes are awesome! {% endif %} # contains {% if product.title contains "Pack" %} This product's title contains the word Pack. {% endif %} # order of {% if true and false and false or true %} This evaluates to false, since the tags are checked like this: true and (false and (false or true)) true and (false and true) true and false false {% endif %} # 반복문 {% for product in collection.products %} {{ product.title }} {% endfor %} # Filter # first {{ "Ground control to Major Tom." | split: " " | first }} Ground # plus {{ 4 | plus: 2 }} {{ 16 | plus: 4 }} {{ 183.357 | plus: 12 }} 6 20 195.357 # ceil {{ 1.2 | ceil }} {{ 2.0 | ceil }} {{ 183.357 | ceil }} output 2 2 184 # 더많은 내용은 liquid 홈페이지 참조
Including file
파일을 만들어 넣을 수 있습니다. 아래와 같이 파일명은 언더바를 넣어 만들라고 하네요. 예를 보면 config.yml.liquid 안에 {% include in_mysql %}이렇게 파일을 불러와 넣었습니다. 그리고 _in_mysql.yml.liquid파일을 만들어 그안에 in이라는 내용을 정의 했습니다. 그러면 in에 대한 내용이 불러와져 config.yml.liquid 파일에 너어지게 됩니다.
File 모두 선택하기
Local file을 넣는 방식입니다. embulk 맨처음 만들면 ~~/sample_ 이라는 path에서 csv파일을 불러오는데 아래와 같이 sample_01, 02, 03, 04이라는 파일이 존재 하면 4가지를 모두 가져오게 하는 설정 입니다. in에 path_prefix를 sample_ 이라고 작성하면 sample_*이라는 문구와 똑같은 작용을 합니다.
그다음 내용은 csv parser option, json parser option, gzip decorder option등 이 홈페이지에 나와 있으니 해당 내용을 보고 자신에게 맞는 형식을 찾아 옵션값을 설정해주면 될 것 같습니다.
File output naming rule 정하기
저는 file을 s3에 내려주는 yml파일을 만들려고 하는데 output에 대한 파일 네임을 설정 해 주어야 되어서 file output plugin을 살펴 보았습니다.
s3에 파일을 내려주게 되면 해당 파일안에 데이터가 csv파일로 내려지게 되는데 path_prefix를 sample_이렇게 끝내주게 되면 파일들이 sample_01.000.csv, sample_02.000.csv로 내려주게 된다고 합니다.
위의 내용을 종합 해 봐서 날짜별로 폴더를 만드는 yml파일을 만들어 봤습니다. out에 path_prefix를 아래와 같이 작성하면 폴더가 만들어지고 날짜 별로 변수가 설정 되어 폴더가 만들어 집니다. {{ "now" | date: "%Y-%m-%d %H:%M:%S"}} liquid template에 now를 활용하여 날짜 변수를 설정하고 자신에 맞는 폴더 명칭을 할당하면 될 것 같습니다.in: type: file path_prefix: /root/try1/csv/sample_ decoders: - {type: gzip} parser: charset: UTF-8 newline: LF type: csv delimiter: ',' quote: '"' escape: '"' null_string: 'NULL' trim_if_not_quoted: false skip_header_lines: 1 allow_extra_columns: false allow_optional_columns: false columns: - {name: id, type: long} - {name: account, type: long} - {name: time, type: timestamp, format: '%Y-%m-%d %H:%M:%S'} - {name: purchase, type: timestamp, format: '%Y%m%d'} - {name: comment, type: string} out: type: s3 path_prefix: {{ "now" | date: "%Y-%m-%d %H:%M" }}/{{ "now" | date: "%S" }} file_ext: .csv bucket: test endpoint: <your-s3-endpoint> access_key_id: <your-access-key> secret_access_key: <your-secret-access-key> formatter: type: csv
반응형'데이터 엔지니어링 > Embulk' 카테고리의 다른 글
[Embulk] Embulk plugin 사용법 및 MySQL to PostgreSQL 패턴 만들기 (0) 2022.08.21 [Embulk] Embulk란? Embulk설치하고 기본 실행해보기 (0) 2022.08.18