Logstash:运用 Elastic Stack 分析 CSDN 阅读量

在今天的文章中,我将来介绍一下如何使用 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:

这样我们就完成了数据的可视化化。

展开阅读全文
实付0元
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值