2014年8月27日水曜日

Apache→Fluentd→Redshift でデータ投入する話

fluentd→(S3)→Redshiftの構成で、データの集積と一括管理をしたいとおもいました
fluentd側でアクセスログをJson化してS3に配置、そのままRedshiftへコピーという流れを、便利なモジュールが担ってくれる楽ちん構成

やること:
1,)fluentdのインストール
2,)fluentdの各種plugin追加
3,)fluentdのconf作成
4,)fluentdの起動
5,)Redshift側のテーブル作成
6,)データの確認

----------------------------------------------------------------------------

1,)fluentdのインストール
-- リポジトリ追加
# vi /etc/yum.repos.d/td.repo
======================================================================
[treasuredata]
name=TreasureData
baseurl=http://packages.treasure-data.com/redhat/$basearch
gpgcheck=0
======================================================================

-- インストール
# yum install td-agent
======================================================================
Dependencies Resolved
====================================================================================================
 Package                   Arch           Version                        Repository            Size
====================================================================================================
Installing:
 td-agent                  x86_64         1.1.20-0                       treasuredata          64 M
Installing for dependencies:
 compat-libtermcap         x86_64         2.0.8-49.2.amzn1               amzn-main             16 k
 compat-readline5          x86_64         5.2-17.3.amzn1                 amzn-main            156 k
 openssl098e               x86_64         0.9.8e-18.2.14.amzn1           amzn-updates         892 k
 td-libyaml                x86_64         0.1.4-1                        treasuredata         126 k
Transaction Summary
====================================================================================================
Install  1 Package (+4 Dependent packages)
Total download size: 65 M
Installed size: 112 M
Is this ok [y/d/N]: y
======================================================================

2,)fluentdの各種plugin追加
-- モジュールの追加
# yum install postgresql9.x86_64 postgresql9-devel.x86_64
■前提として、redshift接続用のポスグレクライアントが必要っす

-- プラグインのインストール
# /usr/lib64/fluent/ruby/bin/fluent-gem install fluent-plugin-redshift
# /usr/lib64/fluent/ruby/bin/fluent-gem install fluent-plugin-jsonbucket
■gemコマンドではなくfluent-gemのコマンドであることに注意っす
■他に必要なpluginが有る場合は、ここでガシガシ追加

3,)fluentdのconf作成
# vi /etc/td-agent/td-agent.conf
■テンプレをちょいちょい変更して作成
====================================================================================================
## Input
<source>
    type tail
    path /var/log/httpd/shq_gree/access_log.%Y%m%d
    format /^(?<host>[^ ]*) [^ ]* (?<user>[^ ]*) \[(?<request_time>[^\]]*)\] "(?<method>\S+)(?: +(?<path>[^ ]*) +\S*)?" (?<status>[^ ]*) (?<size>[^ ]*)(?: "(?<referer>[^\"]*)" "(?<agent>[^\"]*)" (?<response_time>[^ ]*))?$/
    time_format %d/%b/%Y:%H:%M:%S %z
    pos_file /var/log/td-agent/tmp/apache.access.log.pos
    tag apache.access
</source>
<match apache.access>
    type jsonbucket
    output_tag redshift.apache.access
    json_key log
</match>
<match redshift.apache.access>
    type redshift
    # s3 (for copying data to redshift)
    aws_key_id <youe_aws_key_id>              #AWSキーをいれる
    aws_sec_key <your_aws_sec_key>            #シークレットキーを入れる
    s3_bucket redshift                        #S3上のどのバケットにデータを配置するか
    s3_endpoint <your_region_name>            #リージョン一覧から、利用しているリージョンを入れる
    path for_redshift/
    timestamp_key_format %Y%m%d/%Y%m%d-%H%M   #S3上にどういうパスでデータが配置したいかを指定
    # redshift
    redshift_host <your_redshift_end_point>   #Redshiftの管理コンソールからエンドポイントを確認
    redshift_port 5439                        #Redshiftが使ってるポートを指定
    redshift_dbname <your_db_name>            #Redshiftでデータを投入するDB名
    redshift_user <rs_user_name>              #Redshiftのユーザ
    redshift_password <rs_user_pass>          #上記ユーザのパス
    redshift_schemaname public                #変更指定なければ、publicがデフォ
    redshift_tablename access_log             #データを投入するテーブル名
    redshift_copy_base_options TIMEFORMAT 'auto' TRUNCATECOLUMNS COMPUPDATE ON    #詳細はこの後
    file_type json
    # buffer
    buffer_type file
    buffer_path /var/log/td-agent/buffer/redshift #一時ファイルの置き場
    flush_interval 10m                        #一時ファイルを何分間隔でflushしてS3→Redshiftにデータを送るか
    buffer_chunk_limit 1g                     #一時ファイルのデータリミット指定
</match>
====================================================================================================
※<source>ディレクティブの正規表現について
apacheログと正規表現を見比べつつ、正常にバッファファイルに出力されているかを確認しつつ
ポリシーを作っていく。
ここでのポイントは、データ内にTimestampを残したい場合、<time>の指定だと、fluentdでattribute
扱いになって、BODYにデータが入りません。
データを扱う上で、Timestampが残らないのは具合が悪いので、<request_time>という<time>以外のKey
を指定することで、BODY内にデータが入るようにしています。

下記サイトで正規表現の正否が確認できるので参考にどうぞ
http://fluentular.herokuapp.com/

※redshift_copy_base_optionsについて
Redshiftへデータを投入するCOPYコマンドにつけるオプションをここに書く
(gitのReadmeに書いてなくてすげー探した)
---- TIMEFORMAT 'auto'
Apacheログの場合、Timestampの出力が
[27/Aug/2014:00:00:00 +0900]
という形このまま突っ込んでも、Redshiftが持っているデフォルトの日付フォーマットに準拠していないため、nullが入ってしまう
それを回避するためにいれてるっす。
---- TRUNCATECOLUMNS
CLOMUNにデータを入れる際に文字数をオーバーするときにカットする
---- COMPUPDATE ON
データの圧縮をして容量の削減
CREATE TABLEする時に、データ圧縮を有効にしたうえでつかいませう

詳細はこちら
http://docs.aws.amazon.com/ja_jp/redshift/latest/dg/r_COPY.html


4,)fluentdの起動
-- コンフィグテスト
# /etc/init.d/td-agent configtest

-- スタート
# /etc/init.d/td-agent start

-- 自動起動設定
# chkconfig td-agent on

5,)Redshift側のテーブル作成

# psql -U <user> -W -h <redshift_end_point> -d <db_name> -p <port_num>
<db_name>=# \d access_log■こんなかんじで作るます
■CREATE TABLE で圧縮も使えるように設定しておく
====================================================================================================
                               Table "public.access_log"
    Column     |            Type             |                Modifiers
---------------+-----------------------------+-----------------------------------------
 host          | character varying(15)       | not null default '-'::character varying
 user          | character varying(255)      | not null default '-'::character varying
 request_time  | timestamp without time zone | not null
 method        | character varying(10)       | not null default '-'::character varying
 path          | character varying(65535)    | not null
 status        | character varying(3)        | not null default '-'::character varying
 size          | character varying(255)      | not null default '0'::character varying
 referer       | character varying(65535)    | not null default '-'::character varying
 agent         | character varying(255)      | not null default '-'::character varying
 response_time | character varying(255)      | not null default '-'::character varying
====================================================================================================

6,)データの確認
# psql -U <user> -W -h <redshift_end_point> -d <db_name> -p <port_num>
<db_name>=# select * from access_log;
      host       | user  |        request_time        | method | path                 | status | size  | refer
-----------------+-------+----------------------------+--------+----------------------+--------+-------+----------------------------------
 111.222.111.222 |   -   | 27/Aug/2014:19:50:26 +0900 | GET    | /index.html          | 200    | 2145  | https://kirarin.taterole.co.jp/
■長いので途中できってます
-------------------------
おしまい

0 件のコメント:

コメントを投稿