본문 바로가기

소프트웨어-이야기/인프라

[RUBY]루비로 AWS Athena 사용하기

Gem

aws-sdk gem 안에 athena 서비스를 사용할 수 있는 함수도 포함되어 있다.


함수 사용하는 방법 

처음에 aws-sdk를 사용할 때는, 아테나에 쿼리를 보내면 바로 결과값을 리턴해주는 기능이 있을거라고 기대했다.

마치 jdbc를 사용하듯이 사용할 수 있을줄 알았다. 그런데 약간 개념이 달랐다.

참고링크 : ATHENA RUBY SDK 사용법


이렇게 클라이언트를 만들고

client = Aws::Athena::Client.new(region: 'us-east-1')
이렇게 쿼리를 날리면, 이 때 날린 쿼리의 아이디가 담긴 객체가 리턴된다
resp = client.start_query_execution({
  query_string: "SELECT * FROM impressions WHERE year='2017'", # required
  query_execution_context: {
    database: "sampledb",
  },
  result_configuration: { # required
    output_location: "s3n://aws-athena-query-result-region/" # 쿼리 결과가 csv으로 저장되는 S3 경로 
  },
})

아래의 함수를 호출하면, 쿼리의 결과를 가져올 수 있다.

resp = client.get_query_results({
  query_execution_id: resp.query_execution_id
})


AWS Athena를 서비스에 적용할 때, 주의사항

동시에 날릴 수 있는 쿼리의 갯수에 제한이 있다. 

SELECT 쿼리문은 동시에 5개까지만 날릴 수 있다. ( 참고 링크 : Athena Service Limit )

갯수 제한은 늘릴 수 있기 때문에, AWS에 따로 요청해야한다. 


한번에 가져올 수 있는 데이터 로우 갯수에 제한이 있다.

get_query_result 함수를 사용하면, 최대 1000개의 로우만 읽어올 수 있다.

결과 값의 크기가 1000개보다 많은 경우, 

get_query_results 함수를 여러번 호출해서 전체 데이터를 읽어들여야한다. 


쿼리 실행이 완전히 끝나기 전에, 결과값을 가져오는 함수를 호출하면 에러가 난다

때문에 데이터를 조회하기 전에, 쿼리 실행이 정상적으로 완료되었는지 확인해줘야한다.

resp = client.get_query_execution({
  query_execution_id: resp.query_execution_id, # required
})
p resp.query_execution.status.state #=> String, one of "QUEUED", "RUNNING", "SUCCEEDED", "FAILED", "CANCELLED"

쿼리의 상태를 조회했을 때, SUCCEEDED가 나와야 데이터의 결과값을 가져올 수 있다. 


AWS Athena Ruby SDK 사용 후기

AWS Ruby sdk의 아테나 기능은 아쉬운 점이 꽤 많다.


쿼리 결과를 가져오기 위한 과정이 너무 복잡하다. 

아테나 클라이언트를 생성하고, 쿼리문을 날리고, 쿼리 실행 결과를 확인해서, 1000건씩 데이터를 쪼개서 가져와야 한다. 

게다가 이 데이터의 구조도 바로 사용하기에는 불편하게 되어있다. 


< 끝 >