使用Apache SeaTunnel高效整合和管理SftpFile資料來源

ApacheSeaTunnel發表於2024-09-19

file

本文為Apache SeaTunnel已經支援的SftpFile Source Connector使用文件,旨在幫助讀者理解如何高效地使用SFTP檔案源聯結器,以便輕鬆地使用Apache SeaTunnel整合和管理您的SftpFil資料來源。

SftpFile 是指透過 SFTP(Secure File Transfer Protocol)協議進行檔案操作的物件或元件。在網路程式設計和資料整合中,SFTPFile 通常用來表示和操作儲存在遠端 SFTP 伺服器上的檔案。SFTP 是一種安全的檔案傳輸協議,基於 SSH(Secure Shell)協議,提供了加密的檔案傳輸和遠端檔案操作功能。

支援的引擎

Spark

Flink

SeaTunnel Zeta

主要特性

描述

從 SFTP 檔案伺服器讀取資料。

支援的資料來源資訊

使用 SftpFile 聯結器,需要以下依賴項。可以透過 install-plugin.sh 下載,也可以從 Maven 中央倉庫獲取。

資料來源 支援的版本 依賴項
SftpFile 通用 下載
  • 提示

如果你使用的是 Spark/Flink,請確保 Spark/Flink 叢集已經整合了 Hadoop。Hadoop 2.x 版本已透過測試。

如果使用 SeaTunnel 引擎,安裝 SeaTunnel 引擎時會自動整合 Hadoop JAR 包。可以在 ${SEATUNNEL_HOME}/lib 目錄下檢查這個 JAR 包是否存在。

為了支援更多的檔案型別,我們做了一些妥協,所以在內部訪問 Sftp 時我們使用了 HDFS 協議,這個聯結器需要一些 Hadoop 依賴項,且僅支援 Hadoop 版2.9.X+ 版本。

資料型別對映

檔案沒有特定的型別列表,我們可以透過在配置中指定模式來指示要將哪個 SeaTunnel 資料型別轉換為相應的資料。

SeaTunnel 資料型別
STRING
SHORT
INT
BIGINT
BOOLEAN
DOUBLE
DECIMAL
FLOAT
DATE
TIME
TIMESTAMP
BYTES
ARRAY
MAP

Source選項

名稱 型別 必填 預設值 描述
host 字串 - 目標 SFTP 主機地址
port 整數 - 目標 SFTP 埠號
user 字串 - 目標 SFTP 使用者名稱
password 字串 - 目標 SFTP 密碼
path 字串 - 原始檔路徑
file_format_type 字串 - 請檢視下文的 #file_format_type
file_filter_pattern 字串 - 用於檔案過濾的過濾器模式。
delimiter 字串 \001 欄位分隔符,用於告訴聯結器如何在讀取文字檔案時切割欄位。預設 \001,與 Hive 的預設分隔符相同。
parse_partition_from_path 布林型 true 控制是否從檔案路徑中解析分割槽鍵和值。
例如,如果從路徑中讀取檔案 oss://hadoop-cluster/tmp/seatunnel/parquet/name=tyrantlucifer/age=26
那麼檔案中的每條記錄將新增這兩個欄位:
name age
tyrantlucifer 26
提示:不要在模式選項中定義分割槽欄位
date_format 字串 yyyy-MM-dd 日期型別的格式,用於告訴聯結器如何將字串轉換為日期,支援以下格式:
yyyy-MM-dd yyyy.MM.dd yyyy/MM/dd,預設 yyyy-MM-dd
datetime_format 字串 yyyy-MM-dd HH:mm:ss 日期時間型別的格式,用於告訴聯結器如何將字串轉換為日期時間,支援以下格式:
yyyy-MM-dd HH:mm:ss yyyy.MM.dd HH:mm:ss yyyy/MM/dd HH:mm:ss yyyyMMddHHmmss,預設 yyyy-MM-dd HH:mm:ss
time_format 字串 HH:mm:ss 時間型別的格式,用於告訴聯結器如何將字串轉換為時間,支援以下格式:
HH:mm:ss HH:mm:ss.SSS,預設 HH:mm:ss
skip_header_row_number 長整型 0 跳過前幾行,僅對 txt 和 csv 檔案有效。
例如,設定如下:
skip_header_row_number = 2
那麼 SeaTunnel 將跳過原始檔的前兩行。
sheet_name 字串 - 讀取工作簿的工作表名稱,僅在檔案格式為 Excel 時使用。
schema 配置項 - 請檢視下文的 #schema
通用選項 - Source 外掛通用引數,請參考 Source通用選項 獲取詳細資訊。

file_format_type [字串]

支援以下檔案型別:
text csv parquet orc json excel
如果將檔案型別指定為 json,需要配置 Schema 模式選項,向聯結器說明如何解析資料為你需要所需的 Row。
例如:上游資料如下:

{"code":  200, "data":  "get success", "success":  true}

也可以將多個資料儲存在一個檔案中,並透過換行符進行分隔:

{"code":  200, "data":  "get success", "success":  true}
{"code":  300, "data":  "get failed", "success":  false}

需要按照以下方式配置 Schema:

schema {
    fields {
        code = int
        data = string
        success = boolean
    }
}

聯結器將生成以下資料:

code data success
200 獲取成功 true
如果將檔案型別指定為 parquetorc,則無需指定模式選項,聯結器可以自動查詢上游資料的模式。
如果將檔案型別指定為 textcsv,則可以選擇是否指定模式資訊或不指定。

例如,上游資料如下:

tyrantlucifer#26#male

如果不配置 Schema,Connector 將這樣處理上游資料:

如果分配資料模式,則除了 CSV 檔案型別外,還應分配選項 delimiter。

內容
tyrantlucifer#26#male
如果配置了資料 Schema,除了CSV檔案型別,還需要配置選項分隔符。

需要配置 Schema 和分隔符如下:

delimiter = "#"
schema {
    fields {
        name = string
        age = int
        gender = string 
    }
}

聯結器將生成以下資料:

姓名 年齡 性別
tyrantlucifer 26

Schema [配置項]

fields [配置項]
上游資料的 Schema。

如何建立 Sftp 資料同步任務

以下示例演示瞭如何建立一個資料同步任務,從 Sftp 讀取資料並在本地客戶端上列印出來:

# 設定要執行的任務的基本配置
env {
  execution.parallelism = 1
  job.mode = "BATCH"
}

# 建立連線到 Sftp 的源
source {
  SftpFile {
    host = "sftp"
    port = 22
    user = seatunnel
    password = pass
    path = "tmp/seatunnel/read/json"
    file_format_type = "json"
    result_table_name = "sftp"
    schema = {
      fields {
        c_map = "map<string, string>"
        c_array = "array<int>"
        c_string = string
        c_boolean = boolean
        c_tinyint = tinyint
        c_smallint = smallint
        c_int = int
        c_bigint = bigint
        c_float = float
        c_double = double
        c_bytes = bytes
        c_date = date
        c_decimal = "decimal(38, 18)"
        c_timestamp = timestamp
        c_row = {
          C_MAP = "map<string, string>"
          C_ARRAY = "array<int>"
          C_STRING = string
          C_BOOLEAN = boolean
          C_TINYINT = tinyint
          C_SMALLINT = smallint
          C_INT = int
          C_BIGINT = bigint
          C_FLOAT = float
          C_DOUBLE = double
          C_BYTES = bytes
          C_DATE = date
          C_DECIMAL = "decimal(38, 18)"
          C_TIMESTAMP = timestamp
        }
      }
    }
  }
}

# 控制檯列印讀取的 Sftp 資料
sink {
  Console {
    parallelism = 1
  }
}

本文由 白鯨開源 提供釋出支援!

相關文章