《Learning ELK Stack》2 構建第一條ELK資料管道

yeedomliu發表於2020-07-30

本章將使用ELK技術棧來構建第一條基本的資料管道。這樣可以幫助我們理解如何將ELK技術棧的元件簡單地組合到一起來構建一個完整的端到端的分析過程


輸入的資料集

  • 在我們的例子中,要使用的資料集是google每天的股票價格資料

下載地址:finance.yahoo.com/q/hp?s=GOOG

輸入資料集的資料格式

  • 欄位包括Date(日期)、Open Price(開盤價)、Close Price(收盤價)、High Price(最高價)、Volume(成交量)和Adjusted Price(調整價格)

image-20200620180136974


配置Logstash的輸入

  • 檔案輸入外掛可以從檔案中讀取事件到輸入流裡,檔案中的每一行會被當成一個事件處理。它能夠自動識別和處理日誌輪轉。如果配置正確,它會維護讀取位置並自動檢測新的資料。它讀取檔案的方式就類似於tail -0f
input {
    file {
        path => "檔案路徑(必選項)"
        start_position => "讀取資料的開始位置"
        tags => "任意字串陣列,能在隨後針對事件做一些過濾和處理"
        type => "標記事件的特定型別"
    }
}
  • path:檔案輸入外掛唯一必填的配置項
  • start_position:從原始檔讀取資料的開始位置,可以是beginningend。預設是end,這樣可以滿足讀取活動的流資料的場景需求。如果需要讀取歷史資料,可以設定為beginning
  • tags:可以是任意數量的字串陣列,在隨後基於tags來針對事件做一些過濾和處理
  • type:標記事件的特定型別,可以在隨後的過濾和搜尋中有所幫助 。type欄位會儲存在es的文件中,並通過kibana的_type欄位來進行展現

如,可以將type設定為error_log或者info_logs

input {
    file {
        path => "/opt/logstash/input/GOOG.csv"
        start_position => "beginning"
    }
}

因為是歷史資料,所以需要設定start_position為beginning


過濾和處理輸入資料

  • 接下來可以根據需要對輸入資料進行過濾,以便識別出需要的欄位並進行處理,以達到分析的目的
  • 因為我們輸入檔案是CSV檔案,所以可以使用csv過濾外掛。csv過濾器可以對csv格式的資料提取事件的欄位進行解析並獨立儲存
filter {
  csv {
    columns => #欄位名陣列
    separator => # 字串;預設值,
  }
}
  • columns屬性指定了csv檔案中的欄位的名字,可選項。預設將欄位命名為column1column2等等
  • separator屬性定義了輸入檔案中用來分割不同欄位的分割符。預設是逗號,也可以是其他任意的分割符
filter {
    csv {
        columns => ["date_of_record", "open", "high", "low", "close", "volumn", "adj_close"]
        separator => ","
    }
}
  • 我們需要指定哪個列代表日期欄位,以便它可以被顯式地索引為日期型別,這樣可以用於基於日期的過濾。Logstash中有一個叫date的過濾器可以完成上述任務
filter {
    date {
        match => # 預設值是[]
        target => # 預設值是@timestamp
        timezone => ","
    }
}
  • match:是一個[域,格式],可為每個欄位設定一種格式
  • timestamp:在上述例子中,我們採用了歷史資料,不希望使用時間捕獲時的時間作為@timestamp,而是使用記錄生成時的時間,所以我們將date欄位對映為@timestamp。這不是強制的,但建議這樣做
  • 可以使用mutate過濾器將欄位轉換為指定的資料型別,這個過濾器可以用於對欄位做各種常見的修改,包括修改資料型別、重新命名、替換和刪除欄位。另外也可以用來合併兩個欄位、轉換大小寫、拆分欄位等等
  • date過濾器可以配置如下
date {
    match => ["date_of_record", "yyyy-MM-dd"]
    target => "@timestamp"
}
  • 我們的案例中,因為我們採用了歷史資料,不希望使用時間捕獲時的時間作業@timestamp,而是使用記錄生成時的時間,所以我們將date欄位對映為@timestamp,這不是強制的,但建議這樣做
  • 我們使用mutate過濾器將欄位轉換為指定的資料型別。這個過濾器可以用於對欄位做各種常見的修改,包括修改資料型別、重新命名、替換和刪除欄位。另外也可以用來合併兩個欄位、轉換大小寫、拆分欄位等等
filter {
    mutate {
        convert => # 列以及資料型別的Hash值(可選項)
        join => # 用於關聯的列的Hash值(可選項)
        lowercase => # 用於轉換的欄位陣列
        merge => # 用於合併的欄位的Hash值
        rename => # 用於替換的欄位的Hash值
        replace => # 用於替換的欄位的Hash值
        split => # 用於分割的欄位的Hash值
        strip => # 欄位陣列
        uppercase => # 欄位陣列
    }
}
  • 這是例子的實際配置
mutate {
    convert => ["open", "float"]
    convert => ["high", "float"]
    convert => ["low", "float"]
    convert => ["close", "float"]
    convert => ["volume", "float"]
    convert => ["adj_close", "float"]
}
  • 使用了convert功能來將價格和成交量欄位轉換為浮點數和整數型別

將資料儲存到Elasticsearch

  • 我們配置好使用LogstashCSV過濾器(用來處理資料),並且已根據資料型別對資料進行解析和處理。接下來將處理後的資料儲存到Elasticsearch,以便對不同欄位做索引,這樣後續就可以使用Kibana來展現
output {
    elasticsearch {
        action => # 字串(可選項),預設值:"index"(索引),delete(根據文件ID刪除文件)
        cluster => # 字串(可選項),叢集名字
        hosts=> # 字串(可選項)
        index=> # 字串(可選項),預設值:"logstash-%{+YYYY.MM.dd}"
        index_type => # 字串(可選項),事件寫入的索引型別,確保相同型別的事件寫入相同型別的索引
        port => # 字串(可選項)
        protocol => # 字串,協議型別,取值為["node","transport","http"]
    }
}
  • 來看一下完整的Logstash配置
input {
    file {
        path => "/GOOG.csv"
        start_position => "beginning"
    }
}
filter {
    csv {
        columns => ["date_of_record","open","high","low","close","volume","adj_close"]
        separator => ","
    }
    date {
        match => ["date_of_record", "yyyy-MM-dd"]
    }
    mutate {
        convert => ["open", "float"]
        convert => ["high", "float"]
        convert => ["low", "float"]
        convert => ["close", "float"]
        convert => ["volume", "float"]
        convert => ["adj_close", "float"]
    }
}
output {
    elasticsearch {
        hosts=>"localhost"
    }
}
  • 儲存並命名為logstash.conf
bin/logstash -f logstash.conf

使用Kibana視覺化

執行

  • 執行如下程式,然後開啟瀏覽器地址http://localhost:5601,預設使用logstash-*索引
bin/kibana
  • 首先,需要在資料的日期範圍內設定日期過濾器,以構建我們的分析。點選右上角的時間過濾器(Time Filter),根據資料的日期範圍來設定絕對時間過濾器

image-20200625231609715

  • 在構建視覺化報表之前,需要先確認所有的欄位是否已經根據其資料型別建立了正確的索引,這樣才能對這些欄位執行合適的操作
  • 點選螢幕上方的Settings頁面連結,然後選擇螢幕左邊的logstash-*索引模式

image-20200625231733875

視覺化元件

  • Kibana主頁上方點選視覺化(Visualize)頁面連結,然後點選新建視覺化的圖示
  • 此頁顯示多種視覺化元件都可以用Kibana介面來實現

image-20200625231822696

構建折線圖

  • 首先構建一個折線圖,用來顯示六個月來GOOG每週收盤價的指數趨勢
  • 從上圖視覺化選單中選擇折線圖,然後選擇Y軸(Y-Axis)的聚合函式為Max,欄位為close。在桶(buckets)的區域,選擇聚合(Aggregation)為基於@timestamp欄位的日期直方圖(Date Histogram),間隔(Interval)選擇每週(Weekly),點選應用(Apply)。將上述折線圖儲存並命名,隨後可在儀表盤中使用

image-20200625232913432

構建柱狀圖

  • 構建一個垂直柱狀圖呈現六個月內的成交量變化趨勢
  • 在視覺化選單中選擇垂直柱狀圖,選擇Y軸的聚合函式為Sum,欄位為volume。在桶的區域,選擇X軸的聚合函式為基於@timestamp欄位的日期直方圖,間隔選擇每週

image-20200625232928834

構建度量

  • 用度量顯示過去六個月每天的單日最高交易量
  • 點選視覺化選單中的度量,選擇度量的聚合函式為Max,欄位為volume,然後點選應用

image-20200625232943292

構建資料表

  • 資料表以表格的形式顯示某些組合聚合結果的詳細資料
  • 建立一個六個月內的月度平均成交量的資料表
  • 在視覺化選單中的資料表,點選拆分行(split rows),選擇度量值 的聚合函式為求平均值 (Average),欄位為volume。在桶的區域,選擇聚合函式為基於@timestamp欄位的日期直方圖,間隔為月度(Monthly

image-20200625232956482

  • 在頁面的頂部選擇儀表盤頁面連結,點選增加視覺化(Add Visualization)連結,選擇已儲存的視覺化元件並在儀表盤頁面上進行佈局
  • 下圖是一個包含了折線圖、柱狀圖、資料表和度量值 的儀表盤

image-20200625233411108

  • 儀表板可在其他系統裡作為內嵌框架,或者直接以連結的形式分享
本作品採用《CC 協議》,轉載必須註明作者和本文連結

相關文章