Elasticsearch 8.X 如何生成 TB 級的測試資料 ?

大資料技術前線發表於2023-11-07

來源:銘毅天下Elasticsearch

1、實戰問題

  • 我只想插入大量的測試資料,不是想測試效能,有沒有自動辦法生成TB級別的測試資料?
  • 有工具?還是說有測試資料集之類的東西?
    ——問題來源於 Elasticsearch 中文社群

2、問題解析

其實類似的問題之前在社群也經常被問到。實戰業務場景中在沒有大規模資料之前,可能會構造生成一些模擬資料,以實現效能測試等用途。

真實業務場景一般不愁資料的,包含但不限於:

  • 生成資料
  • 業務系統產生資料
  • 網際網路、裝置等採集生成的資料
  • 其他產生資料的場景.....

迴歸問題,Elasticsearch 8.X 如何構造呢?

社群達人死敵wen大佬給出的方案:兩個 sample data的index來回reindex,一次運算元據量翻倍。

實際,死敵 wen 大佬指的是如下三部分的樣例資料。

Elasticsearch 8.X 如何生成 TB 級的測試資料 ?

那麼有沒有其他的解決方案呢?本文給出兩種方案。

Elasticsearch 8.X 如何生成 TB 級的測試資料 ?

3、方案一、elasticsearch-faker 構造資料

3.0 elasticsearch-faker 工具介紹

elasticsearch-faker 是一個用於為 Elasticsearch 生成虛假資料的命令列工具。

它透過模板來定義將要生成的資料結構,並在模板中使用佔位符來表示動態內容,比如隨機使用者名稱、數字、日期等。

這些佔位符將由 Faker 庫提供的隨機生成資料填充。執行時,該工具會根據指定的模板生成文件,並將它們上傳到 Elasticsearch 索引中,用於測試和開發,以檢驗 Elasticsearch 查詢和聚合的功能。

3.1 第一步:安裝工具集

pip install elasticsearch-faker
Elasticsearch 8.X 如何生成 TB 級的測試資料 ?

3.2 第二步:製作啟動指令碼 es_gen.sh

#!/bin/bash

# 設定環境變數
export ES_BASIC_AUTH_USER='elastic'
export ES_BASIC_AUTH_PASSWORD='psdXXXXX'
export ES_SSL_ASSERT_FINGERPRINT='XXddb83f3bc4f9bb763583d2b3XXX0401507fdfb2103e1d5d490b9e31a7f03XX'

# 呼叫 elasticsearch-faker 命令生成資料
elasticsearch-faker --verify-certs generate --doc-template doc_template.jinja2 

同時,編輯模版檔案 doc_template.jinja2。

模版如下所示:

{
  "name""{{ user_name }}",
  "userId": {{ random_number }},
  "createdAt""{{ date_time }}",
  "body""{{ text }}",
  "ext""{{ word }}",
  "blobId""{{ uuid4 }}"
}

3.3 第三步:執行指令碼 es_gen.sh

[root@VM-0-14-centos elasticsearch-faker]# ./es_gen.sh 
document generator #0: 100%|███████████████████████████████████████████████████████████████████████████████████████████| 1000/1000 [00:00<00:00, 1194.47docs/s]
[INFO] generate 1000 docs to test_index

[Results]
target index: test_index
completed in 10.6 secs
current store.size: 0.8 MB
current docs.count: 1,000
generated store.size: 0.8 MB
average size[byte]/doc: 831
generated docs.count: 1,000
generated docs/secs: 94.5
bulk size: 200
Elasticsearch 8.X 如何生成 TB 級的測試資料 ?

3.4 第4步:檢視匯入資料結果, kibana 檢視。

Elasticsearch 8.X 如何生成 TB 級的測試資料 ?
Elasticsearch 8.X 如何生成 TB 級的測試資料 ?
"hits": [
      {
        "_index""test_index",
        "_id""2ff2971b-bc51-44e6-bbf7-9881050d5b78-0",
        "_score": 1,
        "_source": {
          "name""smithlauren",
          "userId": 207,
          "createdAt""1982-06-14T03:47:00.000+0000",
          "body""Risk cup tax. Against growth possible something international our themselves. Pm owner card sell responsibility oil.",
          "ext""mean",
          "blobId""c4f5c8dc-3d97-44ee-93da-2d93be676b8b"
        }
      },
      {

4、使用 Logstash  generator 外掛生成隨機樣例資料

Elasticsearch 8.X 如何生成 TB 級的測試資料 ?

4.1 準備環境

確保你的環境中已經安裝了 Elasticsearch 8.X 和 Logstash 8.X。Elasticsearch 應該配置正確,並且執行在 HTTPS 上。

另外,確保 Elasticsearch 的相關證照已經正確配置在 Logstash 中。

4.2 生成樣例資料

我們將使用 Logstash 的 generator 輸入外掛來建立資料,並使用 ruby 過濾器外掛來生成 UUID 和隨機字串。

4.3 Logstash 配置

建立一個名為 logstash-random-data.conf 的配置檔案,並填入以下內容:

input {
  generator {
    lines => [
      '{"regist_id": "UUID", "company_name": "RANDOM_COMPANY", "regist_id_new": "RANDOM_NEW"}'
    ]
    count => 10
    codec => "json"
  }
}

filter {
  ruby {
    code => '
      require "securerandom"
      event.set("regist_id", SecureRandom.uuid)
      event.set("company_name", "COMPANY_" + SecureRandom.hex(10))
      event.set("regist_id_new", SecureRandom.hex(10))
    '

  }
}

output {
 elasticsearch {
    hosts => ["]
    index => "my_log_index"
    user => "elastic"
    password => "XXXX"
    ccacert => "/www/elasticsearch_0810/elasticsearch-8.10.2/config/certs/http_ca.crt"
  }
  stdout { codec => rubydebug }
}

4.4 分析配置檔案

  • 1.Input
  • a.generator 外掛用於生成事件流。
  • b.lines 包含一個 JSON 字串模板,它定義了每個事件的結構。
  • c.count 指定了要生成的文件數量。
  • d.codec 設定為 json 以告訴 Logstash 期望的輸入格式。
  • 2.Filter
  • a.ruby 過濾器用於執行 Ruby 程式碼。
  • b.程式碼片段內生成了一個 UUID 作為 regist_id。
  • c.company_name 和 regist_id_new 使用隨機十六進位制字串填充。
  • 3.Output
  • a.指定 Elasticsearch 的主機、索引、使用者認證資訊及證照。
  • b.stdout 輸出用於除錯,它會輸出 Logstash 處理後的事件。

4.5 執行 Logstash

將配置檔案儲存後,在終端執行以下命令以啟動 Logstash 並生成資料:

$ bin/logstash -f logstash-random-data.conf

執行結果如下:

Elasticsearch 8.X 如何生成 TB 級的測試資料 ?

kibana 檢視資料結果如下:

Elasticsearch 8.X 如何生成 TB 級的測試資料 ?

藉助 Logstash,我們可以輕鬆生成大量的隨機樣例資料,用於 Elasticsearch 的測試和開發。這種方法不僅高效,而且可以靈活地根據需求生成各種格式的資料。

5、小結

上述的驗證都是使用 Elasticsearch 8.10.2 版本驗證透過的。

其實除了文章給出的兩種方案外,還有很多其他的方案,比如:esrally 生成測試資料、藉助 Python 的 Faker 實現樣例資料構造,Common Crawl、Kaggle 等網站提供大型的公共資料集,可以作為測試資料的來源。

大家有沒有遇到類似問題,是如何實現的?歡迎留言交流。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/70027827/viewspace-2993278/,如需轉載,請註明出處,否則將追究法律責任。

相關文章