fluentdとredshiftの素敵な関係
DESCRIPTION
TRANSCRIPT
FluentdとRedshiftの素敵な関係
第18回 AWS User Group - Japan 東京勉強会@just_do_neet
第18回 AWS User Group - Japan 東京勉強会
Redshiftは便利•他の登壇者の方々が熱く語られていると想いますので割愛......
•とはいえ不満点もある
•データをいかにS3/Redshiftまで運ぶか
•大量のデータを一括登録すると時間がかかる
•かといって細切れだと面倒
•自前でコントロールしようとすると手間
2
第18回 AWS User Group - Japan 東京勉強会
Fluentd
3
第18回 AWS User Group - Japan 東京勉強会
Fluentd
•OSSのlog collector
•導入のし易さ、性能、信頼性、拡張性++
•豊富なplugin
•fluent-plugin-s3
•fluent-plugin-redshift4
第18回 AWS User Group - Japan 東京勉強会
fluent-plugin-redshift
5
•https://github.com/hapyrus/fluent-plugin-redshift/
•Redshiftにデータを登録できるFluentd plugin
•CSV/TSV/JSONなどに対応
•Redshiftへのデータ反映のタイミングを調整可能(buffer_chunk_limit / flush_interval)
•chunk単位でS3にデータ保存→copyコマンドでRedshiftに反映
第18回 AWS User Group - Japan 東京勉強会
fluent-plugin-redshift
6
•https://github.com/hapyrus/fluent-plugin-redshift/
•Fluentdを介してRedshiftにデータを登録できるplugin
•CSV/TSV/JSONなどに対応
•Redshiftへのデータ反映のタイミングを調整可能(buffer_chunk_limit / flush_interval)
•chunk単位でS3にデータ保存→copyコマンドでRedshiftに反映
<match my.tag> type redshift
# s3 (for copying data to redshift) aws_key_id YOUR_AWS_KEY_ID aws_sec_key YOUR_AWS_SECRET_KEY s3_bucket YOUR_S3_BUCKET s3_endpoint YOUR_S3_BUCKET_END_POINT path YOUR_S3_PATH timestamp_key_format year=%Y/month=%m/day=%d/hour=%H/%Y%m%d-‐%H%M
# redshift redshift_host YOUR_AMAZON_REDSHIFT_CLUSTER_END_POINT redshift_port YOUR_AMAZON_REDSHIFT_CLUSTER_PORT redshift_dbname YOUR_AMAZON_REDSHIFT_CLUSTER_DATABASE_NAME redshift_user YOUR_AMAZON_REDSHIFT_CLUSTER_USER_NAME redshift_password YOUR_AMAZON_REDSHIFT_CLUSTER_PASSWORD redshift_schemaname YOUR_AMAZON_REDSHIFT_CLUSTER_TARGET_SCHEMA_NAME redshift_tablename YOUR_AMAZON_REDSHIFT_CLUSTER_TARGET_TABLE_NAME file_type [tsv|csv|json|msgpack]
# buffer buffer_type file buffer_path /var/log/fluent/redshift flush_interval 15m buffer_chunk_limit 1g</match>
redshift plugin設定例
第18回 AWS User Group - Japan 東京勉強会
例1:nginxのログ•nginxのアクセスログをFluentdを介してRedshiftに保存
• in_tail(ファイル読み込み) → out_redshift
7
第18回 AWS User Group - Japan 東京勉強会
例1:nginxのログ•nginxのアクセスログをFluentdを介してRedshiftに保存
• in_tail(ファイル読み込み) → out_redshift
8
log_format ltsv 'time:$time_local\t' 'host:$remote_addr\t' 'req:$request\t' 'status:$status\t' 'size:$body_bytes_sent\t' 'referer:$http_referer\t' 'ua:$http_user_agent\t';
time:02/Oct/2013:20:32:31 +0900 host:xxx.xxx.xxx.xxx req:GET /musicians/famous/ HTTP/1.1 status:200 size:2172 referer:http://www.sada.co.jp/index.html ua:Mozilla/5.0 (iPhone; CPU iPhone OS 7_0_2 like Mac OS X) AppleWebKit/537.51.1 (KHTML, like Gecko) Version/7.0 Mobile/11A501 Safari/9537.53
nginxのログフォーマット
第18回 AWS User Group - Japan 東京勉強会
例1:nginxのログ•nginxのアクセスログをFluentdを介してRedshiftに保存
• in_tail(ファイル読み込み) → out_redshift
9
# Redshift DDLcreate table access_log( time varchar(255), host varchar(255), req varchar(255), status integer, size integer, referer varchar(255), ua varchar(255) );
Redshift上のテーブル定義
第18回 AWS User Group - Japan 東京勉強会
例1:nginxのログ•nginxのアクセスログをFluentdを介してRedshiftに保存
• in_tail(ファイル読み込み) → out_redshift
10
# from access_log<source> type tail tag nginx.access format ltsv path /var/log/nginx/access.log pos_file /var/log/fluentd/nginx_access.log.pos</source>
# to Redshift <match nginx.access> type jsonbucket out_tag redshift.nginx.access json_key log</match><match redshift.nginx.access> type redshift # s3 (for copying data to redshift) (snip.) # redshift (snip.) redshift_tablename access_log file_type json # buffer (snip.)</match>
Fluentdの設定in_tail ~ out_redshift
第18回 AWS User Group - Japan 東京勉強会
例1:nginxのログ•nginxのアクセスログをFluentdを介してRedshiftに保存
• in_tail(ファイル読み込み) → out_redshift
11
#Fluentd log_file2013-‐10-‐04 20:33:16 +0900 [info]: completed copying to redshift. s3_uri=s3://xxxxxx/redshift/access_log/year=2013/month=10/day=04/hour=20/20131004-‐2033_01.gz
FluentdのlogRedshiftへの書き込み成功時に出力
第18回 AWS User Group - Japan 東京勉強会
例1:nginxのログ•nginxのアクセスログをFluentdを介してRedshiftに保存
• in_tail(ファイル読み込み) → out_redshift
12
redshift=# select * from access_log limit 1; time | host | req | status | size | referer | ua |-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐+-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐+-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐+-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐+-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐+-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐+-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐+ 04/Oct/2013:20:32:31 +0900 | xxx.xxx.xxx.xxx | GET /musicians/famous/ HTTP/1.1 | 200 | 2172 | http://www.sada.co.jp/index.html | Mozilla/5.0 (iPhone; CPU iPhone OS 7_0_2 like Mac OS X) AppleWebKit/537.51.1 (KHTML, like Gecko) Version/7.0 Mobile/11A501 Safari/9537.53
Redshiftのテーブルの中身
第18回 AWS User Group - Japan 東京勉強会
例2:地域情報の付与•元のデータはそのまま、Fluentd内でデータを加工してRedshiftに保存したい
•fluent-plugin-record-modifier
•fluent-plugin-time_parser
•fluent-plugin-reassemble
•fluent-plugin-geoip
13
第18回 AWS User Group - Japan 東京勉強会
例2:地域情報の付与•https://github.com/y-ken/fluent-plugin-geoip
•MaxMind社提供のgeoipデータベースを用いて、IPアドレスから地域情報(緯度・経度・都市名)を取得しデータに付与
•データベースは有償・無償ともに使用可
14
第18回 AWS User Group - Japan 東京勉強会
例2:地域情報の付与•https://github.com/y-ken/fluent-plugin-geoip
•MaxMind社提供のgeoipデータベースを用いて、IPアドレスから地域情報(緯度・経度・都市名)を取得しデータに付与
•データベースは有償・無償ともに使用可
15
# Redshift DDLcreate table access_log( time varchar(255), host varchar(255), req varchar(255), status integer, size integer, referer varchar(255), ua varchar(255), city varchar(100), latitude real, longitude real);
Redshift上のテーブル定義(地域情報を拡張)
第18回 AWS User Group - Japan 東京勉強会
例2:地域情報の付与•https://github.com/y-ken/fluent-plugin-geoip
•MaxMind社提供のgeoipデータベースを用いて、IPアドレスから地域情報(緯度・経度・都市名)を取得しデータに付与
•データベースは有償・無償ともに使用可
16
# add location info<match nginx.access> type geoip geoip_lookup_key host enable_key_city city enable_key_latitude latitude enable_key_longitude longitude add_tag_prefix geoip.</match>
Fluentdの設定out_geoip
第18回 AWS User Group - Japan 東京勉強会
例2:地域情報の付与•https://github.com/y-ken/fluent-plugin-geoip
•MaxMind社提供のgeoipデータベースを用いて、IPアドレスから地域情報(緯度・経度・都市名)を取得しデータに付与
•データベースは有償・無償ともに使用可
17
redshift=# select * from get_background_links limit 1; time | host | req | status | size | referer | ua | city | latitude | longitude |-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐+-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐+-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐+-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐+-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐+-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐+-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐+-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐+-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐+-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐+ 04/Oct/2013:20:32:31 +0900 | xxx.xxx.xxx.xxx | GET /musicians/famous/ HTTP/1.1 | 200 | 2172 | http://www.sada.co.jp/index.html | Mozilla/5.0 (iPhone; CPU iPhone OS 7_0_2 like Mac OS X) AppleWebKit/537.51.1 (KHTML, like Gecko) Version/7.0 Mobile/11A501 Safari/9537.53 | Osaki | 38.5887 | 140.973
Redshiftのテーブルの中身(地域情報を拡張)
第18回 AWS User Group - Japan 東京勉強会
例2:地域情報の付与•https://github.com/y-ken/fluent-plugin-geoip
•MaxMind社提供のgeoipデータベースを用いて、IPアドレスから地域情報(緯度・経度・都市名)を取得しデータに付与
•データベースは有償・無償ともに使用可
18
tableau で可視化
まとめ
第18回 AWS User Group - Japan 東京勉強会
•Fluentd x Redshiftについて。
•Fluentdを使うとデータの登録や加工が思いのままです。
•便利なので使いましょう。
•環境構築が面倒な方向けには「flydata」という便利なサービスがあるらしいですよ
まとめ
20
Thanks for your listening :)