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:

這樣我們就完成了數據的可視化化。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章