在今天的文章中,我将来介绍一下如何使用 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:
这样我们就完成了数据的可视化化。