ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Embulk] yml 파일 작성 형식 알아보기 Liquid template 이용하여 yml 파일안에서 변수 사용하기
    데이터 엔지니어링/Embulk 2022. 8. 30. 22:30
    반응형

    안녕하세요 까치입니다. 회사에서 Embulk를 이용하여 데이터를 s3에 올리는 작업을 하고 있는데 s3에 날짜 별로 폴더를 만들 수 있는지 공부 중에 있었습니다. 방법은 찾았는데 전체적으로 Embulk에서 yml파일을 작성하는 법과 변수를 만들어 사용하는 법 파일을 모듈로 작성하여 사용하는 법에 대해 알아 보려고 합니다.

    홈페이지 참조하기

    Embulk 공식 홈페이지에 yml파일을 작성하는 방법에 대해 나와있습니다. 아래의 주소로 들어가서 확인 이 가능합니다. 내용을 간략히 살펴 보면

    Embulk: Configuration

    Embulk configuration file format Embulk uses a YAML file to define a bulk data loading. Here is an example of the file: in: type: file path_prefix: ./mydata/csv/ decoders: - {type: gzip} parser: charset: UTF-8 newline: CRLF type: csv delimiter: ',' quote:

    www.embulk.org

    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 language

    Documentation for the Liquid template language, created by Shopify.

    shopify.github.io

    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
    반응형

    댓글

Designed by Tistory.