在今天的文章中,我將來介紹一下如何使用 Elastic Stack 來分析 CSDN 的閱讀量。在這個教程中,我們將會學到:
- 如何使用 http_poller 從 github 下載一個CSV,並把該數據導入到 Elasticsearch 中
- 如何使用 fingerprint 過濾器保證沒有重複的數據導入到 Elasticsearch 中,即使我們導入很多次
我們知道目前 CSDN 提供一個月的統計數據。我們可以在如下的地方找到:
點擊上面的 “導出數據”,我們就可以得到所有關於文章的閱讀量,評論數,粉絲數及收藏數。
爲了便於保存數據,我們可以一個月導出一次,並放到自己的網中進行保存,以供以後的分析之用。在今天的練習中,我們將把數據放到 github 中。每過一段時間,我們就可以更新一次這個數據。我把數據放在:https://github.com/liu-xiao-guo/csdn_reports
導入數據
爲了能包數據從一個網站下載,並解析導入到 Elasticsearch 中,我們使用 Logstash 來完成。首先,我們來看一下我們的數據文件:
這個數據文件的內容非常簡單。第一例是數據的時間 date,我們同時可以看到 visitors, fans, comments 及 bookmarks。
爲此,我們使用如下的 Logstash 的配置文件:
logstash_csdn.conf
input {
http_poller {
urls => {
get_csdn_report => {
method => get
url => "https://raw.githubusercontent.com/liu-xiao-guo/csdn_reports/master/csdn1.csv"
}
}
request_timeout => 60
schedule => { "in" => "0" }
codec => "plain"
metadata_target => "csdn"
}
}
filter {
split {
"field" => "message"
}
csv {
separator => ","
columns => ["date", "visitors", "comments", "bookmarks", "fans"]
}
# remove the header
if "date" in [date] {
drop { }
}
date {
match => [ "date", "yyyy年MM月dd日" ]
timezone => "Asia/Shanghai"
}
mutate {
remove_field => [ "csdn", "message", "date", "@version" ]
convert => {
"fans" => "integer"
"comments" => "integer"
"bookmarks" => "integer"
"visitors" => "integer"
}
}
fingerprint {
source => [ "@timestamp", "visitors", "comments", "bookmarks", "fans"]
target => "[@metadata][fingerprint]"
method => "SHA1"
key => "liuxg"
concatenate_sources => true
base64encode => true
}
}
output {
stdout {
codec => rubydebug
}
elasticsearch {
manage_template => "false"
hosts => "localhost:9200"
index => "csdn"
document_id => "%{[@metadata][fingerprint]}"
}
}
在這裏,我們使用 http_poller 來自動從 github 上抓取數據文件。由於我們只有一個文件,並不是一個數據流,所以,我們只抓取一次。爲此,我們設置 schedule => { "in" => "0" }。另外,針對 github 上的文件,我們必須點擊 Raw 才能得到它真正的 url:
由於,我可能會經常更新這個 csv 文件,也就意味着我可能會重複運行 Logstash 導入最新的數據。這裏可能就會產生一個問題:之前的數據極有可能會產生重複的數據。那麼我們怎麼處理這個問題呢?答案是使用 fingerprint 過濾器來生產唯一的文檔 ID。那麼即使我們重複導入同樣的一個文件,那麼它也不會造成重複的文檔。如果你想了解更多如果使用 fingerprint,請閱讀我的文章 “運用 fingerprint 過濾器處理重複的文檔”。我們使用如下的方法:
fingerprint {
source => [ "@timestamp", "visitors", "comments", "bookmarks", "fans"]
target => "[@metadata][fingerprint]"
method => "SHA1"
key => "liuxg"
concatenate_sources => true
base64encode => true
}
其它的部分都比較直接。我直接運行 Logstash,並把數據導入到 Elasticsearch 中。
sudo ./bin/logstash -f ~/data/csdn/logstash_csdn.conf
這個時候,我們可以在 console 中看到:
我們可以在 Elasticsearch 中看到我們生產的索引。
分析數據
爲了分析索引 csdn,我們必須爲之創建一個 index pattern:
這樣我們就創建了好了 index pattern。
下面,我們接着來生成我們的第一個可視化。
點擊上面的 Update 按鈕:
我們需要選擇合適的時間範圍。我們把上面的 Bar 修改爲 line:
點擊 Update:
我們接下來想統計出累積的閱讀量:
選擇 Y- axis
點擊 Update。顯然,上面的兩個數據在一起共有一個 Y 軸,數據顯示的不好看。
選擇 New axis ...
這樣,我們可以看到兩個圖分別使用不同 Y軸。我們調整一下 Y 軸的左右順序:
我們把這個 Visualization 保存爲 visitors。
按照同樣的方法,我們生產 fans, comments 及 bookmarks 的 Visualization:
我們現在來創建一個 Dashboard:
這樣我們就完成了數據的可視化化。