酷播亮新聞
最棒的知識補給站

海量日誌架構中的後端數據處理技術對比

文章摘要: 27 4 3、 效能圖表 a) ES效能 b) 作業系統效能 c) ES資料樣本 {生成資料檔案tweet.nifi.json 每個測試重複三次

1. 測試目的

隨著ELK技術的普及,Elasticsearch所提供的強大搜索、分析功能給大家處理各種型別的海量資料提供了可能。隨之而來的是如何將各種型別的海量資料以一種通用、便捷、高效的方式進入到ES供其使用。傳統的logstash具備這方面的能力,但由於其固有的缺陷無法避免,導致其處理效能較低,難於開發除錯。

我們迫切需要一種通用的數據處理方式,實現從資料來源到ES的全流程處理,最終需要達到:

  1. 通用性:介面豐富、有流程控制、資料型別轉換、資料加工
  2. 易開發:便於快速開發除錯
  3. 易管理:容易發現數據問題,效能瓶頸,清晰的流程
  4. 高效能:對數據處理有較高的吞吐量,較低的資源消耗

當然我們可以開發特定的Spark Streaming應用來實現資料到ES的流轉,但從通用性、易用性方面來看,由於條件所限,這種方法代價較高,週期長,且效能、穩定性較難保證。

因此我們選用幾種資料通用處理方法進行測試,對比各自的優缺點,發現他們所適應的場景:

  1. filebeat+ingest node
  2. logstash
  3. Apache Nifi
  4. Streamsets Data Collector(SDC)

2. 測試方法

  1. 測試簡單Apache日誌,普適於一般日誌資料解析

a) 使用同一份Apache access log資料作為測試樣本

b) 進行簡單資料模式匹配,使用統一的COMBINEDAPACHELOG grok pattern對資料進行解析,將結果輸入ES

  1. 測試複雜json結構的Twitter資料,對其欄位進行轉換、計算、篩選等處理,應對複雜、大結構的數據處理

a) 使用同一份Twitter的json資料作為測試樣本

b) 由於原始的Twitter資料為非標準json資料,因此在對nifi進行處理之前先將其處理為標準的json array資料,生成資料檔案tweet.nifi.json

  1. 每個測試重複三次,記錄完成時間及相關執行指標
  2. 對於ES的效能資料收集採用kibana中自帶的monitoring模組監控對應的index
  3. 對於作業系統的效能資料收集採用metricbeat,然後採用其自帶的template在kibana中展現

3. 測試環境

3.1. 軟硬體環境

  1. 虛擬機器VMware® Workstation 10.0.1 build-1379776
  2. Ubuntu 16.04.1 LTS Linux version 4.4.0-59-generic
  3. 2 CPU/10G MEM
  4. ELK 6.2.2 + xpack + 2 nodes
  5. Apache Nifi 1.5.0
  6. SDC 3.1.0.0

3.2. 資料準備

1、測試所用Apache日誌資料來源於 http://www.secrepo.com

詳見:

https://github.com/zhan-yl/ELK-inputprocess-test/tree/master/log_tools

使用方式:

python3 download_data.py –start_date 2018-03-15 –output_folder ./data

將下載的日誌資料整合到一個日誌檔案中:

-rw-rw-r– 1 zhanyl zhanyl 169984631 3月 16 11:45 access.log

也可以使用日誌生成器來生成資料:

https://github.com/kiritbasu/Fake-Apache-Log-Generator

2、測試所用Twitter資料來源於Twitter官網,通過Python指令碼下載

詳見:

https://github.com/zhan-yl/ELK-inputprocess-test/tree/master/log_tools

使用方式:

python2.7 tweet.py @realDonaldTrump

python2.7 tweet.py @BBCWorld

python2.7 tweet.py @BBCBreaking

python2.7 tweet.py @TIME

python2.7 tweet.py @PDChina

python2.7 tweet.py @CNN

python2.7 tweet.py @CBSNews

python2.7 tweet.py @ elastic

python2.7 tweet.py @golang

python2.7 tweet.py @Docker

python2.7 tweet.py @streamsets

生成的日誌檔案為:

-rw-rw-r– 1 zhanyl zhanyl 277508582 4月 2 10:11 tweet.json

-rw-rw-r– 1 zhanyl zhanyl 277561344 4月 2 15:56 tweet.nifi.json

3.3. 環境配置

3.3.1. Apache日誌測試

3.3.1.1. Filebeat+ingest node

  1. 建立ingest的pipeline

詳見:

https://github.com/zhan-yl/ELK-inputprocess-test/tree/master/ingest_filebeat_config

匯入:

curl -XPUT -H ‘Content-Type: application/json’ ‘lzyl1:9200/_ingest/pipeline/secrepo_pipeline?pretty’ -d @secrepo_pipeline.json -u elastic:zylelk

檢查:

curl -XGET “http://lzyl1:9200/_ingest/pipeline?pretty&filter_path=secrepo_pipeline” -u elastic:zylelk

  1. Filebeat配置檔案

詳見:

https://github.com/zhan-yl/ELK-inputprocess-test/tree/master/ingest_filebeat_config

3.3.1.2. Logstash

1、 建立配置檔案

詳見:

https://github.com/zhan-yl/ELK-inputprocess-test/tree/master/logstash_config

3.3.1.3. Apache nifi

1、 匯入template

詳見:

https://github.com/zhan-yl/ELK-inputprocess-test/tree/master/nifi_config

2、 說明

爲了避免OutOfMemoryError和同時開啟大量的檔案,在流程裏面採用了多個split text串聯的方式予以解決。

同時在流程中未加入對於geo的地址解析。

在NIFI中對於Java heap和檔案控制代碼的使用是一個需要謹慎處理的問題。

3.3.1.4. SDC

1、 匯入pipeline

詳見:

https://github.com/zhan-yl/ELK-inputprocess-test/tree/master/sdc_config

3.3.2. Twitter日誌測試

3.3.2.1. Filebaet+ingest node

由於對資料的加工處理較為複雜,不對該型別進行測試

3.3.2.2. Logstash

雖然可以通過filter plugin進行相關類似的操作,但由於操作複雜、除錯困難,不對該型別進行測試

3.3.2.3. Apache nifi

1. 匯入template

詳見:

https://github.com/zhan-yl/ELK-inputprocess-test/tree/master/nifi_config

2. 說明

由於下載的Twitter資料非標準json格式,因此在測試之前使用sed首先將其轉換為標準json array資料,便於資料分割。

同時在流程中未加入對於geo的地址解析。

3.3.2.3. SDC

1. 匯入pipeline

詳見:

https://github.com/zhan-yl/ELK-inputprocess-test/tree/master/sdc_config

4. 測試過程

4.1. Apache日誌測試

4.1.1. Filebeat+ingest node

4.1.1.1. 執行命令

初始化檔案資訊,便於重複執行

rm /var/lib/filebeat/registry

啟動:

/usr/share/filebeat/bin/filebeat -c /etc/filebeat/filebeat_secrepo.yml -path.home /usr/share/filebeat -path.config /etc/filebeat -path.data /var/lib/filebeat -path.logs /var/log/filebeat

4.1.1.2. 資料監控

1、 資料總量

897123

2、 完成時間

開始時間

結束時間

耗時(單位:分鐘)

1

10:20

10:40

20

2

10:45

11:03

18

3

11:05

11:24

19

3、 效能圖表

a) ES效能

b) 作業系統效能

c) ES資料樣本

{
  "_index": "ingest-pipeline",
  "_type": "doc",
  "_id": "5AZoLmIBmeYOsZrYcv72",
  "_version": 1,
  "_score": null,
  "_source": {
    "request": "/twitter-icon.png",
    "geoip": {
      "continent_name": "Asia",
      "city_name": "Attock",
      "country_iso_code": "PK",
      "region_name": "Punjab",
      "location": {
        "lon": 72.3873,
        "lat": 33.5937
      }
    },
    "offset": 8706062,
    "auth": "-",
    "ident": "-",
    "verb": "GET",
    "source": "/home/zhanyl/examples-master/Graph/apache_logs_security_analysis/data/access.log",
    "message": "103.255.6.250 - - [09/Mar/2018:02:24:56 -0800] "GET /twitter-icon.png HTTP/1.1" 200 27787 "http://www.secrepo.com/" "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:58.0) Gecko/20100101 Firefox/58.0" ",
    "referrer": ""http://www.secrepo.com/"",
    "@timestamp": "2018-03-09T10:24:56.000Z",
    "response": "200",
    "bytes": "27787",
    "clientip": "103.255.6.250",
    "beat": {
      "hostname": "zylxpack",
      "name": "zylxpack",
      "version": "6.2.2"
    },
    "httpversion": "1.1",
    "user_agent": {
      "major": "58",
      "minor": "0",
      "os": "Ubuntu",
      "name": "Firefox",
      "os_name": "Ubuntu",
      "device": "Other"
    }
  },
  "fields": {
    "@timestamp": [
      "2018-03-09T10:24:56.000Z"
    ]
  },
  "sort": [
    1520591096000
  ]
}

4.1.2. Logstash

4.1.2.1. 執行命令

初始化檔案資訊,便於重複執行:

rm /data/logstash/.sincedb

啟動:

/usr/share/logstash/bin/logstash -f /home/zhanyl/examples-master/Graph/apache_logs_security_analysis/logstash/secrepo_logstash.conf –path.settings=/etc/logstash –path.data /data/logstash

4.1.2.2. 資料監控

1、 資料總量

897123

2、 完成時間

開始時間

結束時間

耗時(單位:分鐘)

1

13:43

13:54

11

2

14:00

14:11

11

3

14:13

14:24

11

3、 效能圖表

a) ES效能

b) 作業系統效能

c) ES資料樣本

{
  "_index": "secrepo-logstash",
  "_type": "doc",
  "_id": "vVswKGIBmeYOsZrYlb8C",
  "_version": 1,
  "_score": null,
  "_source": {
    "geoip": {
      "city_name": "Islamabad",
      "continent_code": "AS",
      "timezone": "Asia/Karachi",
      "longitude": 73.0113,
      "latitude": 33.6957,
      "country_name": "Pakistan",
      "region_code": "IS",
      "ip": "103.255.6.250",
      "postal_code": "44000",
      "country_code2": "PK",
      "region_name": "Islamabad Capital Territory",
      "country_code3": "PK",
      "location": {
        "lon": 73.0113,
        "lat": 33.6957
      }
    },
    "os_name": "Ubuntu",
    "device": "Other",
    "message": "103.255.6.250 - - [09/Mar/2018:02:24:56 -0800] "GET /twitter-icon.png HTTP/1.1" 200 27787 "http://www.secrepo.com/" "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:58.0) Gecko/20100101 Firefox/58.0" ",
    "path": "/home/zhanyl/examples-master/Graph/apache_logs_security_analysis/data/access.log",
    "major": "58",
    "@timestamp": "2018-03-09T10:24:56.000Z",
    "referrer": ""http://www.secrepo.com/"",
    "clientip": "103.255.6.250",
    "verb": "GET",
    "minor": "0",
    "os": "Ubuntu",
    "request": "/twitter-icon.png",
    "@version": "1",
    "host": "zylxpack",
    "build": "",
    "ident": "-",
    "auth": "-",
    "response": "200",
    "httpversion": "1.1",
    "bytes": "27787",
    "name": "Firefox"
  },
  "fields": {
    "@timestamp": [
      "2018-03-09T10:24:56.000Z"
    ]
  },
  "sort": [
    1520591096000
  ]
}

4.1.3. Apache nifi

4.1.3.1. 執行命令

初始化檔案資訊,便於重複執行:

啟動:

選中相關的process,然後點選run

4.1.3.2. 資料監控

1、 資料總量

897123

2、 完成時間

開始時間

結束時間

耗時(單位:分鐘)

1

14:08

14:34

26

2

14:38

15:07

29

3

15:08

15:37

29

3、 效能圖表

a) ES效能

b) 作業系統效能

c) ES資料樣本

{
  "_index": "nifi",
  "_type": "nifi",
  "_id": "C5XrLGIBmeYOsZrYiU7w",
  "_version": 1,
  "_score": null,
  "_source": {
    "clientip": "103.255.6.250",
    "ident": "-",
    "auth": "-",
    "verb": "GET",
    "request": "/twitter-icon.png",
    "httpversion": "1.1",
    "rawrequest": null,
    "response": 200,
    "bytes": 27787,
    "referrer": "http://www.secrepo.com/",
    "agent": "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:58.0) Gecko/20100101 Firefox/58.0",
    "@timestamp": "2018-03-09T10:24:56.000Z"
  },
  "fields": {
    "@timestamp": [
      "2018-03-09T10:24:56.000Z"
    ]
  },
  "sort": [
    1520591096000
  ]
}

4.1.4. SDC

4.1.4.1. 執行命令

建立mapping。

注:如果@timestamp給出的是標準的timestamp字串而不是timestamp型別則可以不建mapping,可以動態生成

PUT /sdc

{

“mappings”: {

“sdc”: {

“properties”: {

“@timestamp”: {

“type”: “date”

},

“geo”: {

“type”: “geo_point”

},

“city”: {

“type”: “text”,

“index”: false

}

}

}

}

}

初始化檔案資訊,便於重複執行:

啟動:

4.1.4.2. 資料監控

1、 資料總量

897070

缺少的53條記錄是由於無法解析其地理位置而導致失敗,如:

clientip :193.200.150.82

clientip :193.200.150.152

Address ‘91.197.234.102’

Address ‘103.234.188.37’

2、 完成時間

開始時間

結束時間

耗時(單位:分鐘)

1

16:13

16:29

16

2

16:32

16:43

11

3

16:45

16:59

14

在第三次測試中出現exception,但並未中斷處理

詳見:

https://github.com/zhan-yl/ELK-inputprocess-test/tree/master/sdc_exception

3、 效能圖表

a) ES效能

b) 作業系統效能

c) ES資料樣本

{
  "_index": "sdc",
  "_type": "sdc",
  "_id": "Wur8LWIBmeYOsZrYnL-S",
  "_version": 1,
  "_score": null,
  "_source": {
    "request": "/twitter-icon.png",
    "agent": ""Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:58.0) Gecko/20100101 Firefox/58.0"",
    "auth": "-",
    "ident": "-",
    "verb": "GET",
    "referrer": ""http://www.secrepo.com/"",
    "response": 200,
    "bytes": 27787,
    "clientip": "103.255.6.250",
    "httpversion": "1.1",
    "rawrequest": null,
    "geo": {
      "lat": 33.6957,
      "lon": 73.0113
    },
    "@timestamp": 1520591096000,
    "city": "Islamabad"
  },
  "fields": {
    "@timestamp": [
      "2018-03-09T10:24:56.000Z"
    ]
  },
  "sort": [
    1520591096000
  ]
}

4.2. Twitter日誌測試

4.2.1. Apache nifi

4.2.1.1. 執行命令

初始化檔案資訊,便於重複執行:

啟動

選中相關的process,然後點選run

4.2.1.2. 資料監控

1、 資料總量

52759

2、 完成時間

開始時間

結束時間

耗時(單位:分鐘)

1

20:12

20:17

5

2

20:18

20:22

4

3

20:23

20:27

4

3、 效能圖表

a) ES效能

b) 作業系統效能

c) ES資料樣本

{
  "_index": "twitter-nifi",
  "_type": "doc",
  "_id": "u7NThmIBROKaR930KYYi",
  "_version": 1,
  "_score": null,
  "_source": {
    "geo": null,
    "id": 980626639842357200,
    "id_str": "980626639842357249",
    "lang": "en",
    "user_mentions": [],
    "favorite_count": 23,
    "favorited": false,
    "retweet_count": 25,
    "text": "Cops: Man arrested with weapons cache, bump stock claimed secret government mission https://t.co/XaHdZOmV8z https://t.co/N3ca4nAUSv",
    "user": {
      "contributors_enabled": false,
      "created_at": "Thu Jun 05 00:54:31 +0000 2008",
      "default_profile": false,
      "default_profile_image": false,
      "description": "Your source for original reporting and trusted news.",
      "entities": {
        "description": {
          "urls": []
        },
        "url": {
          "urls": [
            {
              "display_url": "CBSNews.com",
              "expanded_url": "http://CBSNews.com",
              "indices": [
                0,
                23
              ],
              "url": "https://t.co/VGut7r2Vg5"
            }
          ]
        }
      },
      "favourites_count": 270,
      "follow_request_sent": false,
      "followers_count": 6490476,
      "following": false,
      "friends_count": 431,
      "geo_enabled": false,
      "has_extended_profile": false,
      "id": 15012486,
      "id_str": "15012486",
      "is_translation_enabled": true,
      "is_translator": false,
      "lang": "en",
      "listed_count": 47812,
      "location": "New York, NY",
      "name": "CBS News",
      "notifications": false,
      "profile_background_color": "D9DADA",
      "profile_background_image_url": "http://pbs.twimg.com/profile_background_images/736106551/37bf1f784305fe4a9c7e9105772c6e1a.jpeg",
      "profile_background_image_url_https": "https://pbs.twimg.com/profile_background_images/736106551/37bf1f784305fe4a9c7e9105772c6e1a.jpeg",
      "profile_background_tile": false,
      "profile_banner_url": "https://pbs.twimg.com/profile_banners/15012486/1519827973",
      "profile_image_url": "http://pbs.twimg.com/profile_images/645966750941626368/d0Q4voGK_normal.jpg",
      "profile_image_url_https": "https://pbs.twimg.com/profile_images/645966750941626368/d0Q4voGK_normal.jpg",
      "profile_link_color": "B12124",
      "profile_sidebar_border_color": "FFFFFF",
      "profile_sidebar_fill_color": "EAEDF0",
      "profile_text_color": "000000",
      "profile_use_background_image": true,
      "protected": false,
      "screen_name": "CBSNews",
      "statuses_count": 168688,
      "time_zone": "Eastern Time (US & Canada)",
      "translator_type": "none",
      "url": "https://t.co/VGut7r2Vg5",
      "utc_offset": -14400,
      "verified": true
    },
    "created_at": "Mon Apr 02 02:03:04 +0000 2018",
    "place": null,
    "total_count": 48,
    "@timestamp": "2018-04-02T02:03:04.000Z"
  },
  "fields": {
    "@timestamp": [
      "2018-04-02T02:03:04.000Z"
    ]
  },
  "sort": [
    1522634584000
  ]
}

4.2.2. SDC

4.2.2.1. 執行命令

初始化檔案資訊,便於重複執行:

啟動:

4.2.2.2. 資料監控

1、 資料總量

52759

2、 完成時間

開始時間

結束時間

耗時(單位:分鐘)

1

21:00

21:05

5

2

21:06

21:12

6

3

21:13

21:18

5

3、 效能圖表

d) ES效能

e) 作業系統效能

f) ES資料樣本

{
  "_index": "twitter-sdc",
  "_type": "doc",
  "_id": "VbVuhmIBROKaR930GV0_",
  "_version": 1,
  "_score": null,
  "_source": {
    "created_at": "Mon Apr 02 02:03:04 +0000 2018",
    "entities": {
      "user_mentions": []
    },
    "favorite_count": 23,
    "favorited": false,
    "geo": null,
    "id": 980626639842357200,
    "id_str": "980626639842357249",
    "lang": "en",
    "place": null,
    "retweet_count": 25,
    "text": "Cops: Man arrested with weapons cache, bump stock claimed secret government mission https://t.co/XaHdZOmV8z https://t.co/N3ca4nAUSv",
    "user": {
      "description": "Your source for original reporting and trusted news.",
      "favourites_count": 270,
      "followers_count": 6490476,
      "friends_count": 431,
      "id": 15012486,
      "location": "New York, NY",
      "name": "CBS News"
    },
    "@timestamp": "2018-04-02T10:03:04.000+08",
    "lat": null,
    "lon": null,
    "total_count": 48
  },
  "fields": {
    "@timestamp": [
      "2018-04-02T02:03:04.000Z"
    ]
  },
  "sort": [
    1522634584000
  ]
}

5. 測試結果分析

5.1. 資料結果

在最終資料進入ES以後,雖然記錄數相等,但是資料的大小存在差異,所記錄的內容也存在差異,這也是導致執行時間存在差異的原因

5.2. 對比

5.2.1. Filebeat+ingest node

1、 優點

a) 比較輕量級,對系統資源消耗較少

b) Ingest node內建於ES叢集內部,無需額外部署

c) 通過簡單的json語句即可實現pipeline處理

2、 缺點

a) 所支援的功能有限,僅能對簡單資料進行處理。能夠處理的功能集,現階段僅為logstash的子集

b) Ingest node本身不具備自主pull資料的功能,需要其他工具將資料寫入。如果部署在kafka後端,則必須部署能夠配合其資料寫入的工具

c) 不支援視覺化

5.2.2. Logstash

1、 優點

a) 有豐富的plugin進行各種資料加工、處理

b) 有大量的介面支援,技術較為成熟

2、 缺點

a) 開發、除錯、跟蹤困難,無法視覺化呈現

b) 對於較為複雜的數據結構處理較難實現,會依賴於巢狀ruby來處理

c) 無法進行視覺化監控發現效能瓶頸,新的kibana pipeline在一定程度上緩解該問題

5.2.3. Apache nifi

1、 優點

a) 可圖形化編輯、監控整個處理流程

b) 可進行單步除錯,在上一個處理環節得出正確結果以後再進入下一個處理環節。可以通過Data Provenance追蹤資料的完整處理過程。

c) 對資料有back pressure機制

d) 在執行過程中可隨時修改流程中的各個處理環節,調整資源使用量而不必中斷整個流程

e) 有豐富的介面及數據處理機制(expression language),資料型別轉換機制

f) 擁有rest介面,通過該介面可進行進一步應用開發

g) 由於使用檔案作為載體,對所處理資料的大小基本無限制

h) 對於大數據結構、批量數據處理具有一定優勢

2、 缺點

a) 由於使用檔案,檔案需要落地並頻繁地開啟、關閉,效能較低,需要依靠較高效能的磁碟裝置

b) 同時對於記憶體的消耗較大,由其是生成大量attribute的情況下。極易造成OOM。

c) 對於能夠同時開啟檔案的個數要求也較嚴格,需要設定較高的fileno

5.2.4. SDC

1、 優點

a) 視覺化處理、對各環節都有監控指標展現

b) 可預覽數據處理過程、檢查數據處理結果

c) 擁有多種處理process和package,可形成複雜的處理pipeline,可使用expression language、groovy、JavaScript、jyphon等

d) 擁有rest介面,直接呼叫,也通過該介面可進行進一步應用開發

e) 自帶異常告警機制

f) 由於在記憶體中按照批量進行處理,因此處理效能較高

g) 對於小數據結構、實時數據處理具有一定優勢

2、 缺點

a) 由於在記憶體中進行數據處理,為避免OOM,對處理的event大小有限制,其buffer大小限制為1048576位元組,超出部分將會被截斷

b) 不能進行單步呼叫除錯,無法在pipeline執行過程中干預其處理

作者介紹

詹玉林 ,中國民生銀行系統管理中心大資料工程師,曾作為研發工程師開發過銀行核心系統,IBM資料庫支援工程師,現關注於大資料的實時解決方案。

如有侵權請來信告知:酷播亮新聞 » 海量日誌架構中的後端數據處理技術對比