BLOG
이것은 Realtor.com의 데이터 엔지니어인 Ajay Rathod가 게시한 고객 게시물입니다.
Realtor.com은 그들 자신의 말로 하자면, Move 회사에서 운영하는 Realtor.com®은 가정 구매자, 판매자 및 꿈을 꾸는 사람들을 위한 신뢰할 수 있는 자료입니다. 경쟁 국가 사이트들 가운데 가장 포괄적인 매도 가능 부동산의 데이터베이스를 제공하고 있으며, 사람들이 집으로 가는 모든 단계를 통해 자신감 있게 움직일 수 있도록 돕기 위한 정보, 도구 및 전문적인 전문 지식을 제공합니다.
Move 회사에서는 수백 개의 테라바이트의 데이터를 요일과 시간으로 분할하여 처리합니다. 여러 팀이 이 데이터에 대해 수백 개의 쿼리를 실행합니다. Move 회사는 AWS 서비스를 사용하여 데이터를 수집하고 분석하기 위한 인프라를 구축했습니다.
- 그 자료는 여러 출처에서 얻은 것입니다.
- 데이터는 Amazon S3 데이터 레이크에 Amazon Kinesis 및 AWS 데이터 파이프라인과 함께 로드됩니다.
- 스토리지의 효과를 높이고 이후 쿼리를 수행하기 위해 데이터가 Parquet 형식으로 변환되고 S3에 다시 저장됩니다.
- Amazon Athena는 S3의 데이터를 쿼리하기 위한 SQL(구조화된 쿼리 언어)엔진으로 사용됩니다. Athena는 사용하기 쉽고 종종 다양한 팀들에 의해 빠르게 채택됩니다.
- 팀은 Amazon QuickSight에 있는 쿼리 결과를 시각화합니다. Amazon QuickSight는 사용자 계정에서 다른 사용자와 신속하고 손쉽게 데이터를 시각화하고 협업할 수 있는 비즈니스 분석 서비스입니다.
- 데이터 액세스는 AWS Identity and Access Management(IAM)역할에 의해 제어됩니다.
이 아키텍처는 데이터 플랫폼으로 알려져 있으며 조직 내에서 데이터 과학, 데이터 엔지니어링 및 데이터 운영 팀과 공유됩니다. Move 회사는 또한 다른 여러 부서를 아우르는 팀들이 Athena를 사용할 수 있도록 합니다. 많은 사용자들이 Athena를 사용할 때, Athena의 사용을 모니터링하는 것이 비용 효과를 보장하는데 도움이 됩니다. 이는 다음에 대한 세부 정보를 제공할 수 있는 Athena 메트릭의 강력한 필요성으로 이어집니다.
- 사용자
- 스캔한 데이터 양 (AWS 서비스 사용 비용 모니터링)
- 쿼리에 사용되는 데이터베이스
- 팀에서 실행하는 실제 쿼리
현재 Move 회사 팀은 단일 툴에서 이러한 모든 메트릭을 손쉽게 얻을 수 있는 방법이 없습니다. 이렇게 하는 방법을 사용하면 모니터링 작업을 크게 간소화할 수 있습니다. 예를 들어, 데이터 운영 팀은 Athena에서 실행되는 데이터에 대한 쿼리를 통해 매일 얻은 여러 메트릭을 수집하고자 합니다. 이러한 구성 요소에는 다음 메트릭이 필요합니다.
- 각 사용자가 스캔한 데이터 양
- 각 사용자별 조회 수
- 각 사용자가 액세스하는 데이터베이스
이 포스트에서, Athena의 사용을 모니터링 하기 위한 해결책을 만드는 방법에 대해 논할 것입니다. 이 솔루션을 구축하려면 AWS CloudTrail에 의존해야 합니다. CloudTrail은 AWS 계정에 대한 AWS API 호출을 기록하고 S3 버켓에 로그 파일을 제공하는 웹 서비스입니다.
해결책
다음은 대략적인 개요입니다.
- CloudTrail API를 사용하여 사용자 쿼리를 감사한 다음, Athena를 사용하여 CloudTrail 로그로 테이블을 만듭니다.
- AWS CLI를 사용하여 Athena API를 쿼리하여 사용자 쿼리에서 스캔한 데이터에 대한 메트릭을 수집하고 이 정보를 Athena의 다른 테이블에 저장합니다.
- 이 두 개의 표를 결합하여 이 두 출처에서 나온 정보를 결합합니다.
- 결과 데이터를 사용하여 분석하고, 통찰력을 구축하고, 조직 내 다른 팀에서 사용자의 Athena 사용을 보여 주는 대시보드를 만들 수 있습니다.
이 솔루션의 아키텍처는 다음 다이어그램에 나와 있습니다.
이 솔루션을 단계적으로 살펴보십시오.
IAM 및 권한 설정
이 솔루션은 CloudTrail, Athena 및 S3를 사용합니다. 다음 스크립트와 단계를 실행하는 사용자에게 적절한 IAM 역할 및 정책이 있는지 확인하십시오. 자세한 내용은 IAM역할을 사용한 AWS계정의 접근 권한을 위임하는 내용의 자습서를 참조하십시오.
1단계: CloudTrail 안에 데이터로 사용할 테이블을 Athena에서 생성하기
CloudTrail API는 조직 내의 여러 팀에서 실행하는 모든 Athena 쿼리를 기록합니다. 이 로그들은 S3에 저장됩니다. 가장 관심 있는 필드는 다음과 같습니다.
- 사용자 ID
- API 호출의 시작 시간
- 소스 IP주소
- 요청 매개 변수
- 서비스에서 반환하는 응답 요소
최종 사용자가 Athena에서 쿼리를 하면, 이러한 쿼리는 Athena 웹 서비스 호출의 응답으로 CloudTrail에 의해 기록됩니다. 이러한 응답에서 각 조회는 JSON(자바 스크립트 객체 표기법) 문자열로 나타납니다.
다음 CREATE TABLE문장을 사용하여 Athena에 cloudtrail_logs 테이블을 생성할 수 있습니다. 자세한 내용은 Athena 설명서의 Querying CloudTrail 로그를 참조하십시오.
CREATE EXTERNAL TABLE cloudtrail_logs (
eventversion STRING,
userIdentity STRUCT< type:STRING,
principalid:STRING,
arn:STRING,
accountid:STRING,
invokedby:STRING,
accesskeyid:STRING,
userName:String,
sessioncontext:STRUCT< attributes:STRUCT< mfaauthenticated:STRING,
creationdate:STRING>,
sessionIssuer:STRUCT< type:STRING,
principalId:STRING,
arn:STRING,
accountId:STRING,
userName:STRING>>>,
eventTime STRING,
eventSource STRING,
eventName STRING,
awsRegion STRING,
sourceIpAddress STRING,
userAgent STRING,
errorCode STRING,
errorMessage STRING,
requestId STRING,
eventId STRING,
resources ARRAY<STRUCT< ARN:STRING,
accountId:STRING,
type:STRING>>,
eventType STRING,
apiVersion STRING,
readOnly BOOLEAN,
recipientAccountId STRING,
sharedEventID STRING,
vpcEndpointId STRING,
requestParameters STRING,
responseElements STRING,
additionalEventData STRING,
serviceEventDetails STRING
)
ROW FORMAT SERDE ‘com.amazon.emr.hive.serde.CloudTrailSerde’
STORED AS INPUTFORMAT ‘com.amazon.emr.cloudtrail.CloudTrailInputFormat’
OUTPUTFORMAT ‘org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat’
LOCATION ‘s3://<s3 location of the CloudTrail logs>’;
2단계: API 출력 데이터를 위한 테이블을 Amazon Athena에서 생성하기
Athena는 특정 쿼리 ID의 정보를 얻기 위해 질문할 수 있는 API를 제공합니다. 또한 최대 50개의 쿼리 ID가 포함된 쿼리 ID 일괄 정보를 얻을 수 있는 API도 제공합니다.
이 API 호출을 사용하여 관심 있는 Athena 쿼리에 대한 정보를 얻고 이 정보를 S3 위치에 저장할 수 있습니다. S3에서 이 데이터를 나타낼 Athena 테이블을 만듭니다. 이 게시물에서 관심 있는 응답 필드는 다음과 같습니다.
- 실행 ID쿼리
- 데이터베이스
- 엔진 작동 시간(밀리초)
- 데이터 검색(바이트)
- 상황
- 제출 날짜/시간
- 완료 날짜 시간
athena_api_output의 CREATE TABLE문장은 다음과 같습니다.
CREATE EXTERNAL TABLE IF NOT EXISTS athena_api_output(
queryid string,
querydatabase string,
executiontime bigint,
datascanned bigint,
status string,
submissiondatetime string,
completiondatetime string
)
ROW FORMAT SERDE ‘org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe’
WITH SERDEPROPERTIES (
‘serialization.format’ = ‘,’,
‘field.delim’ = ‘,’
) LOCATION ‘s3://<s3 location of the output from the API calls>’
TBLPROPERTIES (‘has_encrypted_data’=’false’)
쿼리 ID 및 사용자 정보를 마지막 날에 검사할 수 있습니다. 조회는 다음과 같습니다.
with data AS (
SELECT
json_extract(responseelements,
‘$.queryExecutionId’) AS query_id,
(useridentity.arn) AS uid,
(useridentity.sessioncontext.sessionIssuer.userName) AS role,
from_iso8601_timestamp(eventtime) AS dt
FROM cloudtrail_logs
WHERE eventsource=’athena.amazonaws.com’
AND eventname=’StartQueryExecution’
AND json_extract(responseelements, ‘$.queryExecutionId’) is NOT null)
SELECT *
FROM data
WHERE dt > date_add(‘day’,-1,now() )
3단계: Athena API로부터 쿼리 통계 가져오기
간단한 Python 스크립트를 작성하여 50개의 일괄적인 쿼리를 반복 실행하고 쿼리 통계를 위해 Athena API를 쿼리 할 수 있습니다. 이러한 찾아보기 위해서는 Boto 라이브러리를 이용할 수 있습니다. Boto는 AWS 개발 환경과 쉽게 소통하고 자동화할 수 있는 방법을 제공하는 라이브러리입니다. Boto API의 응답은 2단계에서 설명한 대로 구문 분석을 통해 필요한 필드를 추출할 수 있습니다.
Python 스크립트를 Athenametrics GitHub repo에서 사용할 수 있는 예시입니다.
각 쿼리 ID에 대해 이러한 필드를 CSV 문자열로 포맷하고 S3 버킷에 전체 배치 응답을 위해 저장합니다. 이 S3 버킷은 2단계에서 cloudtrail_logs에 생성된 표로 표시됩니다.
Python 코드에서 sql_query라는 변수를 만들고 2단계에서 정의한 SQL 쿼리를 나타내는 문자열을 할당합니다. s3_query_folder는 Athena가 쿼리 결과를 저장하기 위해 사용하는 S3의 위치입니다. 코드는 다음과 같습니다.
sql_query =
“””
with data AS (
SELECT
json_extract(responseelements,
‘$.queryExecutionId’) AS query_id,
(useridentity.arn) AS uid,
(useridentity.sessioncontext.sessionIssuer.userName) AS role,
from_iso8601_timestamp(eventtime) AS dt
FROM cloudtrail_logs
WHERE eventsource=’athena.amazonaws.com’
AND eventname=’StartQueryExecution’
AND json_extract(responseelements, ‘$.queryExecutionId’) is NOT null)
SELECT *
FROM data
WHERE dt > date_add(‘day’,-1,now() )
“””
athena_client = boto3.client(‘athena’)
query_execution = self.client.start_query_execution(
QueryString=sql_query,
ClientRequestToken=str(uuid.uuid4()),
ResultConfiguration={
‘OutputLocation’: s3_staging_folder,
}
)
query_execution_id = query_execution[‘QueryExecutionId’]
### Allow query to complete, check for status response[“QueryExecution”][“Status”][“State”]
response = athena_client.get_query_execution(QueryExecutionId=query_execution_id)
if response[“QueryExecution”][“Status”][“State”] == “SUCCEEDED”:
results = athena_client.get_query_results(QueryEecutionId=query_exection_id)
응답 개체의 결과를 반복하고 50개의 결과 묶음으로 통합할 수 있습니다. 각 배치에 대해 Athena API, batch-get-query-execution을 호출할 수 있습니다.
2단계에서 athena_api_out테이블을 위한 CREATE TABLE 정의가 가리킨 S3 위치에 출력을 저장합니다. 위의 SQL문장은 최근 24시간 동안 실행된 쿼리만 반환합니다. 더 오랜 기간에 걸쳐 사용률을 높이는 것을 원할 수도 있습니다. 이 API 호출의 코드 조각은 다음과 같습니다.
response = athena_client.batch_get_query_execution(
QueryExecutionIds=batchqueryids
)
배치 쿼리 id 값은 SELECT 쿼리 시 조회 ID를 추출한 50개의 쿼리 ID배열입니다. 이 스크립트는 두 번째 테이블에 필요한 데이터인 athena_api_out을 생성하며 이제 Athena에서 두 테이블을 모두 사용할 준비가 되었습니다.
4단계: CloudTrail 및 Athena API 데이터에 참여하기
이제 필요한 데이터에 대해 두 테이블을 사용할 수 있으므로 다음 Athena 쿼리를 실행하여 사용자가 사용하는 정보를 볼 수 있습니다. 이 쿼리의 출력을 최근 5일로 제한할 수 있습니다.
SELECT
c.useridentity.arn,
json_extract(c.responseelements, ‘$.queryExecutionId’) qid,
a.datascanned,
a.querydatabase,
a.executiontime,
a.submissiondatetime,
a.completiondatetime,
a.status
FROM cloudtrail_logs c
JOIN athena_api_output a
ON cast(json_extract(c.responseelements, ‘$.queryExecutionId’) as varchar) = a.queryid
WHERE eventsource = ‘athena.amazonaws.com’
AND eventname = ‘StartQueryExecution’
AND from_iso8601_timestamp(eventtime) > date_add(‘day’,-5 ,now() )
5단계: 결과 분석 및 시각화
이 단계에서는 QuickSight를 사용하여 다음 메트릭을 표시하는 대시보드를 생성할 수 있습니다.
- 사용자 및 데이터베이스가 스캔한 평균 데이터 양(MB)
- 사용자당 조회 수
- 데이터베이스별 쿼리 수
자세한 내용은 대시보드 작업을 참조하십시오.
결론
이 포스트에 기술된 해결책을 사용하면, 여러분은 다양한 팀들에 의한 Athena의 사용을 지속적으로 감시할 수 있습니다. 이 단계를 더 진행하면 팀의 Athena 사용자가 특정 기간 내에 쿼리 할 수 있는 데이터 양에 대한 사용자 제한을 자동화하고 설정할 수 있습니다. 또한 특정 사용자의 사용량이 지정된 힌계점을 초과할 경우 알림을 추가하도록 선택할 수도 있습니다. 이를 통해 조직 내 여러 팀에서 발생하는 비용을 관리할 수 있습니다.
Realtor.com은 이 게시물을 작성하는 데 도움을 준 AWS 서비스 내 빅 데이터 및 분석 분야의 수석 컨설턴트인 Hemant Borole에게 엄청난 지원과 지침을 받은 것을 인정합니다.
원문 URL: https://aws.amazon.com/ko/blogs/big-data/analyzing-amazon-athena-usage-by-teams-within-a-real-estate-company/
** 메가존 TechBlog는 AWS BLOG 영문 게재글중에서 한국 사용자들에게 유용한 정보 및 콘텐츠를 우선적으로 번역하여 내부 엔지니어 검수를 받아서, 정기적으로 게재하고 있습니다. 추가로 번역및 게재를 희망하는 글에 대해서 관리자에게 메일 또는 SNS페이지에 댓글을 남겨주시면, 우선적으로 번역해서 전달해드리도록 하겠습니다.