使用 ELK 來分析你的支付寶賬單

NealCaffery發表於2018-02-10

ELK 即 elasticsearch, logstash 以及 kibana。Elasticsearch 是一個基於 lucene 的分散式搜尋引擎,logstash 是一種日誌傳輸工具,也可以對日誌資料進行過濾處理,kibana 則是基於 angular 開發的展示平臺,可以進行資料的搜尋以及視覺化展示。目前 ELK 平臺被廣泛用於日誌的分析處理。

支付寶賬單

前幾天看了一篇國外使用 ELK 分析賬單的部落格,突然冒出這個想法是不是可以使用 ELK 去分析支付寶賬單。支付寶官網提供下載賬單的地方,可以下載任意時間段的賬單,可以下載 csv 以及 txt 格式的資料檔案。登入支付寶官網首頁產看點選檢視所有交易記錄就可以了。

9ePwm8.md.png

9einhj.md.png

可以切換到高階版查詢資料,有更多的查詢條件來查詢資料,包括交易時間,交易狀態,關鍵字等等,你可以下載任意時間段的資料。其實兩種格式的資料都是 csv 格式的資料。表格資料主要包含以下資訊:

交易號 商戶訂單號 交易建立時間 付款時間 最近修改時間 交易來源地 型別 交易對方 商品名稱 金額(元)收/支 交易狀態 服務費(元)成功退款(元)備註 資金狀態

安裝

ELK 三個軟體的安裝都十分簡單,下載就可以使用,無需安裝。可以去 https://www.elastic.co/cn/downloads 下載頁面選擇合適的工具進行下載。三個工具的使用都十分簡單,一般只需要執行 bin 檔案下的 bat 檔案就可以了。我下載的都是最新版本的,即 6.1.2 版本。

elasticsearch

執行命令:elasticsearch.bat

驗證 ES 執行成功,可以使用 curl 命令,curl http://loclahost:9200 或者直接使用瀏覽器訪問 localhost:9200

{
  "name" : "ZWtApuh",
  "cluster_name" : "elasticsearch",
  "cluster_uuid" : "DyfiD0NlSkuDdE5m-NBRAg",
  "version" : {
    "number" : "6.1.2",
    "build_hash" : "5b1fea5",
    "build_date" : "2018-01-10T02:35:59.208Z",
    "build_snapshot" : false,
    "lucene_version" : "7.1.0",
    "minimum_wire_compatibility_version" : "5.6.0",
    "minimum_index_compatibility_version" : "5.0.0"
  },
  "tagline" : "You Know, for Search"
}
複製程式碼

執行

整個框架資料流轉的過程大致是這個樣子的:

elk

首先從支付包官網下載資料,可以選擇 excel 格式進行下載,為了方便資料的處理,最好刪除掉表頭和表尾的資料,只保留資料,這也是為了方便後面的 logstash 的處理。接著使用 logstash 的處理,logstash 相當於是一個資料中轉站,從 csv 檔案中獲取資料,然後對獲取的資料在進行處理,在將資料輸出到 elasticsearch 中。Elasticsearch 對於資料進行索引,最後 kibana 作為展示工具可以對 ES 索引的資料進行展示。

從支付寶官網下載資料後,應該刪除掉表頭和表尾資料,只保留我們需要的資料資訊。接著使用 logstash 來處理資料,包括 input, filter, output 三個方面的配置。首先是 input:

input {
  file {
    type => "zhifubao"
    path => ["C:/Users/neal1/project/bill-analysis/data/*.csv"]
    start_position => "beginning"
    codec => plain {
      charset => "GBK"
    }
  }
}
複製程式碼

可以通過 type 來設定來區分資料的不同型別,注意一點的是需要設定 charset 來處理編碼問題,否則可能會導致亂碼問題。另外對於 ES 的配置,也要設定 ES 安裝程式 config 資料夾中的 jvm.options 檔案,將 -Dfile.encoding=UTF8 改為 -Dfile.encoding=GBK,否則 logstash 向 ES 中寫入資料也會產生報錯。

filter {
  if [type] == "zhifubao" {
    csv {
      separator => ","
      columns => ["TransId", "OrderId", "TransCreateTime", "Paytime", "LastModified", "TransSource", "Type", "Counterparty", "ProductName", "Amount", "inOut",
                  "status", "serviceCost", "IssuccessRefund", "Remark", "FundStatus"]
      convert => {
        "Amount" => "float"
      }
    } 
    date {
        match => ["TransCreateTime", "dd/MMM/yyyy HH:mm:ss", "yyyy/MM/dd HH:mm"]
    }
  }
}
複製程式碼

接著是使用 filter 外掛對資料進行過濾

filter {
  if [type] == "zhifubao" {
    csv {
      separator => ","
      columns => ["TransId", "OrderId", "TransCreateTime", "Paytime", "LastModified", "TransSource", "Type", "Counterparty", "ProductName", "Amount", "inOut",
                  "status", "serviceCost", "IssuccessRefund", "Remark", "FundStatus"]
      convert => {
        "Amount" => "float"
      }
    } 
    date {
        match => ["TransCreateTime", "dd/MMM/yyyy HH:mm:ss", "yyyy/MM/dd HH:mm"]
    }
  }
}
複製程式碼

需要對於 csv 檔案進行轉化,設定對應的列名。還有一點就是要使用 date 外掛來修改 timestamp,否則索引的預設 timestamp 是 logstash 向 ES 中寫入資料的時間。通過 date 外掛可以將交易事件轉化為預設的 timestamp 來使用。另外我們還需要轉化 Amount 的型別,這也是為了後來資料的視覺化的聚合,Amount 只有變成數值型才可以進行數字運算。

最後輸出到 ES 中

output {
  if [type] == "zhifubao" {
    elasticsearch {
        hosts => [ "localhost:9200" ]
        index => logstash
    }
  }
}
複製程式碼

hosts 可以支援新增多個 ES 例項,並且設定索引名,這裡最好設定一下,否則可能會導致索引名對映錯誤。這樣,就完成了 logstash 的配置檔案 logstash.conf。Logstash 的執行命令為 logstash.bat -f logstash.conf 來執行。

最後一步就是利用 kibana 進行資料的展示和分析了。再次我也僅僅是站在一些角度提出自己對於資料的分析,可能還有很多更有意思的想法我並沒有想到。Kibana 是一款基於 angular 的 ES 展示工具,它講很多 ES 語法進行封裝,因此進行一些操作就可以進行資料的查詢或者視覺化。首次使用 kibana的時候,我們需要建立索引:

9MicpF.md.png

9Migl4.md.png

索引建立成功之後,你就可以進行查詢了。對於 kibana 的查詢我就不一一贅述,可以參考query dsl。這裡,我主要講一下資料的視覺化。最後建立的一個 dashboard 大致是這個樣子的:

9MiotK.md.png

主要包括:當前的累計收入,累計支出,支出收入比,每禮拜最高支出,支出變化,Visualize 的型別主要包括 Metric, Line, Pie, Vertical bar 型別。選一個例子來講,假設我們要建立一個每個禮拜最高支出的柱狀圖。

gickr com _583f7777-c0a9-2934-1569-578643ec11d1

總結

以上我就是利用 ELK 對於支付寶賬單的一個視覺化分析。ELK 對於大資料的分析可以說是如魚得水,此次的實驗也僅僅是一個簡單的嘗試,如果大家有更有意思的想法,可以和我交流。

以上。

歡迎搜尋微訊號 mad_coder 或者掃描二維碼關注公眾號:

93cfyj.jpg

相關文章