Elastic Stack 5.0がリリースされたのでログの可視化をしようとしたらできなかった話
この間elastic stack 5.0系が出たので使ってみようと頑張ったログです。 技術系のアウトプットは基本的にQiitaにするけど収集できなかったのではてぶに投稿、、、
使うもの
https://www.elastic.co/jp/products
週に500ユーザーくらいのwebサーバーだからBeatいらない気もするけどせっかくなので構成に入れてみた。
したかった構成
共通の環境構築
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の画面がでる
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起動しただけでの使用量
AWS EC2で構築しなおします。
参考サイト
仮説検定の判断を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
- P-values can indicate how incompatible the data are with a specified statistical model.
- 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.
- Scientific conclusions and business or policy decisions should not be based only on whether a p-value passes a specific threshold.
- Proper inference requires full reporting and transparency.
- A p-value, or statistical significance, does not measure the size of an effect or the importance of a result.
- By itself, a p-value does not provide a good measure of evidence regarding a model or hypothesis.