AWS 기술 블로그

Amazon EMR에서 Trino와 Apache Superset을 이용한 Federated Query 하기

최근 많은 기업들은 여러 데이터 소스, 즉 클라우드, 온프레미스, 멀티 클라우드 내에 있는 데이터로부터 쉽고 지속적으로 비즈니스 인사이트를 얻기 위해 단일 데이터 쿼리 플랫폼을 도입하려고 고민 중입니다. 더불어, 이 플랫폼에서 데이터 보안 및 거버넌스는 필수적인 요소이며, 기업들은 데이터 소유권을 각 비즈니스 도메인에 유지하면서 데이터를 제품으로서 지속적으로 생산 및 재활용하기를 원합니다. 이를 뒷바침하는 아키텍처로 Data FabricData Mesh 아키텍처를 고려할 수 있습니다. 이 두 가지 아키텍처에 대한 개념적 차이는 존재하지만, 비즈니스 사용자가 다양한 위치에 존재하는 데이터 소스에 즉시 접근하여 인사이트를 도출하고, 민첩한 비즈니스 전략을 수립하도록 돕는다는 공통의 목표를 가지고 있습니다.

이번 게시글에서는 이를 위한 한 가지 방법으로, Apache Superset(단일 SQL UI), Trino(통합 쿼리 엔진), Apache Ranger(데이터 거버넌스)의 조합을 통한 Federated Query 아키텍처를 소개합니다.

솔루션 개요

Amazon EMR 6.7부터 EMR Ranger Trino Plugin을 제공하고 있습니다.

이번 게시글에서 다루는 아키텍처는 기존 게시글인 Introducing Amazon EMR integration with Apache Ranger를 참조하였으며, 기존 게시글의 일부 오류 수정을 포함한 아래와 같은 내용을 다룹니다.

  • US-EAST-1 이외 리전에서 발생하는 기존 AWS CloudFormation Stack  배포 오류 수정
  • SQL UI 도구로 Hue 이외에 Apache Superset을 이용하는 방법
  • 단일 쿼리 엔진 도구로 Trino를 이용한 여러 데이터 소스에 대한 Federated Query 방법
  • Amazon EMR Application UI에 Application Load Balancer를 통해 접근하는 방법

Apache Superset은 데이터 조회, 시각화 및 대시보드를 생성하기 위한 웹 플랫폼입니다. 데이터 대시보드를 만드는 데 어떤 프로그래밍 언어가 필요하지 않습니다. 차트를 쉽게 만들고 다른 사용자와 공유할 수 있으며 기본적으로 제공되는 역할 및 권한 관리를 사용하여 보안을 유지할 수 있습니다. 또한 소스 데이터에 행 수준 보안을 활성화하여 세부적인 데이터 접근 보안을 구성할 수 있습니다. 이런 기능을 활용하여 Airbnb에서는 Apache Superset을 셀프 서비스 비즈니스 인텔리전스(BI) 솔루션으로 활용하고 있습니다.

솔루션 아키텍처

Apache Superset은 단일 SQL UI를 제공하며, Trino는 Amazon RDS, Amazon Redshift, Google BigQuery, AWS Glue Data Catalog와 같은 다양한 데이터 소스에 대한 단일 쿼리 엔진의 역할을 합니다. 이 아키텍처를 이용하면, 데이터 분석가 또는 비즈니스 사용자는 데이터 소스별로 별도의 쿼리 엔진없이 기업이 보유한 여러 데이터 소스를 하나의 SQL 인터페이스를 통해 조회하고 분석할 수 있습니다.

단계 요약

이 게시글에서 필요한 서비스는 AWS CloudFormation Stack으로 배포되며, 3개의 Stack으로 구성되어 있습니다.

  • 단계 1 : 준비단계 – 필요한 스크립트, AWS Profile 설정, Amazon S3 버킷 생성 등
  • 단계 2 : AWS CloudFormation Stack 생성 – VPC, Windows AD, Bastion Host, Amazon RDS, Ranger Admin Server, Amazon EMR Cluster, Application Load Balancer 생성 등
  • 단계 3 : Apache Superset 생성 – Superset 설치 및 구성
  • 단계 4 : Trino에서 데이터 소스 설정
  • 단계 5 : Apache Ranger에서 권한 설정 및 Superset에서 데이터 조회

사전 준비사항

솔루션을 배포하기 위해서는 아래와 같은 사항을 미리 준비해야 합니다.

단계 1 : 준비단계

1. CloudFormation Stack을 여러분의 리전에 배포하기 위한 스크립트 다운로드

아래와 같이 스크립트를 여러분의 PC에 다운로드합니다.

wget https://aws-korea-tech-blog-public.s3.ap-northeast-2.amazonaws.com/artifacts/aws-blog-emr-ranger/3.0/scripts/setup-regional-ranger-automation.sh

2. AWS Profile 설정

aws configure --profile emr-trino
AWS Access Key ID [None]: XXXXXXXXXX
AWS Secret Access Key [None]: XXXXXXXXXXXXXXXX
Default region name [None]: ap-northeast-2
Default output format [None]:

3. Amazon S3 버킷 생성

필요한 스크립트가 저장될 여러분의 S3 버킷을 생성합니다.(예 : aws-emr-artifact)

aws s3 mb s3://aws-emr-artifact --region ap-northeast-2 --profile emr-trino

4. 여러분의 리전에 CloudFormation Stack 배포를 위한 스크립트 실행

앞에서 다운로드한 스크립트를 실행할 때, 아래 파라미터를 참조합니다.

#파라미터 설명
# arg1 : AWS profile 
# arg2 : AWS_REGION - eg: ap-northeast-2 
# arg3 : 위에서 생성한 S3 버킷명, 예: aws-emr-artifact 

#스크립트 실행 방법 
#setup-regional-ranger-automation.sh arg1 arg2 arg3 

예시) 
sh setup-regional-ranger-automation.sh emr-trino ap-northeast-2 aws-emr-artifact

위 명령이 정상적으로 완료되면, 아래와 같이 여러분이 생성한 S3 버킷에 필요한 파일이 업로드됩니다.

5. Self-Signed Certificate 생성

Apache Ranger Admin Server와 Plugin간 TLS 통신을 위한 Self-Signed Certificate를 생성하고 Secrets Manager에 등록합니다.

1) Self-Signed Certificate 생성을 위한 스크립트를 다운로드합니다.

wget https://aws-korea-tech-blog-public.s3.ap-northeast-2.amazonaws.com/artifacts/aws-blog-emr-ranger/3.0/scripts/emr-tls/create-tls-certs.sh

2) Certificate 생성 스크립트를 실행합니다.

아래 파라미터를 참조하여 다운로드한 스크립트를 실행합니다. 이 스크립트는 Apache Ranger Admin Server와 Plugin(Spark, Hive, EMRFS, Trino)간 TLS 통신을 위해 필요한 Public Key와 Private Key를 생성하고, AWS Secrets Manager에 등록합니다.

#파라미터 설명
# arg1 : AWS profile
# arg2 : EC2 Realm, 리전이 us-east-1이면, ec2.internal이고, 이외 이전이면 compute.internal
# arg3 : AWS_REGION - eg: ap-northeast-2
# arg4 : 위에서 생성한 S3 버킷명, 예: aws-emr-artifact

#스크립트 실행 방법
#create-tls-certs.sh arg1 arg2 arg3 arg4

예시)
sh create-tls-certs.sh emr-trino compute.internal ap-northeast-2 s3://aws-emr-artifact

주의 : 두 번째 파라미터인 EC2 REALM은 US-EAST-1 리전인 경우는 ‘ec2.internal’, 그 외 모든 리전에서는 ‘compute.internal’을 입력합니다. US-EAST-1 리전 이외의 리전에서 생성되는 Certificate의 Common Name(CN)은 “*.{AWS::Region}.compute.internal”으로 설정됩니다.

스크립트가 성공적으로 완료된 후, AWS Secrets Manager -> Secrets에서 등록된 Secrets를 확인할 수 있습니다. Secret Name은 emr/ranger* 입니다.

위 명령을 수행할 때, 아래와 같이 에러가 발생한다면, 명령을 수행하는 여러분의 Local PC에 Java Runtime을 설치한 후, 다시 실행하여야 합니다.

The operation couldn’t be completed. Unable to locate a Java Runtime. Please visit http://www.java.com for information on installing Java.

Java Runtime설치는 https://www.java.com/를 방문하여, 다운로드하고 설치합니다.

위 명령이 정상적으로 완료되면, 아래와 같이 AWS Secrets Manager에 Secret이 등록됩니다.

단계 2 : AWS CloudFormation Stack 생성

1. VPC/Windows AD/Bastion Host 생성

  • 모든 패스워드 파라미터는 ‘Awsuser1’이 기본값입니다.
  • S3 Bucket 파라미터에는 여러분이 생성한 S3 버킷명을 입력합니다.(예 : aws-emr-artifact)
  • CloudFormation Stack 출력값은 두 번째 Stack의 파라미터로 사용되므로, 기록해둡니다. 이 Stack은 완료되는데 20~30분 정도 소요됩니다.

2. Amazon RDS/Ranger Server/Amazon EMR Cluster 생성

Amazon EMR 6.7이상부터 Apache Ranger의 Trino plugin이 지원되기 때문에, emrReleaseLabel는 ’emr-6.7.0’을 선택해야 합니다.

이 Stack은 완료되는데 40분 정도 소요됩니다.

파라미터
LDAPHostPrivateIP 이전 스택의 출력값
모든 Password 이전 스택에서 입력한 패스워드(기본값 : Awsuser1)
EMRLogDir 이전 단계에서 생성한 자신의 S3 버킷(예 : s3://aws-emr-artifact)
VPC/Subnet 이전 스택의 출력값
AppsEMR Hadoop, Spark, Hive, Livy, Hue, Trino(Trino 선택 필수)
S3Bucket 이전 단계에서 생성한 자신의 S3 버킷명(예 : aws-emr-artifact)
emrReleaseLabel emr-6.7.0(필수)

RangerAdminPassword의 기본값은 admin입니다.

3. Application Load Balancer 설정

Amazon EMR의 Application UI에 직접 접근하기 위해서는 SSH Tunneling이 필요합니다. 이번 게시글에서는 SSH Tunneling없이 Private 또는 Public Subnet에 있는 EMR Application Web UI에 접근하기 위해 Application Load Balancer를 설정하겠습니다.

1) Apache Ranger Admin Server를 위한 Certificate 임포트하기

Apache Ranger Admin Server에 HTTPS로 접근하기 위해 Self-Signed Certificate를 임포트합니다.

cd <단계 1 : 준비단계에서 생성한 Certificate의 위치>
cd ranger-server
aws acm import-certificate --certificate fileb://trustedCertificates.pem \
--certificate-chain fileb://certificateChain.pem \
--private-key fileb://privateKey.pem --tags Key=Name,Value="Ranger Certificate" --profile emr-trino --region ap-northeast-2

[출력값 예시]
{
    "CertificateArn": "arn:aws:acm:ap-northeast-2:012345678901:certificate/57c8cc64-2838-4177-849d-049a2ff4f739"
}

위 명령의 출력값으로 Certificate ARN이 출력됩니다. 이 값은 다음 단계인 ALB 설정에서 사용되므로, 기록해둡니다.

2)Application Load Balancer 생성하기

  • 이전 단계에서 생성한 EMR Cluster가 실행 중인 VPC를 선택하고, ALB가 실행될 Public Subnet을 선택합니다.
  •  “Provide Ingress IPV4 CIDR block for Inbound SG rule to restrict ALB…” 파라미터에는 여러분의 PC IP Address의 CIDR를 입력합니다. PC IP Address는 https://www.whatismyip.com/에서 확인할 수 있습니다. 예를 들어, PC IP Address가 27.0.3.148인 경우, 27.0.3.0/24를 입력합니다.
  • EMR Master Instance, Apache Ranger Admin Server를 선택하고, 이전에 생성된 Certificate ARN을 입력합니다. EMR Master Instance는 EMR Console->Hardware Tab에서 Node type이 Master로 표시된 EC2 instance ID를 선택합니다.

3)Trino 설정 파일 변경 및 Trino 프로세스 재시작

Trino에 HTTP 접속을 위해 EMR Master Node의 Session Manager로 접속하여, Trino Configuration 파일에 아래 파라미터를 추가/수정합니다.

sudo su - 
vi /etc/trino/conf/config.properties
#Change from false to true
http-server.http.enabled = true 
#Add to allow http access
http-server.authentication.allow-insecure-over-http=true 
#Add for accessing through Load Balancer
http-server.process-forwarded=true 

config.properties을 수정한 후에는 Trino 서비스를 재시작합니다.

sudo systemctl restart trino-server

Trino 서비스를 재시작한 후,  Trino Web UI에 정상적으로 접속되는지 확인합니다. Trino Web UI URL은 세번째 CloudFormation 출력값에서 확인할 수 있습니다. 아직까지 Superset UI에는 접속할 수 없습니다.

현재까지 구성된 서비스에 대한 시작/종료를 위해서는 아래 명령을 참조합니다.

# 서비스 목록 보기
systemctl --type=service

# Ranger 서비스 재시작
sudo /usr/bin/ranger-usersync restart
sudo /usr/bin/ranger-admin restart

# Hue 서비스 재시작
sudo service hue.service restart

# Trino 서비스 재시작
sudo service trino-server.service restart

# 시스템 보안 서비스 데몬 재시작
sudo service sssd restart

# Kerberos 서비스 재시작
sudo service krb5kdc start 
sudo service kadmin start

단계 3 : Apache Superset 생성

Apache Superset을 EMR Master Node에 설치합니다.

1.EMR Master Node 접속

EMR Master Node에 Session Manager를 통해 접속합니다.

2.Apache Superset DB 설정

Superset DB는 이전 단계에서 생성한 Apache Ranger DB를 이용합니다. 아래와 같이 Superset을 위한 Database를 추가합니다.

sudo su - 
mysql -h <두번째 CloudFormation의 RDSInstanceAddress 출력값> -u root -p<이전 단계 CloudFormation 파라미터로 입력한 패스워드> 

예시) 
mysql -h rangerdb.xxxxxxxx.ap-northeast-2.rds.amazonaws.com -u root -pAwsuser1 
create database supersetdb; 
flush privileges; 
show databases;

3.Python 3.9 설치

Apache Superset 2.0+은 python 3.8+에서 작동합니다. 최신버전 Apache Superset을 설치하기 위해, python 3.9버전을 EMR Master Node에 설치합니다.

sudo su - root
cd /opt
wget https://www.python.org/ftp/python/3.9.6/Python-3.9.6.tgz
tar zxvf Python-3.9.6.tgz

sudo yum -y install gcc gcc-c++ libffi-devel python3-devel python3-pip python3-wheel \
openssl-devel cyrus-sasl-devel openldap-devel bzip2-devel sqlite-devel xz-devel

cd /opt/Python-3.9.6/
sudo ./configure --enable-optimizations
sudo make && make altinstall

4.Apache Superset 설치

Apache Superset의 설정 파일인 superset_config.py는 기본 설정 파일인 config.py를 Override합니다. 추가적인 설정이 필요한 경우, superset_config.py 파일에 추가할 수 있습니다. 이 게시글에서는 AUTH_TYPE=LDAP으로 지정하였습니다. Apache Superset에 접속할 때, LDAP에 존재하는 사용자가 아니라면, Superset User로 등록되어 있더라도 로그인되지 않습니다.

또한 AUTH_USER_REGISTRATION=True로 설정하면, LDAP User로 등록되어 있는 경우, Superset User로 자동 등록됩니다.

create_superset.sh 스크립트를 다운로드하고, 아래와 같이 실행합니다.

sudo su - hadoop
mkdir superset
cd superset
wget https://aws-korea-tech-blog-public.s3.ap-northeast-2.amazonaws.com/artifacts/aws-blog-emr-ranger/3.0/scripts/apache-superset/create_superset.sh

Superset 설치 스크립트를 실행합니다. 이전 CloudFormation Stack의 출력값에서 RDS Instance Endpoint와 LDAP Host IP를 참조합니다.

#스크립트 실행 방법
# sh create_superset.sh <superset_port> <db_user> <db_password> <database_uri> <db_name> <ldap_ip_address> <ldap_binduser_password>

예시)

sh create_superset.sh 8282 root Awsuser1 rangerdb.xxxxxx.ap-northeast-2.rds.amazonaws.com supersetdb xx.xx.xx.xx Awsuser1

<ldap_ip_address>는 첫번째 CloudFormation의 LDAPHostPrivateIP 출력값을 입력합니다.

이제 Apache Superset Web UI에 접속할 수 있습니다. 사용자는 awsadmin, 패스워드는 Awsuser1입니다. 접속 URL은 Application Load Balancer의 CloudFormation Stack의 출력값을 참조합니다.

Superset 서비스를 수동으로 재시작하기 위해서는 아래와 같이 수행할 수 있습니다.

# Superset 프로세스 중지
kill -9 <superset process id>

# Superset 프로세스 시작
예시)
sudo su - hadoop
cd superset
. venv/bin/activate
nohup superset run --host ip-10-0-2-134.ap-northeast-2.compute.internal \
--port 8282 \
--with-threads --reload --debugger \
>superset_output.log 2>&1 </dev/null &

단계 4 : Trino에서 데이터 소스 설정

EMR Master node에 Session Manager로 접속하여, Trino에서 접근할 데이터 소스를 카탈로그로 등록합니다.

1.Amazon Redshift 데이터 소스 설정

예제로 사용할 Redshift는 링크를 참조하여 Redshift Serverless를 생성하고, 예제 데이터 집합을 로드합니다.

EMR의 모든 노드에서 Redshift Catalog를 추가합니다.

sudo su - hadoop
sudo vi /etc/trino/conf/catalog/redshift.properties

connector.name=redshift
connection-url=jdbc:redshift://ad-hoc.xxxxxx.ap-northeast-2.redshift-serverless.amazonaws.com:5439/sample_data_dev
connection-user=admin
connection-password=Awsuser1

connection-url에는 여러분이 생성한 Redshift JDBC URL을 입력합니다.

참고로, EMR Cluster를 생성할 때, 자동으로 Catalog를 설정하기 위해서는 아래와 같이 EMR Classification에 추가할 수 있습니다.

{
"Classification": "trino-connector-redshift",
"Properties": {
"connector.name": "redshift",
"connection-url": "jdbc:redshift://ad-hoc.xxxxxx.ap-northeast-2.redshift-serverless.amazonaws.com:5439/sample_data_dev",
"connection-user": "admin",
"connection-password": "Awsuser1"
}
}

2.Amazon RDS 데이터 소스 설정

예제로 사용할 RDS는 이전 단계에서 생성된 Ranger DB를 이용합니다.

sudo su - hadoop
sudo vi /etc/trino/conf/catalog/mysql.properties

connector.name=mysql
connection-url=jdbc:mysql://rangerdb.xxxxxx.ap-northeast-2.rds.amazonaws.com:3306
connection-user=root
connection-password=Awsuser1

3.Google BigQuery 데이터 소스 설정

예제 Google BigQuery 프로젝트를 생성하는 방법은 링크를 참조할 수 있습니다.

sudo su - hadoop
sudo vi /etc/trino/conf/catalog/bigquery.properties

connector.name=bigquery
bigquery.project-id=t-collective-352700
bigquery.credentials-file=/etc/trino/conf/catalog/t-collective-352700-93ecb94411e2.json

bigquery.project-id=에는 여러분의 Google BigQuery Project ID를 입력합니다.

BigQuery 프로젝트의 서비스 계정 Credential 파일을 저장합니다. 파일의 위치는 bigquery.properties 파일의 bigquery.credentials-file=에 지정된 것과 동일해야 합니다.

sudo su - hadoop
sudo vi /etc/trino/conf/catalog/t-collective-352700-93ecb94411e2.json

아래는 Credential 파일 예시입니다.

{
"type": "service_account",
"project_id": "t-collective-352700",
"private_key_id": "93ecb94411e20c3b2d23e5dff542ca45d7d2054a",
"private_key": "-----BEGIN PRIVATE KEY-----\n.....\n-----END PRIVATE KEY-----\n",
"client_email": "74157117179-compute@developer.gserviceaccount.com",
"client_id": "101214505810023750195",
"auth_uri": "https://accounts.google.com/o/oauth2/auth",
"token_uri": "https://oauth2.googleapis.com/token",
"auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs",
"client_x509_cert_url": "https://www.googleapis.com/robot/v1/metadata/x509/74157117179-compute%40developer.gserviceaccount.com"
}

4.Trino 서버를 재시작 하기

EMR의 모든 노드에서 Catalog를 설정하고, 모든 EMR Node에서 Trino 서버를 재시작합니다.

sudo systemctl restart trino-server

단계 5 : Apache Ranger에서 권한 설정 및 Apache Superset에서 데이터 조회

1.Apache Ranger Admin에서 권한 설정하기

Superset UI에서 Trino SQL을 실행하기 위해, Apache Ranger Admin에 접속하여 superset User에게 권한을 부여합니다. Ranger Admin 접속 URL은 Application Load Balancer CloudFormation Stack의 출력값을 참조합니다.

Apache Ranger Admin -> Access Manager -> TRINO(amazonemrtrino 선택)에서 “awsadmin”과 “superset” User를 아래와 같이 추가합니다. “superset” User는 Trino에서 데이터 소스에 연결할 때 사용할 임의의 사용자입니다.

analyst1과 analyst2 사용자가 모든 함수를 실행할 수 있도록 “all – function” 정책에 아래와 같이 추가합니다.

2.Apache Superset에서 데이터베이스 연결 설정

Apache Superset의 Admin User로 접속하여, 데이터베이스 연결을 생성합니다.

Superset 인증 유형으로 LDAP을 지정했기 때문에, Admin User는 LDAP에 존재해야 합니다. 이전 CloudFormation Stack에서 생성된 awsadmin User를 Superset Admin User로 사용합니다.(기본 패스워드는 Awsuser1입니다.) Apache Superset Web URL은 세번째 CloudFormation 출력값에서 확인할 수 있습니다.

1)상단  메뉴 Data -> Databases -> + DATABASE로 접근하여 데이터베이스 연결을 생성합니다.

2)”Choose a database…”에서 Trino를 선택합니다.

3)Redshift Catalog에 접근하기 위한 데이터베이스 연결을 생성합니다.

BASIC 탭에서 아래와 같이 접속 정보를 입력합니다.

trino://superset@<EMR Master Instance’s Private DNS>.ap-northeast-2.compute.internal:8889/redshift

redshift는 Trino Catalog에 설정한 Catalog 이름과 동일하게 설정합니다.

“TEST CONNECTION”에서 오류가 발생한다면, Ranger Admin Server에서 “superset” User에 대한 권한이 충분한지 확인합니다.

ADVANCED 탭의 “Security”  부분에서 “Impersonate logged..”를 체크합니다.

이 옵션을 활성화하면, 데이터베이스 연결설정에서 지정한 사용자가 아닌 Superset에 접속한 사용자(analyst1, analyst2)로 Trino SQL을 실행하게 됩니다.

4)MySQL Catalog에 접근하기 위한 새로운 데이터베이스 연결을 생성합니다.

BASIC 탭에서 아래와 같이 접속 정보를 입력합니다.

trino://superset@<EMR Master Instance IP>.compute.internal:8889/mysql

mysql은 Trino Catalog에 설정한 Catalog 이름과 동일하게 설정합니다.

ADVANCED 탭의 “Security”  부분에서 “Impersonate logged..”를 체크합니다.

5)BigQeury Catalog에 접근하기 위한 새로운 데이터베이스 연결을 생성합니다.

BASIC 탭에서 아래와 같이 접속 정보를 입력합니다.

trino://superset@<EMR Master Instance IP>.compute.internal:8889/bigquery

bigquery은 Trino Catalog에 설정한 Catalog 이름과 동일하게 설정합니다.

ADVANCED 탭의 “Security”  부분에서 “Impersonate logged..”를 체크합니다.

아래와 같이 3개의 데이터베이스 연결이 생성되었습니다.

3.Apache Ranger Admin에서 접근제어 설정

Apache Ranger Admin에서 Superset UI에 로그인하는 사용자별로 데이터 접근제어를 설정합니다.

1)analyst1 사용자의 접근권한을 설정합니다.

Apache Ranger Admin에서 Access Manager -> Resource Based Policies -> TRINO(amazonemrtrino 선택) -> “Add New Policy”에서 새로운 정책을 생성합니다.

analyst1 사용자에게는 redshift catalog에만 접근할 수 있는 모든 권한을 부여하였습니다. 테스트 목적으로 Permissions에는 “Select/Deselect All”을 체크합니다. 운영환경에서는 사용자별로 적합한 권한을 부여해야 합니다.

Superset UI에 analyst1 사용자로 접속하여 데이터를 조회해 봅니다.(analyst1의 기본 패스워드는 Awsuser1입니다.)

SELECT caldate, sum(qtysold) as sumsold
FROM tickit.sales, tickit.date
WHERE sales.dateid = date.dateid 
GROUP BY caldate
ORDER BY sumsold DESC;

아래와 같이 Trino UI에 접속해 보면, 실행된 내역을 확인할 수 있습니다. Trino UI 접속 URL은 ALB CloudFormation Stack의 출력값을 참조합니다.

2)analyst2 사용자의 접근권한을 설정합니다.

Apache Ranger Admin에서 Access Manager -> Resource Based Policies -> TRINO(amazonemrtrino 선택) -> “Add New Policy”에서 새로운 정책을 생성합니다.

analyst2 사용자에게는 mysql catalog에만 접근할 수 있는 권한을 부여하였습니다.

Superset UI에 analyst2 사용자로 접속하여 데이터를 조회해 봅니다.(analyst2의 기본 패스워드는 Awsuser1입니다.)

select create_time, user_name, descr from mysql.rangerdb.x_user

3)Analyst1과 Analyst2 사용자의 권한을 추가로 설정합니다.

Apache Ranger Admin에서 Access Manager -> Resource Based Policies -> TRINO(amazonemrtrino 선택) -> “Add New Policy”에서 새로운 정책을 생성합니다.

아래와 같이 3개의 Catalog에 대한 권한이 설정되었습니다.

4)Analyst1 User에서 서로 다른 데이터 소스 조인하기

이제 접근 권한이 있는 여러 데이터 소스를 조인하여 Apache Superset을 SQL UI로 이용하고, Trino를 쿼리 엔진으로 활용하여 Data Virtualization을 구현할 수 있습니다.

데이터 소스에 대한 명시는 <catalog name>.<schema name>.<table name>으로 기술합니다.

아래 SQL 스크립트는 예시입니다. 여러분의 데이터 소스에 맞게 수정할 필요가 있습니다.

select cust_id, sum(pricepaid) amt_paid
from redshift.tickit.sales sales,
    bigquery.sales.customer_site
where sales.buyerid = customer_site.cust_id
group by cust_id

이번 게시글에서는 Superset의 기본 설정만 적용하였습니다. 이외에 Superset Caching, Async Query 등 추가적인 설정은 Superset 페이지를 참고합니다.

문제해결

1.처음 Hue UI에 접속 할 때, 아래와 같은 에러가 발생할 수 있습니다.

Ranger Admin의 Trino Policy에 아래와 같이 “hue” User에 “Impersonate” 권한을 부여합니다.

2.Hue UI를 사용하는 중에, 아래와 같이 “ICMP Port Unreachable…” 에러가 발생할 수 있습니다.

이 경우는 EMR Master Node에 SSSD 또는 Kerberos 프로세스가 중지된 경우일 수 있습니다. 아래와 같이 관련 프로세스를 재시작합니다.

# 시스템 보안 서비스 데몬 재시작
sudo service sssd restart

# Kerberos 서비스 재시작
sudo service krb5kdc start 
sudo service kadmin start

리소스 정리하기

이번 게시글에서 사용했던 리소스는 향후 불필요한 과금을 방지하기 위해 모두 삭제합니다.

  • EMR-Ranger-Step1 Stack : Windows AD, Bastion Host, VPC
  • EMR-Ranger-Step2 Stack : RDS, Ranger Server, EMR Cluster
  • EMR-Web-UI Stack : Application Load Balancer
  • AWS Secrets Manger : emr/ranger* secrets
  • Amazon S3 : 스크립트 저장을 위해 생성한 S3 Bucket
  • 데이터 소스 : Redshift, Google BigQuery 등 추가로 생성한 모든 리소스

결론

이번 게시글에서는 데이터 소스별로 서로 다른 Query 엔진을 사용할 필요없이, Apache Superset를 단일 SQL UI로, Trino를 단일 Query 엔진으로 구성하여 여러 데이터 소스로부터 쉽게 데이터를 조회하고, Apache Ranger를 통해 통합적으로 권한을 관리하는 방법에 대해 알아보았습니다. 이를 통해, 데이터 플랫폼팀은 여러 Query 도구를 도입하는데 따른 비용과 노력을 줄일 수 있고, 비즈니스 사용자는 하나의 Query 도구로 데이터 위치에 관계없이 비즈니스 인사이트를 확인하고, 빠르게 의사결정할 수 있습니다.

SQL UI 도구로 Hue를 이용하는 방법과 Apache Ranger를 통해 데이터 마스킹하는 방법 등은 아래 게시글을 참고 할 수 있습니다.

Incheol Roh

Incheol Roh

Incheol Roh is a Solutions Architect based in Seoul. With database and data analytics experience in various industries, he has been working with his customers to build efficient architectures to help them achieve data-driven business outcomes. 노인철 솔루션즈 아키텍트는 다양한 산업 군에서 데이터베이스와 데이터 분석 경험을 바탕으로 고객이 데이터 기반의 비즈니스 성과를 달성할 수 있도록 고객과 함께 효율적인 아키텍처를 구성하는 역할을 수행하고 있습니다.