對比Elasticsearch,使用Doris進行高效日誌分析(下)

大資料技術前線發表於2023-12-04


來源:Java學研大本營

介紹對比使用Elasticsearch和Apache Doris進行日誌分析。

3 使用案例中的效能表現

一家遊戲公司已經從ELK技術棧轉向了Apache Doris解決方案。他們基於Doris的日誌系統所需的儲存空間只有之前的1/6。

一家網路安全公司利用Apache Doris中的倒排索引構建了他們的日誌分析系統,支援每秒寫入30萬行資料,僅使用以前所需的1/5伺服器資源。

4 實踐指南

現在按照以下三個步驟來構建一個基於Apache Doris的日誌分析系統。

在開始之前,從官方網站下載Apache Doris 2.0或更新版本,並部署叢集。

4.1 步驟1:建立表格

這是一個表格建立的示例。

對配置的解釋:

  • 將DATETIMEV2時間欄位指定為鍵,以加快對最新N條日誌記錄的查詢速度。

  • 為頻繁訪問的欄位建立索引,並使用解析器引數指定需要進行全文搜尋的欄位。

  • "PARTITION BY RANGE"意味著根據時間欄位將資料按範圍進行分割槽,啟用動態分割槽以進行自動管理。

  • "DISTRIBUTED BY RANDOM BUCKETS AUTO"意味著將資料隨機分佈到桶中,系統會根據叢集大小和資料量自動決定桶的數量。

  • "log_policy_1day"和"log_s3"意味著將超過1天的日誌移動到S3儲存。

CREATE DATABASE log_db;
USE log_db;

CREATE RESOURCE "log_s3"
PROPERTIES
(
   "type" = "s3",
   "s3.endpoint" = "your_endpoint_url",
   "s3.region" = "your_region",
   "s3.bucket" = "your_bucket",
   "s3.root.path" = "your_path",
   "s3.access_key" = "your_ak",
   "s3.secret_key" = "your_sk"
);

CREATE STORAGE POLICY log_policy_1day
PROPERTIES(
   "storage_resource" = "log_s3",
   "cooldown_ttl" = "86400"
)
;

CREATE TABLE log_table
(
 ``ts` DATETIMEV2,
 ``clientip` VARCHAR(20)
,
 ``request` TEXT,
 ``status` INT,
 ``size` INT,
 INDEX idx_size (`size`) USING INVERTED,
 INDEX idx_status (`status`) USING INVERTED,
 INDEX idx_clientip (`clientip`) USING INVERTED,
 INDEX idx_request (`request`) USING INVERTED PROPERTIES("parser" = "english")
)
ENGINE 
OLAP
DUPLICATE KEY(`ts`)
PARTITION BY RANGE(`ts`) ()
DISTRIBUTED BY RANDOM BUCKETS AUTO
PROPERTIES (
"replication_num" = "1",
"storage_policy" = "log_policy_1day",
"deprecated_dynamic_schema" = "true",
"dynamic_partition.enable" = "true",
"dynamic_partition.time_unit" = "DAY",
"dynamic_partition.start" = "-3",
"dynamic_partition.end" = "7",
"dynamic_partition.prefix" = "p",
"dynamic_partition.buckets" = "AUTO",
"dynamic_partition.replication_num" = "1"
)
;

4.2 步驟2:匯入日誌

Apache Doris支援多種資料匯入方法。對於實時日誌,推薦以下三種方法:

  • 從Kafka訊息佇列中拉取日誌:Routine Load

  • Logstash:透過HTTP API將日誌寫入Doris

  • 自定義編寫程式:透過HTTP API將日誌寫入Doris

使用Kafka進行資料攝取

對於寫入Kafka訊息佇列的JSON日誌,建立常規載入(Routine Load),以便Doris從Kafka中拉取資料。以下是示例。property.* 配置為可選配置:

-- 準備Kafka叢集和主題("log_topic"

-- 建立常規載入,從Kafka的 log_topic 載入資料到 "log_table"
CREATE ROUTINE LOAD load_log_kafka ON log_db.log_table
COLUMNS(ts, clientip, request, status, size)
PROPERTIES (
   "max_batch_interval" = "10",
   "max_batch_rows" = "1000000",
   "max_batch_size" = "109715200",
   "strict_mode" = "false",
   "format" = "json"
)

FROM KAFKA (
   "kafka_broker_list" = "host:port",
   "kafka_topic" = "log_topic",
   "property.group.id" = "your_group_id",
   "property.security.protocol"="SASL_PLAINTEXT",     
   "property.sasl.mechanism"="GSSAPI",     
   "property.sasl.kerberos.service.name"="kafka",     
   "property.sasl.kerberos.keytab"="/path/to/xxx.keytab",     
   "property.sasl.kerberos.principal"="xxx@yyy.com"
)
;

可以透過SHOW ROUTINE LOAD命令檢視常規載入的執行情況。

透過Logstash進行資料匯入

配置Logstash的HTTP輸出,然後透過HTTP Stream Load將資料傳送到Doris。

1) 在logstash.yml中指定批次大小和批次延遲,以提高資料寫入效能。

pipeline.batch.size: 100000
pipeline.batch.delay: 10000

2) 在日誌收集配置檔案testlog.conf中新增HTTP輸出,URL為Doris中的Stream Load地址。

  • 由於Logstash不支援HTTP重定向,應該使用後端地址而不是FE地址。

  • 頭部中的授權是http basic auth,使用echo -n 'username:password' | base64進行計算。

  • 頭部中的load_to_single_tablet可以減少資料攝取中的小檔案數量。

output {
  http {
      follow_redirects => true
      keepalive => false
      http_method => "put"
      url => "
      headers => [
          "format""json",
          "strip_outer_array""true",
          "load_to_single_tablet""true",
          "Authorization""Basic cm9vdDo=",
          "Expect""100-continue"
      ]
      format => "json_batch"
  }
}

透過自定義程式進行資料攝取

以下是透過HTTP Stream Load將資料攝取到Doris的示例。

注意:

  • 使用basic auth進行HTTP授權,使用 echo -n 'username:password' | base64 進行計算。

  • http header "format:json":指定資料型別為JSON。

  • http header "read_json_by_line:true":每行都是一個JSON記錄。

  • http header "load_to_single_tablet:true":每次寫入一個分片(tablet)。

  • 對於資料寫入客戶端,建議批次大小為100MB~1GB。未來的版本將在伺服器端啟用Group Commit,並減小客戶端的批次大小。

curl \
--location-trusted \
-u username:password \
-H "format:json" \
-H "read_json_by_line:true" \
-H "load_to_single_tablet:true" \
-T logfile.json \
http://fe_host:fe_http_port/api/log_db/log_table/_stream_load

4.3 步驟3:執行查詢

Apache Doris支援標準SQL,因此可以透過MySQL客戶端或JDBC連線到Doris,然後執行SQL查詢。

mysql -h fe_host -P fe_mysql_port -u root -Dlog_db

一些常見的日誌分析查詢:

  • 檢查最新的10條記錄。
SELECT * FROM log_table ORDER BY ts DESC LIMIT 10;
  • 檢查Client IP為"8.8.8.8"的最新的10條記錄。
SELECT * FROM log_table WHERE clientip = '8.8.8.8' ORDER BY ts DESC LIMIT 10;
  • 檢索在"request"欄位中包含"error"或"404"的最新的10條記錄。MATCH_ANY是Doris中的透過全文搜尋來查詢包含指定關鍵詞中任意一個的記錄。
SELECT * FROM log_table WHERE request MATCH_ANY 'error 404' ORDER BY ts DESC LIMIT 10;
  • 檢索在"request"欄位中同時包含"image"和"faq"的最新的10條記錄。MATCH_ALL也是Doris中的全文搜尋語法關鍵詞,表示查詢同時包含所有指定關鍵詞的記錄。
SELECT * FROM log_table WHERE request MATCH_ALL 'image faq' ORDER BY ts DESC LIMIT 10;

5 總結

如果需要一種高效的日誌分析解決方案,Apache Doris是非常友好的選擇,尤其適合那些具備SQL知識的讀者。相比ELK堆疊,使用Apache Doris可以獲得更好的無模式支援,實現更快的資料寫入和查詢,並且減少儲存負擔。


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

相關文章