티스토리 뷰

SW 개발

Presto, Trino 개념 및 사용법 정리

지단로보트 2021. 5. 7. 14:45

개요

  • Presto는 페이스북이 최초 개발하여 오픈 소스로 공개한 대화식 데이터 쿼리 서비스이다. 이를 이용해 다양한 데이터베이스에 대한 일관된 ANSI SQL 질의가 가능하다.

특징

  • 운영 레벨의 다양한 데이터 소스의 데이터를, 주기적인 배치로 복잡한 ETL 정제 후 Data Warehouse에 저장하는 전통적인 방식과 다르게, 다양한 데이터 소스를 직접 조회할 수 있다. 놀라운 것은 각 데이터베이스의 쿼리 문법을 몰라도 공통된 ANSI SQL을 제공하여 일관된 쿼리 실행이 가능하다. 댜양한 데이터 소스 간의 조인과 집합 연산도 가능한데, 빠른 속도를 보장하기 위해 엔진 레벨에서 분산 컴퓨팅 기법이 사용된다.
  • 페이스북의 내부 직원 약 1,000명은 매일 300PB(페타바이트)에 달하는 페이스북의 데이터를 Presto로 조회하여 업무에 사용하고 있다. [관련 링크]
  • 2020-12-27, Presto의 초기 멤버들이 페이스북을 나와 만든 PrestoSQL 프로젝트가 Trino로 리브랜딩되었다. 이로써 Presto는 페이스북이 주도하는 PrestoDBTrino로 양분되었다. 나와 같이 데이터 뿐만 아니라 여러 업무를 수행해야 하는 엔지니어 입장에서는 일반적으로 Trino가 도입하기 수월하다고 생각된다.
  • Amazon 또한 Presto 0.172 기반으로 시작해 자체 개발한 Amazon Athena 서버리스 상품을 제공하고 있다. 운영 관점에서 서버가 필요 없다는 것은 장점이나, 절대적인 기능은 최신 버전의 Presto, Trino부터 부족하다. (Amaon Athena에 대한 자세한 내용은 본 블로그의 이 글을 참고한다.)
  • 오픈 소스 BI 솔루션인 Metabase에서 Presto를 데이터 소스로 공식 지원한다. 2개를 결합하면 완전한 오픈 소스로만 BI 구축이 가능하다. (Metabase에 대한 자세한 내용은 본 블로그의 이 글을 참고한다.)

config.properties 작성

  • /etc/trino/config.properties 파일을 생성하고 아래 내용을 작성한다.
coordinator=true
node-scheduler.include-coordinator=true
http-server.http.port=8080
discovery-server.enabled=true
discovery.uri=http://localhost:8080

node.properties 작성

  • /etc/trino/node.properties 파일을 생성하고 아래 내용을 작성한다.
node.environment=production
node.data-dir=/data/trino

MongoDB 카탈로그 생성

  • 원격지의 MongoDB 데이터베이스에 연결되는 카탈로그로 생성할 수 있다. /etc/trino/catalog/{catalog-name}.properties 파일을 생성하고 아래 내용을 작성한다.
connector.name=mongodb
mongodb.seeds={host-1}:27017,{host-2}:27017,{host-3}:27017
mongodb.case-insensitive-name-matching=false
mongodb.credentials={username}:{password}@admin
mongodb.ssl.enabled=true

MongoDB 카탈로그 트러블슈팅

  • 컬렉션(테이블) 이름은 소문자 또는 _(언더바)만 사용해야 한다. 대문자가 존재하면 스키마가 정상적으로 생성되지 않아 해당 테이블에 로우가 전혀 없는 것으로 인식한다. MongoDB에서는 아래와 같이 컬렉션 이름을 변경하면 된다. (운영 레벨이라면 애플리케이션 코드 레벨에서도 신중하게 변경을 진행해야 한다.)
db.fooBar.renameCollection("foo_bar")
  • 도큐먼트의 필드명 또한 위와 동일한 이유로 소문자 또는 _(언더바)만 사용해야 정상적으로 인식했었다. 대문자가 존재하면 null 값을 출력했었다. [관련 링크] Trino에서는 2020-05-05 이 문제가 해결되어 대문자가 포함된 필드 값도 정상적으로 인식한다. [관련 링크] 위 카탈로그 설정에 mongodb.case-insensitive-name-matching=false를 추가하면 된다.
  • {database}._schema에 자동 생성된 각 테이블 스키마에 오브젝트의 배열이 array(row(…))가 아닌 row(_pos1…)로 등록되는 경우가 있다.
db._schema.update( {table:'some_collection'}, {$pull:{fields:{'name':'some_field', 'type':'array(row(\"someName\" varchar,\"someType\" varchar))', 'hidden':false}}} )

Dockerfile 빌드 및 컨테이너 실행

  • Trino의 경우, 컨테이너 실행 방법이 Presto보다 훨씬 간단하다.
# Dockerfile 컨테이너 실행
$ docker run -v C:\etc\trino:/etc/trino -v C:\data\trino:/data/trino -p 8080:8080 --name trino trinodb/trino

Presto 콘솔 실행

# Presto 콘솔 실행
$ docker exec -it presto presto
presto>

# 쿼리 실행 결과를 CSV 파일로 저장
$ docker exec -it presto presto --output-format CSV_HEADER --execute "select * from {catalog}.{database}.{collection}" > foo.csv

Presto 기본 명령어

# 카탈로그 목록 조회
show catalogs;

# 특정 카탈로그의 스키마(데이터베이스) 목록 조회
show schemas from {catalog};

# 특정 스키마의 테이블 목록 조회
show tables from {catalog}.{schema};

# 특정 테이블의 컬럼 목록 조회
describe {schema}.{table};

DBeaver 카탈로그 연결

  • PrestoJDBC 드라이버를 제공한다. 이를 통해 JDBC를 지원하는 모든 클라이언트에서 원격 연결이 가능하다. 아래는 오픈 소스 JDBC 클라이언트인 DBeaver에서 연결을 생성하는 방법이다.
DBeaver 실행
→ [Create] 클릭
→ [Connection] 클릭
→ [PrestoDB] 클릭 → [다음] 클릭
→ JDBC URL: jdbc:presto//localhost:8080
→ Database/Schema: {catalog} 입력
→ Username: {catalog.username} 입력
→ Password: {catalog.password} 입력
→ [확인] 클릭
  • SSL이 설정되어 있지 않을 경우, 클라이언트에서 연결시 SSL=false 옵션을 명시해야 오류가 발생하지 않는다. (이 경우, Password 생략이 가능하다.) [관련 링크]
  • MongoDB 커넥터는 최초 연결시 획득한 스키마 정보를 실제 MongoDB의 각 데이터베이스마다 _schema라는 이름의 컬렉션을 생성하여 필드 단위로 저장한다. 이를 통해 Presto에서 보여지지 않는 필드를 보여지게 수정할 수 있다. [관련 링크]

참고 서적

참고 글

댓글
댓글쓰기 폼