BETA

AWS Data Wrangler 使ってAthenaのクエリを外部から実行する

投稿日:2020-09-21
最終更新:2020-09-23

背景・やりたいこと

athenaで分析したデータをDataFrameにしていい感じに分析したいなぁ思ったらAWS Data Wranglerなる良さげなものがあるので使ってみる。
構成図...と言うにはあんまりだけど、やりたいことの全体像はこんな感じ。

  • ① S3に保存したデータをAthenaで抽出し、データベースを作成する
  • ② Athenaで抽出したデータをsageMakerのnotebook (jupyter)を利用して再分析する(クエリの実行)

ログとかいろんなデータがワッシャ〜ってなってるところからAthenaでふるいにかけ必要な情報だけを抽出し、抽出したデータを元に機械学習したり色々やりたいイメージ。②はなんでも良かったんだけどsageMakerが手っ取り早そうだったのでひとまずそれを採用。できればlambdaから実行する方法も調べる(結果できたので下の方に記載)。

Athenaを使ったデータの抽出について

こちらがとても丁寧に纏めてくださっていて助かった。今回はデータをそのまま登録してathenaでCreate
Tableしてみた(参考)。

AWS Data Wrangler使ってみる

公式を見てみたものの、なんのこっちゃよくわからんw
ので一旦公式のいう通りに構築してみる。

SageMaker Notebookの起動

AWSコンソールのサービス一覧にSageMakerを入力する。
ダッシュボード → ノートブックインスタンス → インスタンスの作成 を選択する。

作成画面が出てくるので基本的にデフォルトを選択する。
アクセス許可の部分は作成したs3の bucket名を入力すると自動的にロールを作成してくれる。

Nodebookを起動するとJupyterNodebookが起動される。
右上のNewからconda_python3を選択し、新しくファイルを作成する。

awswranglerを利用してAthenaからクエリを実行する

公式をそのままコピペしたらAttributeError: module 'awswrangler' has no attribute 'Session'とな。

import pandas  
import awswrangler  

session = awswrangler.Session()  
df = session.pandas.read_sql_athena(  
    sql="select * from test",  
    database="sandbox"  
)  

print(df)  

# AttributeError: module 'awswrangler' has no attribute 'Session'  

Wranglerのv1.0に大きな変更点があったようで、そのまま使いたければインストールする時に1.0未満のモジュールを明示的に選択してインストールすべしとのこと(wranglerのissue)。

v1.0用の公式リファレンスがあったが、内容をみてみるとGlueやら新しい単語多くて訳わからん...

また、今回はAthenaまでは用意している前提での作業を想定しているので、Athenaで作成したデータベースにつないでゴニョゴニョできる様にしたい...
ので、バージョンを1.0未満のものに指定してやってみることにした。

# awswranglerのインストール  
!pip install awswrangler==0.3.2  

# Requirement already satisfied: s3transfer<0.4.0,>=0.3.0 in /home/ec2-user/anaconda3/envs/python3/lib/python3.6/site-packages (from boto3>=1.10.34->awswrangler==0.3.2) (0.3.3)  

# versionの確認  
import awswrangler as wr  
wr.__version__  

# '0.3.2'  

# クエリの実行  
import pandas  
import awswrangler  

session = awswrangler.Session()  
df = session.pandas.read_sql_athena(  
    sql="select * from test",  
    database="sandbox"  
)  
print(df)  

#    id name  price  
# 0   4  無花果    800  
# 1   5  晩白柚   1600  
# 2   1   林檎    100  
# 3   2   洋梨    200  
# 4   3   柘榴    300  

できた。最初、ClientError: An error occurred (AccessDeniedException) when calling the StartQueryExecution operation:なるエラーが出てきたので、ノートブック作成時に作成したロールにAmazonS3FullAccessAmazonAthenaFullAccessを付与した。
使っているRoleの設定画面へはノートブック詳細画面から遷移できる。

次はv1.0を使って同じようなことをやってみる

v1.0以上の場合

GitHubに使い方が書いてあったので真似してみる。

import pandas  
import awswrangler as wr  


df = wr.athena.read_sql_query("SELECT * FROM test", database="sandbox")  

print(df)  

#    id name  price  
# 0   4  無花果    800  
# 1   5  晩白柚   1600  
# 2   1   林檎    100  
# 3   2   洋梨    200  
# 4   3   柘榴    300  

できた。
驚くほど簡単...

lambda経由でAthenaのクエリを実行したい

lambdaからも実行することが可能。
...だが、awswranglerモジュールを利用するためにローカル環境でawswranglerモジュールを含んだファイルをzip形式に圧縮し、新しいレイヤーとして作成する必要がある。

この作業が少し曲者で、普通にローカルでpip install -t ./modules awswranglerとかしてmodulesをzipに圧縮してレイヤーに追加しようとしてもエラーが出て失敗する。
Unzipped size must be smaller than 262144000 bytes

Layerとして追加できるzipファイルには250MB以下でなければならないという制約があるらしい(公式)。

八方塞がりじゃ〜と思ってたらGithubのReleaseページにP.S. Lambda Layer zip file and Glue wheel/egg files are available below. Just upload it and run!とな。

ありがたや...ということでこれをそのままレイヤーに登録するとlambdaでも同じ様に使うことができる。
ちなみにこれをレイヤーに足すだけでpandasもnumpyも使える...
すごい...

やってみて思ったこと・今後

思った以上に簡単にできた。sageMakerはjupyterをローカルで立てても良さそうだが、アクセス権限とか環境構築とか面倒なのでクラウド上でできるのはかなり便利に感じた。

クエリの発行に関してはAthenaでも普通にできるのでそのままではあまり利便がなさそうだが、機械学習の知見があると色々できてウハウハなんだろうな〜と思った。機械学習の知識も身に付けたい。

技術ブログをはじめよう Qrunch(クランチ)は、プログラマの技術アプトプットに特化したブログサービスです
駆け出しエンジニアからエキスパートまで全ての方々のアウトプットを歓迎しております!
or 外部アカウントで 登録 / ログイン する
クランチについてもっと詳しく

この記事が掲載されているブログ

@BAMBiの技術ブログ

よく一緒に読まれる記事

0件のコメント

ブログ開設 or ログイン してコメントを送ってみよう