プログラミングを完全に理解したエンジニアのメモ

チラ裏レベルのことしか書いてないインターネットの藻屑

Elastic Stack 5.0がリリースされたのでログの可視化をしようとしたらできなかった話

この間elastic stack 5.0系が出たので使ってみようと頑張ったログです。 技術系のアウトプットは基本的にQiitaにするけど収集できなかったのではてぶに投稿、、、

使うもの

https://www.elastic.co/jp/products

  • Beats
  • Logstash
  • Elasticsearch
  • Kibana
  • GMOVPSサーバー2台(CentOS6.2 x64/メモリ1G/SSD50GB/CPU 2Core)

週に500ユーザーくらいのwebサーバーだからBeatいらない気もするけどせっかくなので構成に入れてみた。

したかった構成

f:id:fujitora:20161031175613p:plain

共通の環境構築

java

sudo yum update -y
sudo yum remove -y java-1.7.0-openjdk
sudo yum install -y java-1.8.0-openjdk-devel
sudo yum install -y java-1.8.0-openjdk-debuginfo --enablerepo=*debug*

yum

sudo rpm --import https://artifacts.elastic.co/GPG-KEY-elasticsearch
sudo vi /etc/yum.repos.d/elastic.repo
[elasticsearch-5.x]
name=Elasticsearch repository for 5.x packages
baseurl=https://artifacts.elastic.co/packages/5.x/yum
gpgcheck=1
gpgkey=https://artifacts.elastic.co/GPG-KEY-elasticsearch
enabled=1
autorefresh=1
type=rpm-md

ELKサーバーの構築

Elasticsearch

sudo yum install -y elasticsearch

Kibana

sudo yum install -y kibana
sudo vi /etc/kibana/kibana.yml
#server.host: "localhost"
を
server.host: "XXX.XXX.XXX"
に書き換え

起動

sudo service elasticsearch start
sudo service kibana start

elasticsearchの起動確認コマンド

$ curl 'localhost:9200'

{
  "name" : "qLGo9hB",
  "cluster_name" : "elasticsearch",
  "cluster_uuid" : "XETXNZ0kQTWiw_dFNZWMhg",
  "version" : {
    "number" : "5.0.0",
    "build_hash" : "253032b",
    "build_date" : "2016-10-26T04:37:51.531Z",
    "build_snapshot" : false,
    "lucene_version" : "6.2.0"
  },
  "tagline" : "You Know, for Search"
}

Elasticsearch起動エラー

サーバーのメモリが少なすぎてElasticsearch起動時にエラーが出た

Starting elasticsearch: OpenJDK 64-Bit Server VM warning: INFO: os::commit_memory(0x00000006d0660000, 4019847168, 0) failed; error='Cannot allocate memory' (errno=12)
#
# There is insufficient memory for the Java Runtime Environment to continue.
# Native memory allocation (mmap) failed to map 4019847168 bytes for committing reserved memory.
# An error report file with more information is saved as:
# /tmp/hs_err_pid21456.log
                                                           [FAILED]

5.0ではES_HEAP_SIZEをelasticsearch.ymlに書けない

sudo vi /etc/elasticsearch/jvm.options

サーバーのスペックに合わせて設定

-Xms1000m
-Xmx1000m

Kibanaにアクセス

http://XXX.XXX.XXX.XX:5601にアクセスするとKibanaの画面がでる スクリーンショット 2016-10-30 18.18.03.png

Logstash

sudo yum install -y logstash
sudo vi /etc/logstash/conf.d/logstash.conf

動かしてないから雰囲気で

input{
  beats{
    host => "YYY.YYY.YYY.YY"
    port => 5044
  }
}

output{
  elasticsearch{
    hosts => ["localhost:9200"]
    index => "accesslog-%{+YYYYMM}"
  }
}

起動

sudo initctl start logstash

webサーバー(Railsアプリケーション)

filebeatsでELKサーバーにログを流す

sudo yum install -y filebeat
sudo vi /etc/filebeat/filebeat.yml

動かしてないから雰囲気で

filebeat.prospectors:
- input_type: log
  paths:
    - /var/log/nginx/access.log

output.logstash:
  hosts: ["http://XXX.XXX.XXX.XX:5044"]
  index: filebeat

起動

sudo /etc/init.d/filebeat start

できなかった理由とかまとめ的な

  • そもそもfilebeatから直で別サーバーのlogstashに流せない(?)
  • [logfile -> filebeat -> logstash] -> [logstash -> elasticsearch -> kibana]が正しい構成(?)
  • サーバーのスペック問題 => AWSのEC2インスタンスを作る
  • logstashとbeatの書き方がわからん => 試しに実行するとESが止まっちゃう
  • sslでじゃないとforwardできないみたいな情報を見た気がする

free -tmコマンドでメモリ使用量をみるとこんな感じ Logstash elasticsearch kibana起動しただけでの使用量

f:id:fujitora:20161031171731p:plain

AWS EC2で構築しなおします。

参考サイト

acro-engineer.hatenablog.com

snickerjp.blogspot.jp

www.elastic.co

仮説検定の判断をp値でする危険性

仮説検定とは

「母集団に差がない」とする帰無仮説とそれの逆である「母集団に差がある」という対立仮説をもとに検定を行うことである。

  • 帰無仮説(H0)…比較対象に差がない(A=B)
  • 対立仮説(H1)…比較対象に差がある(A≠B)

p値とは

検定の結果が偶然か偶然じゃないかを決定する値 => 「まぐれ」な確率 「棄却域の確率」とか「有意水準」という。

検定

検定統計量(求めたp値) < 有意水準 => 帰無仮説(H0)を棄却 = 対立仮説(H1)を採用 => 有意差があるよ!

有意水準を0.05とした時に、「p < 0.05」だった場合は、「5%以下の確率で偶然って判定されるよ(まぐれは5%以下だよ)」= 「95%の確率で偶然じゃなよ」ということである。

有意水準は一般的に0.01 , 0.05 , 0.1が使われる。

データ数が増えるとp値が0に近づき、どんなデータも有意になってしまうのでは?

そこで疑問に思った。データ数が増えるとp値が0に近づき、どんなデータも有意になってしまうのでは? 母集団のサンプル数が増え、p値が0に近づくということは p < 0.05 が成り立ち、どんな検定でも帰無仮説が棄却されて有意差があると判断できてしまうのではないかと思った。 そこで身近な例をもとに検証する。

(例)広告のABテストの母平均の差の検定

  • 帰無仮説...AとBに差がない
  • 対立仮説...AとBに差がある

有意水準5%で検定する。(5%というのも様々な議論があるが一旦放置)

インプレション数 クリック数 クリック率
広告A 99 49 49%
広告B 102 50 49%
> prop.test(c( 49 , 50 ),c( 99 , 102 ))

  2-sample test for equality of proportions with continuity correction

data:  c(49, 50) out of c(99, 102)
X-squared = 1.1651e-30, df = 1, p-value = 1
alternative hypothesis: two.sided
95 percent confidence interval:
 -0.1382439  0.1477508
sample estimates:
   prop 1    prop 2
0.4949495 0.4901961

p > 0.05なので差がないといえる。

データ数を1000倍に増やしてみる。

インプレション数 クリック数 クリック率
広告A 99000 49000 49%
広告B 102000 50000 49%
> n = 1000; prop.test(c( n*49 , n*50 ),c( n*99 , n*102 ))

  2-sample test for equality of proportions with continuity correction

data:  c(n * 49, n * 50) out of c(n * 99, n * 102)
X-squared = 4.5226, df = 1, p-value = 0.03345
alternative hypothesis: two.sided
95 percent confidence interval:
 0.0003718071 0.0091350259
sample estimates:
   prop 1    prop 2
0.4949495 0.4901961

p < 0.05なので帰無仮説が棄却されて差があると判断される。

サンプル数が多くなるとp値が限りなく0に近くなり有意(p < 0.05)になってしまい、採用する仮説が異なって( = 結果が逆になる)しまう。

まとめ

  • データ数でいくらでも操作できるのでp値だけで判断できない
  • サンプル数が多いときに仮説検定をすること自体間違っている

アメリカ統計学会も勧告を出している AMERICAN STATISTICAL ASSOCIATION RELEASES STATEMENT ON STATISTICAL SIGNIFICANCE AND P-VALUES

  1. P-values can indicate how incompatible the data are with a specified statistical model.
  2. P-values do not measure the probability that the studied hypothesis is true, or the probability that the data were produced by random chance alone.
  3. Scientific conclusions and business or policy decisions should not be based only on whether a p-value passes a specific threshold.
  4. Proper inference requires full reporting and transparency.
  5. A p-value, or statistical significance, does not measure the size of an effect or the importance of a result.
  6. By itself, a p-value does not provide a good measure of evidence regarding a model or hypothesis.

面白かったサイト

tjo.hatenablog.com

abrahamcow.hatenablog.com

abrahamcow.hatenablog.com

www.gixo.jp

techlife.cookpad.com