개요
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 형식의 파일이다.
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