본문 바로가기

OpenSource

embulk 이용한 from Rest API to DB 간단 예

embulk 로 간단한 요구 사항 하나 해결해보면서 쉬운 사용법과 괜찮은 성능 맛 본 김에 또다른 작업에 활용해보려고 테스트 중.

외부 업체에서 Rest 방식으로 제공하는 데이터를 받아서 DB 에 저장하는 작업인데 Rest 클라이언트 만들어 처리하는게 그리 어려운 작업은 아니지만 별다른 추가 개발 없이 DB 저장 성능까지 충분히 보장된다는 면에서 충분히 검토해볼만 가치 있다고 판단해서 착수.

딱히 마땅한 레퍼런스가 안 찾아져서 우선 보이는 위 플러그인을 이용해보기로 했다.

% embulk gem install embulk-input-http

github 에 있는 설정 파일 샘플을 이용해서 테스트 실행해보면 'ParserPlugin 'none' is not found' 이라며 파서 부분에서 에러가 난다.
Rest Api 호출해서 JSON 포맷으로 결과 받으니 json 관련 파서 필요할 듯 싶어서 검색.

% embulk gem install embulk-parser-jsonpath

파서 추가 설정 후 테스트해보니 stdout 으로 지정한 컬럼값 잘 출력된다.

이전에 mariadb 이용 위해서 MySQL 플러긴인 아래처럼 이미 설치해놓은 상태

% embulk gem install embulk-output-mysql

업체에서 아직 API 공개해놓지는 않은 상태라 테스트용으로 FastAPI 로 API 하나 급조.

{"id":"OPS1","mode":"S","size":2, "data":[ {"block":"X1","maxRow":25,"minRow":6,...}, {"block":"X2","maxRow":12,"minRow":5,...} ] }

세세한 설정 빼고 꼭 필요한 값만으로 아래와 같이 테스트 설정 파일 작성함.

exec: {}

in:
	type: http
 	url: http://localhost:8000/Ops1
    parser:
    	type: jsonpath
    	root: "$.data"
        columns:
          - {name: block, type: string, path: block}
          - {name: max_row, type: long, path: maxRow}
          - {name: min_row, type: long, path: minRow}

out: 
    type: mysql
    host: ...
    port: 3306
    user: ...
    password: ...
    database: ...
    table: t_block
    mode: insert

MariaDB 에 테이블 만들고 실행해보니 깔끔하게 잘 들어간다.

약간의 값 전환 작업이 필요한데 embulk 에서 파이프라인 식으로 흐름 제어할 수 있는 방법이 있나 찾아봐야겠다. 아니면 java 에서 API 이용해서 직접 embulk 제어하는 방법이 있는지도.

덧.

Ruby 를 사용한 것도 그렇고 레퍼런스 중 상당수가 일본어 문서인 점도 그렇고 해서 일본인이 만든 걸거라 생각하고 좀 찾아보니 treasuredata 라는 회사에서 오픈 소스로 공개한 솔루션 중 하나였다.

그런데, www.treasuredata.com/opensource/ 들어가보니 보통 엔지니어들이 아니다!

fluentd, MassagePack 그리고 JeroMQ ... 헉!!!