本文介紹瞭如何使用SeaTunnel將資料從InfluxDB同步到Doris。透過SeaTunnel強大的資料整合功能,使用者可以高效地將儲存於InfluxDB中的時間序列資料傳輸至Doris,便於資料的訪問與分析。
版本資訊:
SeaTunnel 2.3.3
InfluxDB 2.7.6
Doris 2.1.3 rc09
準備事項
SeaTunnel2.3.3的安裝過程這裡就省略了,可以參考官網文件。
SeaTunnel2.3.3安裝好以後需要刪掉兩個連線用的jar包,不然後面同步資料庫會報錯:connector-hudi-2.3.3.jar
和connector-datahub-2.3.3.jar
.
需要增加的jar包:seatunnel-api-2.3.3.jar
,seatunnel-transforms-v2-2.3.3.jar
,mysql-connector-java-8.0.28.jar
,jersey-client-1.19.4.jar
,這四個jar包必須新增,不然無法同步資料執行同步指令碼直接報錯沒有某個類。
InfluxDB 2.7.6 需要做的前提事項:下面這個步驟必須要做,不然查不到資料,
InfluxDB Studio-0.2.0(這個客戶端工具有個好處,可以檢視欄位型別,方便同步檔案中的欄位型別的定義,其他的客戶端好像沒有,也有可能是我沒發現),可下載這個客戶端進行連線查詢資料。
Linux安裝influxDB 2.7.6版本後,正常使用ip:8086 可訪問influxdb UI,填寫使用者名稱、密碼、org、buckets。
同步過程及踩坑點
SeaTunnel 2.3中整合InfluxDB配置使用者名稱、密碼後,執行同步任務總是報獲取欄位異常資訊。
於是乎跟蹤SeaTunnel程式碼,發現內部一直401許可權認證失敗。於是使用InfluxDB Studio資料庫管理工具連線,輸入ui頁面相同的使用者名稱,密碼後一直報401許可權認證不透過。透過查資料發現ui頁面的使用者名稱密碼僅供ui頁面使用,不能作為資料庫本身訪問的使用者名稱密碼。
使用iInfluxDB client客戶端,查詢許可權influx v1 auth list結果為空。
使用命令分配許可權
influx v1 auth create -o orgName --read-bucket bucketId --username=username
,
或者:influx v1 auth create -o "組織名稱" --write-bucket bucketId(桶id,不需要引號) --read-bucket bucketId(桶id,不需要引號) --username=賬號 --password=密碼
刪除命令:influx v1 auth delete --id 'id編碼'
刪除命令中的id編碼為influx v1 auth list
命令查出來的ID,下圖所示:
命令執行完成後需輸入兩次密碼。InfluxDB Studio資料庫管理工具再次使用此使用者名稱密碼登入成功,SeaTunnel同步成功。
同步資料配置檔案:v1.batch.config_tmp.template:
env {
execution.parallelism = 1
job.mode = "BATCH"
checkpoint.interval = 10000
}
source {
influxdb {
url = "http://X.X.X.X:8086"
token = "寫自己的token" #可有可無
org = "自己的組織名稱"
bucket = "自己的桶" #可有可無
database = "自己的桶"
username = "寫在第四步自己新建的influxdb賬號"
password = "寫在第四步自己新建的influxdb密碼"
epoch = "H" #這個有好幾級,可以去官網檢視
query_timeout_sec = 600
measurement = "prometheus_remote_write" #資料表
fields = ["node_cpu_seconds_total", "node_memory_MemTotal_bytes"] #可有可無,配置自己的欄位
sql = """SELECT node_cpu_seconds_total as system_cpu_usage,cpu as process_occupy_physical_memory_size,job as create_dept,node_memory_MemTotal_bytes as process_read_written_file_system_total_bytes,node_memory_MemAvailable_bytes as process_open_file_describe_quantity,time as create_time FROM "prometheus_remote_write" where time > now() - 1h"""
where = " where time > now() - 1h"
#經過本人測試。上面的sql查詢的欄位必須經過重新命名,或者doris建表的欄位必須和influxdb2的欄位完全一致,不然transform 中進行轉換的時候就會成為空值,這個我還沒研究明白為什麼,研究明白了在補上說明,doris的表欄位型別也必須和influxdb2中查詢的欄位型別一致,不然資料存不到doris中。schema 重定義的事influxdb2查到的欄位和型別
schema {
fields {
#node_cpu_seconds_total = FLOAT
system_cpu_usage = FLOAT
process_occupy_physical_memory_size = INT
create_dept = STRING
process_read_written_file_system_total_bytes = FLOAT
process_open_file_describe_quantity = FLOAT
create_time = BIGINT
}
}
}
}
sink {
Doris {
fenodes = "X.X.X.X:8030"
username = "賬號"
password = "密碼"
table.identifier = "sbyw_data_acquisition.sbyw_application_process_type_tmp"
sink.label-prefix = "test-cdc"
sink.enable-2pc = "true"
sink.enable-delete = "true"
sink.max-retries = 3
batch_size = 10000
result_table_name = "sbyw_application_process_type_tmp"
doris.config {
format = "json"
read_json_by_line = "true"
}
}
}
transform {
FieldMapper {
source_table_name = "prometheus_remote_write"
result_table_name = "sbyw_application_process_type_tmp"
field_mapper = {
#node_cpu_seconds_total = system_cpu_usage
system_cpu_usage = system_cpu_usage
process_occupy_physical_memory_size = process_occupy_physical_memory_size
process_read_written_file_system_total_bytes = process_read_written_file_system_total_bytes
process_open_file_describe_quantity = process_open_file_describe_quantity
create_time = create_time
create_dept = create_dept
}
}
}
寫好同步資料指令碼檔案執行同步命令:./bin/seatunnel.sh -c ./config/v1.batch.config_tmp.template
下面是我Doris的測試表:
下面是InfluxDB Studio-0.2.0客戶端查到 InfluxDB 2.7.6的資料:
InfluxDB 2.7.6有個坑點,它支援sql查詢,但不完全支援,它只支援常規的簡單查詢,例如下圖中的查詢就可以查詢,但是如下圖所示,可能會有人說我後面沒加group by,經過測試是不行的,即使加上group by也是無法執行,那是因為官方壓根不支援的這種查詢。
但是下圖這樣是可以的,InfluxDB 2官方就是這樣設計的,聚合查詢無法和單欄位進行同步查詢。
最後是執行結果:
同步到Doris的資料:
原文連結:https://blog.csdn.net/2401_84562349/article/details/140919192
本文由 白鯨開源 提供釋出支援!