跳到主要内容
版本:Next

OssJindoFile

OssJindo file Sink 连接器

支持这些引擎

Spark
Flink
SeaTunnel Zeta

关键特性

  • 多模态

    使用二进制文件格式读取和写入任何格式的文件,例如视频、图片等。简而言之,任何文件都可以同步到目标位置。

  • 精确一次

    默认情况下,我们使用 2PC commit 来确保“精确一次”。

  • cdc

  • 支持多表写入

  • 定时刷新

  • 文件格式类型

    • text
    • csv
    • parquet
    • orc
    • json
    • excel
    • xml
    • binary
    • canal_json
    • debezium_json
    • maxwell_json

描述

使用 Jindo(阿里云 EMR)SDK 通过 HDFS 协议将数据写入阿里云 OSS 文件系统。

提示

您需要下载 jindosdk-4.6.1.tar.gz 然后解压缩,将 jindo-sdk-4.6.1.jarjindo-core-4.6.1.jarlib 复制到 ${SEATUNNEL_HOME}/lib

如果您使用 Spark/Flink,为了使用此连接器,您必须确保您的 Spark/Flink 集群已集成 Hadoop。测试的 Hadoop 版本是 2.x。

如果您使用 SeaTunnel Engine,当您下载并安装 SeaTunnel Engine 时会自动集成 Hadoop jar。您可以在 ${SEATUNNEL_HOME}/lib 下检查 jar 包以确认这一点。

我们为了支持更多的文件类型做了一些权衡,因此使用 HDFS 协议对 OSS 进行内部访问,此连接器需要一些 Hadoop 依赖项。 它仅支持 Hadoop 版本 2.9.X+

数据库依赖

该连接器通过 Jindo SDK 访问阿里云 OSS。Jindo SDK 的 jar 包(jindo-sdk-4.6.1.jarjindo-core-4.6.1.jar)必须放置在运行作业的每个节点的 ${SEATUNNEL_HOME}/lib 下。

Sink 选项

名称类型必需默认值描述
pathstring-Sink 写入的目标目录路径。如果目录不存在则会自动创建。
tmp_pathstring/tmp/seatunnel结果文件将首先写入临时路径,然后使用 mv 将临时目录提交到目标目录。需要一个 OSS 目录。
bucketstring-OSS 文件系统的桶地址,例如 oss://tyrantlucifer-image-bed
access_keystring-OSS 桶的访问密钥。
access_secretstring-OSS 桶的访问密钥(密钥)。
endpointstring-OSS 端点,例如 oss-cn-beijing.aliyuncs.com
custom_filenamebooleanfalse是否需要自定义文件名。
file_name_expressionstring"${transactionId}"仅在 custom_filenametrue 时使用。
filename_time_formatstring"yyyy.MM.dd"仅在 custom_filenametrue 时使用。
file_format_typestring"csv"文件格式类型,支持:textcsvparquetorcjsonexcelxmlbinarycanal_jsondebezium_jsonmaxwell_json
filename_extensionstring-使用自定义文件扩展名覆盖默认扩展名,例如 .xml.jsondat.customtype
field_delimiterstring'\001' for text and ',' for csv仅当 file_format_typetextcsv 时使用。
row_delimiterstring"\n"仅当 file_format_typetextcsvjson 时使用。
have_partitionbooleanfalse是否需要处理分区。
partition_byarray-仅在 have_partitiontrue 时使用。
partition_dir_expressionstring"${k0}=${v0}/${k1}=${v1}/.../${kn}=${vn}/"仅在 have_partitiontrue 时使用。
is_partition_field_write_in_filebooleanfalse仅在 have_partitiontrue 时使用。
sink_columnsarray当此参数为空时,所有字段都为 Sink 列。
is_enable_transactionbooleantrue若为 true,写入目标目录的数据不会丢失或重复;当为 true 时,会自动在文件名前缀添加 ${transactionId}_
batch_sizeint1000000单个文件的最大行数。对于 SeaTunnel Engine,文件中的行数由 batch_sizecheckpoint.interval 共同决定。
compress_codecstringnone文件的压缩编解码器。Excel 格式不支持任何压缩格式。
common-optionsobject-Sink 插件通用参数,请参考 Sink Common Options 了解详情。
max_rows_in_memoryint-仅当 file_format_typeexcel 时使用。
sheet_max_rowsint1048576仅当 file_format_typeexcel 时使用;每个工作表允许写入的最大行数。
sheet_namestringSheet${Random number}仅当 file_format_typeexcel 时使用。
csv_string_quote_modeenumMINIMAL仅当 file_format_typecsv 时使用。
xml_root_tagstringRECORDS仅当 file_format_typexml 时使用。
xml_row_tagstringRECORD仅当 file_format_typexml 时使用。
xml_use_attr_formatboolean-仅当 file_format_typexml 时使用。
single_file_modebooleanfalse每个并行度只输出一个文件。启用此选项后,batch_size 不再生效,输出文件名不包含文件块后缀。
create_empty_file_when_no_databooleanfalse当上游没有数据同步时,仍然会生成对应的数据文件。
parquet_avro_write_timestamp_as_int96booleanfalse仅当 file_format_typeparquet 时使用。
parquet_avro_write_fixed_as_int96array-仅当 file_format_typeparquet 时使用。
encodingstring"UTF-8"仅当 file_format_typejsontextcsvxml 时使用。要写入文件的字符集,通过 Charset.forName(encoding) 解析。
merge_update_eventbooleanfalse仅当 file_format_typecanal_jsondebezium_jsonmaxwell_json 时使用。设置为 true 时,会将 UPDATE_AFTERUPDATE_BEFORE 合并为 UPDATE 事件数据。
schema_evolution_enabledbooleanfalse开启 Schema 演变支持,适用于 CDC 管道。为 true 时,来自上游的 ADD/DROP/RENAME/MODIFY 列事件无需重启作业即可应用到 Sink。不支持 binary 格式。

path [string]

Sink 写入的目标目录路径。如果目录不存在则会自动创建。

bucket [string]

OSS 文件系统的桶地址,例如:oss://tyrantlucifer-image-bed

access_key [string]

OSS 桶的访问密钥。

access_secret [string]

OSS 桶的访问密钥(密钥)。

endpoint [string]

OSS 端点,例如 oss-cn-beijing.aliyuncs.com

custom_filename [boolean]

是否自定义文件名。

file_name_expression [string]

仅在 custom_filenametrue 时使用。

file_name_expression 描述将在 path 下创建的文件名表达式。可以在其中加入变量 ${now}${uuid},例如 test_${uuid}_${now}${now} 表示当前时间,其格式可以通过 filename_time_format 指定。

请注意,如果 is_enable_transactiontrue,会自动在文件名前缀添加 ${transactionId}_

filename_time_format [string]

仅在 custom_filenametrue 时使用。

file_name_expression 参数中包含 xxxx-${now} 时,filename_time_format 用于指定路径的时间格式,默认值为 yyyy.MM.dd。常用时间格式如下:

SymbolDescription
yYear
MMonth
dDay of month
HHour in day (0-23)
mMinute in hour
sSecond in minute

file_format_type [string]

支持以下文件类型:

text csv parquet orc json excel xml binary canal_json debezium_json maxwell_json

请注意,最终文件名将以 file_format_type 的后缀结尾,文本文件的后缀为 txt

field_delimiter [string]

数据行中列之间的分隔符。仅当 file_format_typetextcsv 时使用。

row_delimiter [string]

文件中行之间的分隔符。仅当 file_format_typetextcsvjson 时使用。

have_partition [boolean]

是否需要处理分区。

partition_by [array]

仅在 have_partitiontrue 时使用。

根据所选字段对数据进行分区。

partition_dir_expression [string]

仅在 have_partitiontrue 时使用。

如果指定了 partition_by,会根据分区信息生成对应的分区目录,最终文件会写入该分区目录下。

默认 partition_dir_expression${k0}=${v0}/${k1}=${v1}/.../${kn}=${vn}/,其中 k0 是第一个分区字段,v0 是第一个分区字段的值。

is_partition_field_write_in_file [boolean]

仅在 have_partitiontrue 时使用。

若为 true,分区字段及其值会写入数据文件中。

例如,如果要写 Hive 数据文件,应设为 false

sink_columns [array]

需要写入文件的列,默认值为来自 TransformSource 的所有列。字段顺序决定文件的实际写入顺序。

is_enable_transaction [boolean]

如果 is_enable_transactiontrue,会保证写入目标目录的数据不丢失、不重复。

请注意,如果 is_enable_transactiontrue,会自动在文件名前缀添加 ${transactionId}_

当前仅支持 true

batch_size [int]

单个文件的最大行数。对于 SeaTunnel Engine,文件中的行数由 batch_sizecheckpoint.interval 共同决定。如果 checkpoint.interval 足够大,Sink Writer 会持续写入直到行数超过 batch_size;若 checkpoint.interval 较小,则每次 checkpoint 触发时会创建新文件。

compress_codec [string]

文件的压缩编解码器,支持情况如下:

  • txt: lzo none
  • json: lzo none
  • csv: lzo none
  • orc: lzo snappy lz4 zlib none
  • parquet: lzo snappy lz4 gzip brotli zstd none

提示:excel 格式不支持任何压缩格式。

common options

Sink 插件通用参数,请参考 Sink Common Options 了解详情。

max_rows_in_memory [int]

当文件格式为 Excel 时,内存中可缓存的最大数据项数量。

sheet_max_rows [int]

当文件格式为 Excel 时,每个工作表允许写入的最大行数。

sheet_name [string]

写入工作簿的工作表名称。

csv_string_quote_mode [string]

当文件格式为 CSV 时,CSV 的字符串引用模式。

  • ALL:所有字符串字段都会被引用。
  • MINIMAL:仅引用包含特殊字符(如字段分隔符、引号字符或行分隔符中任意字符)的字段。
  • NONE:永不引用字段。当数据中出现分隔符时,打印机会在其前添加转义字符;若未设置转义字符,格式校验会抛出异常。

xml_root_tag [string]

指定 XML 文件中根元素的标签名。

xml_row_tag [string]

指定 XML 文件中数据行的标签名。

xml_use_attr_format [boolean]

指定是否使用标签属性格式处理数据。

parquet_avro_write_timestamp_as_int96 [boolean]

支持从时间戳写入 Parquet INT96,仅对 parquet 文件有效。

parquet_avro_write_fixed_as_int96 [array]

支持从 12 字节字段写入 Parquet INT96,仅对 parquet 文件有效。

encoding [string]

仅当 file_format_typejsontextcsvxml 时使用。指定要写入文件的字符集,通过 Charset.forName(encoding) 解析。

merge_update_event [boolean]

仅当 file_format_typecanal_jsondebezium_jsonmaxwell_json 时使用。设置为 true 时,会将 UPDATE_AFTERUPDATE_BEFORE 合并为 UPDATE 事件数据。

schema_evolution_enabled [boolean]

设置为 true 时,文件 Sink 可在运行时处理 CDC Schema 变更事件(ADD COLUMN、DROP COLUMN、RENAME COLUMN、MODIFY COLUMN 类型),无需重启作业。每次 Schema 变更时,当前输出文件会被关闭,并以新 Schema 打开一个新文件。

支持的格式:binary 外的所有文件格式。将此选项与 file_format_type = binary 一起使用时,作业启动时会抛出配置校验错误。

分区约束:have_partition = true 时,不允许删除 partition_by 中列出的列,违反时会立即抛出异常。分区列在 Schema 变更过程中必须保持稳定。

schema_evolution_enabled = false(默认值)时: 若上游 CDC Source 配置了 schema-changes.enabled = true 且 Sink 收到 AlterTableEvent,作业会立即抛出如下错误:

Received AlterTableEvent but schema_evolution_enabled=false at this sink. Either set schema_evolution_enabled=true to handle schema changes, or set schema-changes.enabled=false at the CDC source to suppress them.

使用默认 CDC Source 配置(schema-changes.enabled = false)的用户不受影响。

已知限制: Schema 变更与 Checkpoint 不是原子操作。若作业在文件轮转与 Schema 元数据更新之间的窗口期崩溃,恢复后写入的数据行可能使用变更前的 Schema。这是与其他 SeaTunnel Sink 共同存在的已知架构限制。完整的重启后 DDL 正确性支持需要配套的 CDC Source 修复(另行跟踪)。

CDC 管道中的使用示例:

OssJindoFile {
path = "/tmp/cdc/${table_name}"
bucket = "oss://tyrantlucifer-image-bed"
access_key = "xxxxxxxxxxxxxxxxx"
access_secret = "xxxxxxxxxxxxxxxxxxxxxx"
endpoint = "oss-cn-beijing.aliyuncs.com"
file_format_type = "parquet"
schema_evolution_enabled = true
have_partition = true
partition_by = ["updated_at_month"]
}

例子

适用于具有 have_partitioncustom_filenamesink_columns 的文本文件格式:

env {
parallelism = 1
job.mode = "BATCH"
}

sink {
OssJindoFile {
path="/seatunnel/sink"
bucket = "oss://tyrantlucifer-image-bed"
access_key = "xxxxxxxxxxx"
access_secret = "xxxxxxxxxxx"
endpoint = "oss-cn-beijing.aliyuncs.com"
file_format_type = "text"
field_delimiter = "\t"
row_delimiter = "\n"
have_partition = true
partition_by = ["age"]
partition_dir_expression = "${k0}=${v0}"
is_partition_field_write_in_file = true
custom_filename = true
file_name_expression = "${transactionId}_${now}"
filename_time_format = "yyyy.MM.dd"
sink_columns = ["name","age"]
is_enable_transaction = true
}
}

适用于带 sink_columns 的 parquet 文件格式:

env {
parallelism = 1
job.mode = "BATCH"
}

sink {
OssJindoFile {
path = "/seatunnel/sink"
bucket = "oss://tyrantlucifer-image-bed"
access_key = "xxxxxxxxxxx"
access_secret = "xxxxxxxxxxxxxxxxx"
endpoint = "oss-cn-beijing.aliyuncs.com"
file_format_type = "parquet"
sink_columns = ["name","age"]
}
}

对于 orc 文件格式的简单配置:

env {
parallelism = 1
job.mode = "BATCH"
}

sink {
OssJindoFile {
path="/seatunnel/sink"
bucket = "oss://tyrantlucifer-image-bed"
access_key = "xxxxxxxxxxx"
access_secret = "xxxxxxxxxxx"
endpoint = "oss-cn-beijing.aliyuncs.com"
file_format_type = "orc"
}
}

适用于带 merge_update_event 的 canal_json 格式(合并 CDC 更新事件):

env {
parallelism = 1
job.mode = "BATCH"
}

sink {
OssJindoFile {
path = "/seatunnel/sink"
bucket = "oss://tyrantlucifer-image-bed"
access_key = "xxxxxxxxxxx"
access_secret = "xxxxxxxxxxx"
endpoint = "oss-cn-beijing.aliyuncs.com"
file_format_type = "canal_json"
merge_update_event = true
}
}

变更日志