Trino

[Trino/Hive] AWS S3 쿼리하기

비번변경 2023. 3. 30. 19:33

 

개요

2023.03.02 - [Trino] 설치/구성/실행

2023.03.19 - [Ubuntu/Hadoop] Single Node/Standalone 설치

2023.03.22 - [Hive] Metastore 설치 및 실행

2023.03.29 - [Trino] Hive Connector 추가

 

최근 위와 같은 글들을 작성했는데, 이 글에서는 Hive Connector를 이용해 Trino로 S3에 저장된 데이터를 쿼리하고 싶다. 간단히 말해 Trino를 AWS Athena처럼 쓰고 싶다.

 

설정 방법을 정리해둔다.

1. 필요한 소프트웨어는 모두 설치되어 동작하고 있다고 가정한다.

2. 이 글에서는 Trino와 Hive Connector로 S3에 연결하는 방법 위주로 적어둔다.

 

 

HMS에 AWS 라이브러리 추가

Hive Metastore가 AWS를 다룰 수 있도록 관련 라이브러리를 추가해야 한다. Hadoop 설치 시 포함되는 라이브러리를 복사해 사용할 수 있다. 복사할 라이브러리는 hadoop-aws-*.jar, aws-java-sdk-bundle-*.jar 두 개로, 아래 경로에 위치해 있다.

$HADOOP_HOME/share/hadoop/tools/lib/

두 개 라이브러리를 $HIVE_METASTORE/lib 디렉터리로 복사한다.

cp /opt/hadoop/share/hadoop/tools/hadoop-aws-3.3.4.jar /opt/hive-metastore/lib/
cp /opt/hadoop/share/hadoop/tools/aws-java-sdk-bundle-1.12.262.jar /opt/hive-metastore/lib/

 

 

 

❗ 만약 이 과정을 건너뛰면 아래와 같은 에러가 발생한다.

failed: java.lang.RuntimeException: java.lang.ClassNotFoundException: Class org.apache.hadoop.fs.s3a.S3AFileSystem not found

 

 

HMS에 AWS 자격 증명 구성

HMS가 AWS에 접근할 수 있도록 자격 증명을 구성한다. Role을 구성하는 게 더 관리하기가 좋지만 이 글에서는 AWS 액세스 키를 이용한다. 액세스 키 생성 과정은 생략한다.

생성한 액세스 키를 HMS 구성 파일에 추가한다.

vi $HIVE_METASTORE_HOME/conf/metastore-site.xml

 

추가할 값

  <property>
    <name>fs.s3a.access.key</name>
    <value>액세스 키</value>
  </property>
  <property>
    <name>fs.s3a.secret.key</name>
    <value>시크릿 키</value>
  </property>

설정을 변경했다면 메타스토어를 재시작한다.

 

 

❗ 만약 이 과정을 건너뛰면 테이블 생성 시 아래와 같은 에러가 발생한다.

java.nio.file.AccessDeniedException
org.apache.hadoop.fs.s3a.auth.NoAuthWithAWSException: No AWS Credentials provided by TemporaryAWSCredentialsProvider SimpleAWSCredentialsProvider EnvironmentVariableCredentialsProvider IAMInstanceCredentialsProvider : com.amazonaws.SdkClientException: Unable to load AWS credentials from environment variables (AWS_ACCESS_KEY_ID (or AWS_ACCESS_KEY) and AWS_SECRET_KEY (or AWS_SECRET_ACCESS_KEY))

 

 

Hive Connector 구성

1. Hive Connector를 구성한다.

vi $TRINO_HOME/etc/catalog/<HIVE_CATALOG_NAME>.properties

 

설정값

connector.name=hive
hive.metastore.uri=thrift://<HIVE_METASORE_SERVER>:9083
hive.s3.aws-access-key=액세스 키
hive.s3.aws-secret-key=시크릿 키

 

2. 카탈로그 생성을 마쳤으면 Trino 서버를 재시작한다.

cd $TRINO_HOME
./bin/launcher restart

 

 

❗ 만약 이 과정을 건너뛰면 테이블 데이터 조회 시 아래와 같은 에러가 발생한다.

 

 

테이블 구성

애플리케이션 구성이 끝났으니 메타스토어에 메타데이터를 생성한다.

 

1. 카탈로그 확인

SHOW CATALOGS;

 

2. 스키마 생성

CREATE SCHEMA "hive-s3".test;
SHOW SCHEMAS FROM "hive-s3";

 

3. 테이블 생성

사용할 데이터는 CSV 형식의 파일이다.

데이터 : https://github.com/trinodb/trino/blob/master/plugin/trino-example-http/src/test/resources/example-data/numbers-1.csv

 

hive의 경우, CSV 형식의 파일은 VARCHAR 타입만 지원한다고 한다.

테이블 이름과 컬럼 정보, 컬럼 타입, 그리고 WITH문에 데이터가 저장된 위치와 데이터 형식을 지정한다.

 

+ 이 글에서는 s3에 데이터가 위치한 경로를 지정할 때 s3:// 가 아니라 s3a://로 시작한다. (fs.s3a.access.key를 설정한 것과 관련있지 않을까 한다.)

CREATE TABLE IF NOT EXISTS "hive-s3".test.numbers (
  text VARCHAR,
  value  VARCHAR
)
WITH (
  external_location = 's3a://test/trino_hive_s3_test/',
  format = 'CSV'
);

 

4. 테이블 조회

SELECT 문으로 데이터를 확인한다.

SELECT * 
FROM "hive-s3".test.numbers;

정상적으로 데이터가 조회되는 것을 알 수 있다.

 

 

참고 문서

https://janakiev.com/blog/presto-trino-s3/

https://trino.io/docs/current/connector/hive-s3.html

 

728x90