ELK 安裝筆記
這份其實是學校作業(逃)。雖然說是作業,但也還算有分享的價值,就在此整理出來。因為主力機 MBA 的儲存空間快炸了,所以我在 AWS 上開了一台 t2.medium
的機器來跑 Spark 以及 ELK Stack。在課堂中, ELK 是以下載 binary zip 包的方式設定,因為小弟習慣用 APT 套件管理程式,所以裝 ELK 相關設定方式也和 binary zip 不太一樣。
安裝過程主要參考數位海的這篇,還有上課簡報。數位海這篇超詳細的,可以交互對照一下。
安裝 Java 8
sudo add-apt-repository -y ppa:webupd8team/java sudo apt-get update sudo apt-get -y install oracle-java8-installer
安裝 ElasticSearch
wget -qO - https://packages.elastic.co/GPG-KEY-elasticsearch | sudo apt-key add - echo "deb http://packages.elastic.co/elasticsearch/2.x/debian stable main" | sudo tee -a /etc/apt/sources.list.d/elasticsearch-2.x.list sudo apt-get update sudo apt-get -y install elasticsearch
到這邊裝完,然後編輯 ElasticSearch 設定檔:
sudo vi /etc/elasticsearch/elasticsearch.yml
把 network.host 改成 0.0.0.0
,讓外網也可以存取。
註:之後還會搭上 nginx 的 reverse proxy,並裝上前端 kibana,這裡為了安全性也可以不要改。
重啟 elasticsearch 的服務:
sudo service elasticsearch restart
讓它開機時自動啟動(Optional)
sudo update-rc.d elasticsearch defaults 95 10
ElasticSearch binary 檔的位置在 /usr/share/elasticserach/bin
。
安裝 head plugin:
sudo /usr/share/elasticserach/bin/plugin install mobz/elasticsearch-head
把 iptable 打開
sudo iptables -A INPUT -m tcp -p tcp --dport 9200 -j ACCEPT sudo iptables -A INPUT -m udp -p udp --dport 9200 -j ACCEPT
記得在 EC2 打開 9200 port,這時候開啟瀏覽器,進到
http://YOUR_IP_ADDRESS:9200/_plugin/head
就有一個簡單的圖形界面啦。
安裝 Kibana
echo "deb http://packages.elastic.co/kibana/4.4/debian stable main" | sudo tee -a /etc/apt/sources.list.d/kibana-4.4.x.list sudo apt-get update sudo apt-get -y install kibana
到這裡裝完,然後編輯 kibana 的設定檔:
sudo vi /opt/kibana/config/kibana.yml
把 server.host 從 0.0.0.0
改成 localhost
,因為稍後會裝 nginx 來做我們的反向代理:
server.host: "localhost"
加入開機啟動,然後啟動服務:
sudo update-rc.d kibana defaults 96 9 sudo service kibana start
安裝 nginx 啥的
sudo apt-get install nginx apache2-utils
建立一個 kibanaadmin 的認證使用者(名稱可換)
sudo htpasswd -c /etc/nginx/htpasswd.users kibanaadmin
編輯 nginx 設定檔
sudo vi /etc/nginx/sites-available/default
換成下面這個
server { listen 80; server_name example.com; auth_basic "Restricted Access"; auth_basic_user_file /etc/nginx/htpasswd.users; location / { proxy_pass http://localhost:5601; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection 'upgrade'; proxy_set_header Host $host; proxy_cache_bypass $http_upgrade; } }
example.com
的地方,看你要換成 Instance 的 IP 或是 domain name 都可以。EC2 可以換成 public dns name。
重啟 nginx
sudo service nginx restart
安裝 Logstash
echo 'deb http://packages.elastic.co/logstash/2.2/debian stable main' | sudo tee /etc/apt/sources.list.d/logstash-2.2.x.list sudo apt-get update sudo apt-get install logstash
中間數位海插了一段設定 SSL 的,因為我沒有要用就跳過這部分。
Logstash 安裝完的 binary 會在 /opt/logstash/bin
。
設定 Logstash
sudo vim /etc/logstash/conf.d/02-twitter.conf
填入以下內容
input { twitter { consumer_key => "" consumer_secret => "" oauth_token => "" oauth_token_secret => "" keywords => ["beauty"] languages => ["en"] full_tweet => true } } output { elasticsearch { index => "twitter" } }
oauth 的 key 就填自己申請的,keywords 填自己要的,然後存檔離開。
接下來跑
sudo service logstash configtest
看一下設定檔有沒有寫錯, 然後重啟 logstash 服務,並加入開機自啟動(Optional)
sudo service logstash restart sudo update-rc.d logstash defaults 96 9
原則上這時候登入 kibana 或是在 head 儀表板就可以看到記錄數一直增多了 :p
匯出資料
我用了 elasticsearch-dump 套件,記得先裝好 node v1.0 以上版本。
npm install elasticdump -g # 安裝 elasticdump --input=http://localhost:9200/twitter --output=twitter.json # 一鍵匯出
上傳
之前 Github 推了 LFS(Large File Storage),json 雖然純文字檔很好壓縮,但無論怎麽壓還是有點難推進到 100 MB ,也就是 Github 支援的最大容量,以內。勢必就要來用下 git-lfs 了。
匯出的資料格式
搜尋的關鍵字是 beauty,你知道 twitter 上最多這種圖帳了,多訂閱幾個總是使人心情愉悅 #)
{ "_index": "twitter", // 灌入到 elasticsaerch 裡的資料表 "_type": "logs", "_id": "AVPCY9McFvHLlvNymVV9", // elasticearch 產生的 id "_score": 1, "_source": { "created_at": "Tue Mar 29 12:40:34 +0000 2016", // 建立於 "id": 714794377491587100, // twitter 的 tweets id "id_str": "714794377491587072", "text": "Regina King On The 'Fascinating' Beauty Of Black Women's Hair https://t.co/0838uXkQ1e @HannahOliver152", "source": "<a href=\"http://dlvr.it\" rel=\"nofollow\">dlvr.it</a>", "truncated": false, "in_reply_to_status_id": null, "in_reply_to_status_id_str": null, "in_reply_to_user_id": null, "in_reply_to_user_id_str": null, "in_reply_to_screen_name": null, "user": { // twitter user 的資料 "id": 2558258431, // user id "id_str": "2558258431", "name": "Hannah Oliver", //名字 "screen_name": "HannahOliver152", //帳號名 "location": null, "url": "http://www.wordpress.com", "description": "Our life always expresses the result of our dominant thoughts.", "protected": false, "verified": false, "followers_count": 31, "friends_count": 11, "listed_count": 6, "favourites_count": 0, "statuses_count": 17481, "created_at": "Tue Jun 10 05:18:02 +0000 2014", "utc_offset": null, "time_zone": null, "geo_enabled": false, "lang": "en", "contributors_enabled": false, "is_translator": false, "profile_background_color": "C0DEED", "profile_background_image_url": "http://abs.twimg.com/images/themes/theme1/bg.png", "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme1/bg.png", "profile_background_tile": false, "profile_link_color": "0084B4", "profile_sidebar_border_color": "C0DEED", "profile_sidebar_fill_color": "DDEEF6", "profile_text_color": "333333", "profile_use_background_image": true, "profile_image_url": "http://pbs.twimg.com/profile_images/476232749041201152/yWKGqAkC_normal.jpeg", "profile_image_url_https": "https://pbs.twimg.com/profile_images/476232749041201152/yWKGqAkC_normal.jpeg", "profile_banner_url": "https://pbs.twimg.com/profile_banners/2558258431/1402377722", "default_profile": true, "default_profile_image": false, "following": null, "follow_request_sent": null, "notifications": null }, "geo": null, "coordinates": null, "place": null, "contributors": null, "is_quote_status": false, "retweet_count": 0, "favorite_count": 0, "entities": { "hashtags": [], "urls": [ { "url": "https://t.co/0838uXkQ1e", "expanded_url": "http://dlvr.it/Kw7QcG", "display_url": "dlvr.it/Kw7QcG", "indices": [ 62, 85 ] } ], "user_mentions": [ { "screen_name": "HannahOliver152", "name": "Hannah Oliver", "id": 2558258431, "id_str": "2558258431", "indices": [ 86, 102 ] } ], "symbols": [] }, "favorited": false, "retweeted": false, "possibly_sensitive": false, "filter_level": "low", "lang": "en", "timestamp_ms": "1459255234488", "@version": "1", "@timestamp": "2016-03-29T12:40:34.000Z" }, "fields": { "@timestamp": [ 1459255234000 ] } }
(完)