You need to enable JavaScript to run this app.
文档中心
大数据研发治理套件

大数据研发治理套件

复制全文
下载 pdf
高级参数
配置 Hive Sink 高级参数
复制全文
下载 pdf
配置 Hive Sink 高级参数

本文介绍了 DataSail Hive Sink 的高级参数配置,包括各参数的作用、适用场景、调优建议等内容,可帮助您提升数据写入任务的性能与稳定性。

参数速览表

下表汇总了 Hive Sink 的核心高级参数,为您提供快速查阅和定位的参考。详细用法请参见各参数的独立章节。

参数名

简要作用

默认值

建议调参方向

job.writer.class

指定底层写入逻辑的实现类。

以产品配置为准

通常无需调整,仅在排查特定历史问题时可能切换至旧版实现。

job.writer.hive_version

指定目标 Hive 的版本号。

以产品配置为准

通常无需调整,保持与目标集群版本一致。

job.writer.cid / job.common.cid

用于获取目标 Hive 集群的连接配置信息。

按区域自动配置

通常无需手动配置。

job.common.instance_id

任务实例 ID,影响临时文件和最终产物的文件名。

系统自动生成

通常无需手动配置。

job.writer.db_name

指定要写入的目标数据库名称。

按数据源配置

必须正确配置为目标库名。

job.writer.table_name

指定要写入的目标数据表名称。

按任务配置

必须正确配置为目标表名。

job.writer.columns

定义写入数据表的字段列表和类型。

按任务配置

必须与数据源结构和目标表结构对齐。

job.writer.writable_extractor_type

选择将内部数据结构转换为 Hive 可写格式的实现方式。

parquet

通常无需调整,保持默认即可。

job.writer.partition

声明写入的目标分区,支持静态和动态分区。

按任务配置

根据业务需求精确定义分区键值。

job.writer.partition_type

定义各分区键的数据类型。

string

与 job.writer.partition 的分区键一一对应,并确保类型正确。

job.writer.default_partition_value

为动态分区字段设置回退的默认值。

无

当源数据中分区列可能出现 null 或非法值时建议配置。

job.writer.write_mode

定义写入模式,覆盖或追加。

overwrite

根据业务是需要全量覆盖还是增量追加来选择。

job.writer.storage_type

指定底层存储系统类型。

hdfs

根据数据湖底层存储设施选择,如 HDFS、TOS 等。

job.writer.emr_hive_conf

直接提供 Hive 集群的配置信息。

按数据源配置

通常由系统自动获取,排障时可用于临时覆盖。

job.writer.emr_hadoop_conf

提供 Hadoop 客户端的详细配置。

按数据源配置

用于调整 HDFS 客户端、Kerberos 等底层行为。

job.writer.extra_config

作为 emr_hadoop_conf 的补充配置。

无

在 emr_hadoop_conf 之外需要额外补充 Hadoop 配置时使用。

job.writer.hive_parquet_compression

设置输出的 Parquet 文件压缩算法。

gzip(最终兜底)

在存储空间和查询性能之间权衡,可选 snappy、gzip 等。

job.writer.parquet_config

以 JSON 格式注入更多 Parquet 底层参数。

无

进行精细化性能调优时使用,如调整 Page Size。

job.writer.enable_partition_dir_rename

启用“按整个分区目录重命名”的提交策略。

FALSE

写入分区数据量大、文件多时,建议开启以提升提交效率。

job.writer.convert_error_column_as_null

当字段类型转换失败时,是否将其作为 NULL 写入。

FALSE

若能容忍部分字段数据丢失以保障任务成功,可开启。

job.writer.is_drop_delims

是否移除数据中的换行符和 Hive 默认分隔符。

FALSE

当源数据包含特殊字符可能破坏目标文件格式时,建议开启。

job.writer.empty_list_map_write_null

是否将空的 List 或 Map 类型字段作为 NULL 写入。

FALSE

根据下游对空集合与 NULL 的处理方式决定是否开启。

output.empty_list_map_write_null

job.writer.empty_list_map_write_null 的全局默认值。

FALSE

不建议直接调整,优先使用 job.writer 级别的同名参数。

job.writer.date_to_string_as_long

当 Date 类型转为 String 类型时,是否先转为数字再转为字符串。

FALSE

当需要将日期以 Unix 时间戳(数字形式)字符串存储时开启。

job.writer.date_precision

定义日期或时间戳转换为数字时的时间精度。

second

根据下游需要秒级还是毫秒级时间戳来选择。

job.writer.null_string_as_null

对于 String 类型字段,是否将 null 值写为 SQL NULL。

FALSE

若目标表将空字符串和 NULL 视为不同,按需开启。

job.writer.kerberos_enable

是否为写入过程启用 Kerberos 安全认证。

按数据源配置

当目标 Hive 集群开启 Kerberos 时,必须开启。

job.writer.kerberos_principal

Kerberos 认证主体。

按数据源配置

启用 Kerberos 时必须正确填写。

job.writer.keytab_content_base64

Kerberos 认证所需的 Keytab 文件内容(Base64 编码)。

按数据源配置

启用 Kerberos 时必须正确提供。

job.writer.krb5_conf_content_base64

Kerberos 配置文件 krb5.conf 的内容(Base64 编码)。

按数据源配置

启用 Kerberos 时必须正确提供。

job.writer.kerberos_conf

额外的 Kerberos 相关 Hadoop 配置。

无

用于传递特殊的 Kerberos 或 Hadoop 安全配置。

job.writer.kerberos_system_props

额外的 Kerberos 相关 Java 系统属性。

无

用于设置特定的 Java 层面的 Kerberos 行为。

job.common.host_ips_mapping

提供主机名到 IP 地址的静态映射。

按数据源配置

在 DNS 解析不稳定的网络环境中,为 Kerberos 提供可靠的节点地址。

参数详解

job.writer.class

1. 参数概述

  • 参数名: job.writer.class
  • 适用范围: Hive Sink
  • 单位: 无
  • 默认值: com.bytedance.dts.batch.hive.parquet.HiveParquetOutputFormat (以当前产品配置为准)
  • 核心作用: 指定数据写入 Hive 时实际执行工作的底层实现类。不同的实现类可能在功能、性能或兼容性上有细微差异。

2. 适用场景

  • 排查历史问题: 当遇到新版写入组件无法处理的特定数据格式或行为时,可能需要临时切换回旧的实现类(如 ...OldHiveParquetOutputFormat)以验证问题是否与组件升级有关。
  • 功能验证: 极少数情况下,旧版实现类可能包含一些新版不再支持的特殊校验逻辑(如额外的 SQL 校验),需要使用这些特定功能时才考虑切换。

3. 调参建议 / 推荐配置

  • 默认推荐: 保持默认值。新版实现通常在性能、稳定性和功能上更有优势。
  • 排障临时配置: 仅在有明确指导或怀疑新版组件存在缺陷时,才尝试切换到旧版实现 com.bytedance.dts.batch.hive.parquet.OldHiveParquetOutputFormat 进行对比测试。

4. 参数联动

  • job.writer.class 的选择会决定后续部分参数是否生效。例如,一些与旧版 SQL 校验相关的参数,只有在切换到 OldHiveParquetOutputFormat 时才起作用。

5. FAQ(用户提问)

  • 问: 我是否需要修改这个参数来提升写入速度?
    • 答: 不需要。性能调优通常通过调整其他参数(如压缩方式、批次大小、提交策略等)来实现,而非修改 job.writer.class。此参数主要用于版本切换和问题排查。
  • 问: 什么时候应该考虑使用旧的实现类?
    • 答: 当您遇到一个在新版本中出现、但在旧版本中不存在的明确错误,并且技术支持建议您通过切换实现类来规避或诊断问题时。
  • 问: 修改这个参数有风险吗?
    • 答: 有。切换到旧的或不常用的实现类可能导致失去新版的功能优化和缺陷修复,甚至引入未知的稳定性问题。除非必要,请勿修改。

6. 注意事项

  • 请勿随意修改: 该参数为高级配置,通常不需要用户关心。错误的配置可能导致任务失败或行为异常。
  • 非性能开关: 此参数不应用作常规的性能调优手段。

7. 总结说明

job.writer.class 用于选择数据写入的底层实现逻辑,用户通常无需关心或修改。保持默认配置即可获得最佳的性能和稳定性。仅在技术支持的指导下,为排查特定兼容性问题时才考虑调整。

job.writer.hive_version

1. 参数概述

  • 参数名: job.writer.hive_version
  • 适用范围: Hive Sink
  • 单位: 无
  • 默认值: 以当前产品配置为准 (例如 3.1.2)
  • 核心作用: 告知写入组件目标 Hive 集群的版本。这有助于组件启用或禁用特定于版本的兼容性代码,确保行为正确。

2. 适用场景

  • 跨版本写入: 当写入的目标 Hive 集群版本与平台默认支持的版本不一致时,显式指定正确的版本号有助于避免因版本不匹配导致的潜在问题。
  • 兼容性问题排查: 如果遇到怀疑与 Hive 版本不兼容相关的错误(如特定数据类型写入失败、元数据操作异常),可以检查并确保此参数与目标集群版本严格一致。

3. 调参建议 / 推荐配置

  • 默认推荐: 保持默认或不配置,让系统根据数据源信息自动推断。
  • 特定集群配置: 如果您的目标 Hive 集群版本特殊,请根据其实际版本号(如 2.3.9)进行精确配置。

4. 参数联动

  • 无显著的直接参数联动。但此参数的正确性会影响整个写入流程与 Hive Metastore 交互的成败。

5. FAQ(用户提问)

  • 问: 我需要为每个任务都配置这个参数吗?
    • 答: 不需要。通常情况下,系统会根据您选择的数据源自动填充正确的 Hive 版本。只有在自动推断失败或需要强制指定特定版本时才需要手动配置。
  • 问: 配置一个错误的 Hive 版本会有什么后果?
    • 答: 可能会导致多种问题。轻则某些数据类型写入格式不正确,重则可能因 API 不兼容导致任务在提交元数据时失败。
  • 问: 这个版本号需要多精确?大版本号一致就可以吗?
    • 答: 建议尽可能精确到补丁版本(如 3.1.2)。虽然有时仅匹配主版本和次版本(如 3.1)也能正常工作,但精确的版本号能最大程度地避免兼容性风险。

6. 注意事项

  • 与实际环境保持一致: 此参数的值应严格遵守目标 Hive 集群的真实版本。
  • 非性能参数: 修改此参数不会对写入性能产生直接影响。

7. 总结说明

job.writer.hive_version 用于声明目标 Hive 集群的版本,以确保写入过程的兼容性。大多数情况下用户无需配置,系统会自动处理。当您向一个非标准或版本特殊的 Hive 集群写入数据时,请确保此参数已正确设置为目标集群的实际版本号。

job.writer.cid / job.common.cid

1. 参数概述

  • 参数名: job.writer.cid, job.common.cid
  • 适用范围: Hive Sink, Common
  • 单位: 无
  • 默认值: 按区域自动配置
  • 核心作用: cid (Cluster ID) 是一个内部标识,用于定位并获取目标 Hive 集群的完整配置,包括连接地址(Metastore URI)、Hadoop 配置、Kerberos 信息等。job.writer.cid 优先于 job.common.cid。

2. 适用场景

  • 自动配置: 在标准使用场景中,用户通过在界面上选择数据源,系统会自动填充正确的 cid,用户无需关心此参数。
  • 手动指定集群: 在一些高级或调试场景下,如果需要强制任务写入一个未在数据源列表中注册的集群,可能需要手动提供其 cid。

3. 调参建议 / 推荐配置

  • 默认推荐: 不配置。让系统根据您选择的目标数据源自动管理。
  • 排障临时配置: 仅在需要覆盖默认数据源、进行跨集群测试等特殊场景下,根据技术支持提供的 cid 进行配置。

4. 参数联动

  • cid 直接决定了 job.writer.emr_hive_conf 和 job.writer.emr_hadoop_conf 的内容来源。如果 cid 指定错误,后续所有与 Hive 和 HDFS 的交互都将失败。
  • 如果同时配置了 cid 和 job.writer.emr_hive_conf,后者会覆盖从 cid 获取的配置。

5. FAQ(用户提问)

  • 问: 我在哪里可以找到我要写的集群的 cid?
    • 答: cid 是平台的内部概念,通常不直接对用户暴露。您只需要在任务配置中正确选择目标数据源即可,系统会为您处理 cid 的映射。如果确有需要,请联系平台管理员或技术支持获取。
  • 问: job.writer.cid 和 job.common.cid 有什么区别?
    • 答: job.writer.cid 是专门为数据写入(Sink)指定的集群配置,优先级更高。如果 job.writer.cid 未配置,系统会使用通用的 job.common.cid 作为备选。这种设计允许读、写操作使用不同的集群。
  • 问: 配置了这个参数,还需要配 Hive 的地址吗?
    • 答: 不需要。cid 的作用就是让系统能自动找到包括地址在内的一整套配置。手动配置 cid 后,就不应再手动配置 emr_hive_conf 或 emr_hadoop_conf,除非您想覆盖 cid 中的部分特定配置。

6. 注意事项

  • 内部参数: 这是一个内部标识,请勿在不理解其含义的情况下随意修改。
  • 优先选择数据源: 日常使用中,应通过切换数据源来指向不同集群,而不是直接修改 cid。

7. 总结说明

cid 是一个内部参数,用于关联您的任务与目标数据集群的配置。用户只需在界面上正确选择数据源,系统便会自动处理此参数,无需手动配置。这是一个核心的连接参数,错误的配置将导致任务无法连接到目标集群。

job.common.instance_id

1. 参数概述

  • 参数名: job.common.instance_id
  • 适用范围: Common
  • 单位: 无
  • 默认值: 由系统在任务运行时自动生成
  • 核心作用: 为每个任务的单次运行提供一个唯一的标识。这个 ID 主要用于构造临时文件和临时目录的路径,以避免不同任务或同一任务的多次运行之间产生冲突。

2. 适用场景

  • 正常运行: 在所有正常场景下,此参数都由调度系统自动生成和传入,用户无需也无法干预。
  • 问题溯源: 在排查 HDFS 上的临时文件问题时,文件名中包含的 instance_id 可以帮助快速定位到具体的任务运行实例。

3. 调参建议 / 推荐配置

  • 默认推荐: 保持系统自动注入,用户不可配置。

4. 参数联动

  • 此参数会作为路径的一部分,影响临时文件写入的位置。路径格式通常包含 instance_id 和其他任务标识。

5. FAQ(用户提问)

  • 问: 我需要关心这个参数吗?
    • 答: 不需要。这是一个纯粹的系统内部参数,用于保证任务运行的隔离性。
  • 问: 如果任务失败了,这个 instance_id 还有用吗?
    • 答: 有用。当任务失败且需要分析 HDFS 上残留的临时文件时,您可以根据任务运行记录中找到的 instance_id,在 HDFS 的临时目录下(通常是 /user/app/dts/.tmp/ 等路径)快速找到该次运行产生的文件,便于问题排查。
  • 问: 如果没有这个 ID 会怎么样?
    • 答: 如果系统未能注入此 ID,代码会使用一个固定的默认值(如 -1)。这在多任务并行或重试时可能导致临时文件路径冲突,引发写入错误或数据覆盖,因此 instance_id 对于保障任务正确性至关重要。

6. 注意事项

  • 系统参数: 这是一个由系统管理的参数,用户不应尝试修改它。
  • 调试用途: 其主要面向用户的价值在于,当需要进行底层文件排查时,可作为关键线索。

7. 总结说明

job.common.instance_id 是每次任务运行的唯一ID,由系统自动生成,主要用于创建隔离的临时文件目录,保证任务的稳定和正确。用户通常无需关心此参数,但在需要深入排查文件系统层面的问题时,它是一个定位临时数据的重要标识。

job.writer.db_name

1. 参数概述

  • 参数名: job.writer.db_name (别名: db_name)
  • 适用范围: Hive Sink
  • 单位: 无
  • 默认值: 按数据源配置
  • 核心作用: 明确指定数据要写入的目标 Hive 数据库(Database)的名称。

2. 适用场景

  • 所有写入场景: 任何向 Hive 写入数据的任务都必须指定此参数。它与 job.writer.table_name 共同构成了写入目标的完整坐标。

3. 调参建议 / 推荐配置

  • 必须配置: 确保该参数的值是您期望写入的、真实存在的数据库名称。
  • 环境隔离: 在多环境(如开发、测试、生产)中,请仔细检查该参数是否指向了正确的数据库,以防数据写错位置。

4. 参数联动

  • job.writer.table_name: 必须与 table_name 配对使用,共同定义一个完整的目标表路径 (db_name.table_name)。
  • job.writer.cid: db_name 指定的数据库必须存在于由 cid 或 emr_hive_conf 指定的 Hive 集群中。

5. FAQ(用户提问)

  • 问: 如果我把数据库名写错了会发生什么?
    • 答: 任务在初始化阶段连接到 Hive Metastore 后,会尝试获取 db_name.table_name 的元数据。如果数据库不存在,任务会立即失败,并报出类似 “Database not found” 的错误。
  • 问: 我可以在运行时动态改变要写入的数据库吗?
    • 答: 不可以。当前 Hive Sink 的设计是在任务启动时就确定了唯一的 db_name。如果需要写入多个数据库,您需要配置多个独立的任务。
  • 问: db_name 和 database 这两个参数名都可以用吗?
    • 答: 系统支持 db_name 这个别名。为保持统一,建议在配置中始终使用 job.writer.db_name。

6. 注意事项

  • 拼写与大小写: 确保数据库名称的拼写和大小写完全正确(取决于底层 Hive Metastore 的配置是否对大小写敏感)。
  • 权限检查: 确保您用于运行任务的账户具有向该数据库写入数据的权限。权限问题通常会导致在任务提交(commit)阶段而不是初始化阶段失败。

7. 总结说明

job.writer.db_name 是一个必需参数,用于指定数据写入的目标 Hive 数据库。请务必确保其配置正确,并与 job.writer.table_name 共同指向您期望的数据表。它是定位写入目标的基础。

job.writer.table_name

1. 参数概述

  • 参数名: job.writer.table_name (别名: table_name)
  • 适用范围: Hive Sink
  • 单位: 无
  • 默认值: 按任务配置
  • 核心作用: 明确指定数据要写入的目标 Hive 数据表(Table)的名称。

2. 适用场景

  • 所有写入场景: 与 job.writer.db_name 一样,这是任何 Hive 写入任务都必须配置的核心参数。它构成了写入目标的最终落点。

3. 调参建议 / 推荐配置

  • 必须配置: 确保该参数的值是您期望写入的、真实存在的数据表名称。
  • 目标表预创建: 在任务运行前,目标表通常需要预先在 Hive 中创建好,并定义好正确的表结构、分区信息和存储格式。

4. 参数联动

  • job.writer.db_name: 与 db_name 共同组成完整表名。
  • job.writer.columns: 任务配置的 columns 列表应与 table_name 指定的 Hive 表结构在列名、顺序和类型上保持兼容。
  • job.writer.partition: 任务配置的 partition 信息必须与 table_name 指定的 Hive 表的分区定义一致。

5. FAQ(用户提问)

  • 问: 如果目标表不存在,任务会自动创建吗?
    • 答: 不会。当前的 Hive Sink 组件要求目标表必须预先存在。如果表不存在,任务会在初始化阶段因找不到表的元数据而失败,报错信息通常为 “Table not found”。
  • 问: 表名写错了会有什么后果?
    • 答: 与 db_name 写错类似,任务会因找不到元数据而启动失败。
  • 问: 我想把数据写入一个每天动态生成的表(例如 my_table_20240413),这个参数支持吗?
    • 答: 不支持。job.writer.table_name 在任务启动时即被固定。若要实现写入动态表名,您需要通过外部调度系统,每天生成并运行一个新的任务,并在任务配置中传入当天的表名。

6. 注意事项

  • 拼写与大小写: 与数据库名一样,请确保表名的准确性。
  • 表类型: 确保您写入的表是普通表或分区表,而不是视图(View)。
  • 权限: 确保运行账户有权向该表写入和添加/修改分区。

7. 总结说明

job.writer.table_name 是一个必需参数,用于指定数据写入的目标数据表。在运行任务前,请务必确认该参数配置正确,且目标表已在 Hive 中创建。它是确保数据能够准确落盘到指定位置的关键配置。

job.writer.columns

1. 参数概述

  • 参数名: job.writer.columns
  • 适用范围: Hive Sink
  • 单位: 无
  • 默认值: 按任务配置
  • 核心作用: 定义数据写入时所包含的字段列表,包括每个字段的名称和数据类型。它扮演着数据从上游到 Sink 组件内部的“通行证”角色。

2. 适用场景

  • 字段映射: 当上游数据源的字段与目标 Hive 表的字段不完全一致时(如顺序不同、字段名不同、或只需写入部分字段),通过 columns 参数可以进行精确的映射和裁剪。
  • 动态分区: 如果任务使用动态分区,那么分区所对应的字段必须包含在 columns 列表中,否则任务将无法从数据中提取分区值,导致启动失败。

3. 调参建议 / 推荐配置

  • 精确匹配: columns 列表中的字段顺序和类型应严格按照数据写入 RecordWriter 前的 Row 结构来定义。
  • 与目标表兼容: columns 中定义的字段应与目标 Hive 表的列在名称和类型上保持兼容。虽然写入组件有一定的自动转换能力,但保持一致可以避免绝大多数 schema mismatch 问题。
  • 包含动态分区列: 当使用动态分区时,例如分区键为 dt 和 hh,请确保 columns 列表中包含了名为 dt 和 hh 的字段。

4. 参数联动

  • job.writer.table_name: columns 的定义需要与目标表的 Schema 兼容。
  • job.writer.partition: 当 partition 参数中包含动态分区时(如 dt=,hh=),dt 和 hh 必须是 columns 的一部分。

5. FAQ(用户提问)

  • 问: 如果 columns 里的字段比 Hive 表多或少会怎么样?
    • 答: 这取决于 Hive 的 Schema 演进策略。通常情况下:
      • 如果 columns 比表字段少:只要不少关键字段(如分区列),任务可以成功写入,表中缺失的列将被填充为 NULL。
      • 如果 columns 比表字段多:任务很可能会失败,因为多余的字段在目标表中找不到位置。
  • 问: 我可以只写目标表的一部分列吗?
    • 答: 可以。您可以在 columns 参数中只声明您想写入的那些列,并确保其与上游数据流的结构一致。
  • 问: 动态分区的列在 columns 列表里应该放在什么位置?
    • 答: 位置没有强制要求。写入组件会根据列名自动从数据行中找到对应的分区值。

6. 注意事项

  • 类型准确性: columns 中定义的类型至关重要。例如,一个上游为 Long 类型的字段,如果在 columns 中错配为 String,可能会导致写入失败或数据失真。
  • 常见报错关键字: 配置不当可能导致 schema mismatch, column not found 等错误。

7. 总结说明

job.writer.columns 定义了写入操作的数据结构,是连接上游数据和目标 Hive 表的关键桥梁。请务必保证其内容(字段名、类型、顺序)与您的数据流相匹配,并与目标表的 Schema 兼容。特别是在使用动态分区时,分区列必须包含在此参数中。

job.writer.writable_extractor_type

1. 参数概述

  • 参数名: job.writer.writable_extractor_type
  • 适用范围: Hive Sink
  • 单位: 无
  • 默认值: parquet
  • 核心作用: 选择一个内部组件,该组件负责将 Flink 的数据结构(Row)转换为 Hadoop 的可写格式(Writable)。这通常与目标文件的存储格式有关。

2. 适用场景

  • Parquet 格式写入: 当目标 Hive 表的存储格式是 Parquet 时,使用默认的 parquet 类型。这是最常见、性能也最优的场景。
  • 通用格式写入: 如果目标表是其他文本格式(如 ORC、TextFile 等),理论上可能需要切换到 general。但在当前实现中,主要优化和测试都集中在 Parquet 格式上。

3. 调参建议 / 推荐配置

  • 默认推荐: 保持默认值 parquet。数据平台上的 Hive 表绝大多数都推荐使用 Parquet 格式,以获得最佳的压缩率和查询性能。
  • 其他格式: 如果您确认目标表不是 Parquet 格式,且写入遇到问题,可以尝试将其设置为 general。但更推荐的做法是,将目标表的存储格式也改为 Parquet。

4. 参数联动

  • job.writer.hive_parquet_compression: 此参数以及其他 Parquet 相关配置(如 parquet_config)通常在 writable_extractor_type 为 parquet 时才有意义。

5. FAQ(用户提问)

  • 问: 修改这个参数能提升性能吗?
    • 答: 不能。此参数是根据目标文件格式选择正确的内部处理逻辑,而非性能开关。性能的关键在于选择正确的、高效的文件格式(如 Parquet)本身。
  • 问: 如果我的目标表是 ORC 格式,这个参数应该怎么设?
    • 答: 当前 Sink 组件主要为 Parquet 优化。如果目标是 ORC,建议首先确认当前版本的 Sink 是否完整支持 ORC 写入。如果支持,可能需要将此参数设置为 general。但最优实践是将表格式转换为 Parquet。
  • 问: 默认值为什么是 parquet?
    • 答: 因为 Parquet 是现代大数据生态中最主流的列式存储格式,它在压缩效率和查询性能上表现优异,尤其适合分析型场景。因此,写入组件默认就针对这种最优格式进行实现。

6. 注意事项

  • 内部实现细节: 该参数与组件的内部实现紧密相关,用户通常无需关心。
  • 保持默认: 在不完全理解其背后机制的情况下,强烈建议不要修改此参数。

7. 总结说明

job.writer.writable_extractor_type 用于选择与目标文件格式相匹配的内部数据转换器。对于最常用且推荐的 Parquet 格式,保持默认的 parquet 设置即可。用户通常无需修改此参数。

job.writer.partition

1. 参数概述

  • 参数名: job.writer.partition
  • 适用范围: Hive Sink
  • 单位: 无
  • 默认值: "" (空字符串,表示无分区或由系统处理)
  • 核心作用: 声明本次写入操作的目标分区。它支持静态分区、动态分区以及两者混合的模式。

2. 适用场景

  • 写入静态分区: 当您明确知道数据要写入哪个分区时,可以提供完整的分区键值对。例如,dt=20240401,hh=01。这会将所有数据全部写入该指定分区。
  • 写入动态分区: 当数据本身包含分区列,需要根据每条数据的具体值来决定其归属分区时,使用动态分区。声明方式为只提供分区键,值留空。例如,dt=,hh= 表示 dt 和 hh 的值将从每条数据中动态获取。
  • 混合分区: 您也可以混合使用两者。例如 dt=20240401,hh=,表示所有数据都写入 20240401 这一天,但具体的小时分区 hh 则根据数据动态决定。

3. 调参建议 / 推荐配置

  • 非分区表: 如果目标表不是分区表,请将此参数留空或不配置。
  • 静态分区: 分区键1=值1,分区键2=值2。确保值是有效的,符合该分区键的类型。
  • 动态分区: 分区键1=,分区键2=。确保这些分区键存在于 job.writer.columns 参数中。
  • 推荐: 优先使用静态分区,因为其路径在任务启动时就已确定,行为最可控。仅在业务逻辑确实需要根据数据内容分发到不同分区时,才使用动态分区。

4. 参数联动

  • job.writer.columns: 动态分区的分区键必须是 columns 的一部分。
  • job.writer.partition_type: 需要与 partition 参数中声明的分区键一一对应,并指定其数据类型。
  • job.writer.default_partition_value: 可以为动态分区提供默认值,以处理数据中分区列为空或非法的情况。
  • job.writer.enable_partition_dir_rename: 在使用动态分区且数据量大时,开启此参数可以显著提升提交效率。

5. FAQ(用户提问)

  • 问: 我怎么知道应该用静态分区还是动态分区?
    • 答: 如果一批数据的目标分区是唯一的、提前确定的,就用静态分区。如果一批数据需要根据自身的某个字段值(比如日志时间)分散到不同的分区,就用动态分区。
  • 问: 动态分区会影响性能吗?
    • 答: 会。动态分区需要在写入过程中为每个新出现的分区值创建对应的写入器实例,并且在任务结束时需要注册所有新创建的分区。如果动态生成的分区数量过多(比如成千上万个),会给任务的内存管理和提交阶段带来巨大压力,甚至导致任务失败。
  • 问: 参数值里有个 magic value dts.hive.no.partition 是什么意思?
    • 答: 这是系统内部用来显式表达“此任务不操作分区”的一种特殊标记,用户在手动配置时通常不会用到,保持为空即可代表非分区表。

6. 注意事项

  • 动态分区风险: 谨慎使用动态分区,要对输入数据的分区键基数(即不同分区值的数量)有预估。过高的基数是导致任务不稳定的常见原因。
  • 分区键顺序: partition 参数中的分区键顺序应与 Hive 表定义中的分区键顺序保持一致。

7. 总结说明

job.writer.partition 是控制数据写入哪个分区的核心参数。您可以根据需求配置为静态分区(固定目标)、动态分区(按数据内容分发)或两者混合。请优先使用静态分区以保证任务稳定性,仅在必要时使用动态分区,并注意控制动态生成的分区数量。

job.writer.partition_type

1. 参数概述

  • 参数名: job.writer.partition_type
  • 适用范围: Hive Sink
  • 单位: 无
  • 默认值: string
  • 核心作用: 与 job.writer.partition 参数配合使用,用于声明每个分区键的数据类型。

2. 适用场景

  • 类型声明: 当 job.writer.partition 中声明了分区时,此参数用于告知系统如何解析静态分区的值,或如何为动态分区推断数据类型。
  • 多分区键: 当有多个分区键时,类型之间用逗号分隔,并与 partition 参数中的键一一对应。例如,若 partition 为 dt=20240101,hr=08,则 partition_type 可能为 string,string 或 int,int,取决于表定义。

3. 调参建议 / 推荐配置

  • 与表定义一致: 此处声明的类型应与 Hive 表 DDL 中定义的分区列类型严格一致。
  • 示例:
    • job.writer.partition: ds=2024-04-13
    • job.writer.partition_type: string
    • job.writer.partition: year=2024,month=4
    • job.writer.partition_type: int,int

4. 参数联动

  • job.writer.partition: partition_type 中声明的类型数量和顺序必须与 partition 中的分区键完全对应。
  • job.writer.default_partition_value: 当需要为动态分区设置默认值时,partition_type 会影响默认值的解析。

5. FAQ(用户提问)

  • 问: 如果我不配置这个参数会怎么样?
    • 答: 系统会默认所有分区键都是 string 类型。如果您的分区键实际上是 int 或 bigint 等数值类型,不正确地配置(或不配置)此参数可能导致元数据操作失败,或在查询时无法正确利用分区裁剪。
  • 问: partition_type 和 columns 里的类型有什么关系?
    • 答: 对于动态分区,分区键同时也是 columns 的一部分。此时,partition_type 中为该分区键声明的类型,应与 columns 中为该字段定义的类型保持一致,并且最终都要与 Hive 表定义一致。
  • 问: 我需要写全所有类型吗?
    • 答: 是的。如果您有两个分区键,partition_type 就应该提供两个用逗号分隔的类型。

6. 注意事项

  • 顺序严格对应: 请确保 partition_type 中的类型顺序与 partition 中的分区键顺序完全一致。
  • 支持的类型: 通常支持 Hive 的基本数据类型,如 string, int, bigint, double 等。

7. 总结说明

job.writer.partition_type 用于声明每个分区键的数据类型,是 job.writer.partition 参数的配套配置。为保证数据能被正确写入和查询,请务必根据目标 Hive 表的真实分区类型,精确配置此参数。

job.writer.default_partition_value

1. 参数概述

  • 参数名: job.writer.default_partition_value
  • 适用范围: Hive Sink
  • 单位: 无
  • 默认值: "" (空字符串)
  • 核心作用: 在使用动态分区时,为那些从数据行中未能成功获取到值(例如值为 NULL 或类型转换失败)的分区字段提供一个回退的默认值。

2. 适用场景

  • 数据容错: 当源数据中用于动态分区的字段存在 NULL 值或脏数据时,若不希望因此导致任务失败或数据丢失,可以配置一个默认分区来“收容”这些异常数据。例如,将所有 NULL 地区码的数据都写入 region=UNKNOWN 分区。
  • 分区完整性: 确保即使在数据质量不佳的情况下,每条记录都能被归属到一个分区,而不是被当作脏数据丢弃。

3. 调参建议 / 推荐配置

  • 格式: 采用 分区键1=默认值1,分区键2=默认值2 的格式。您可以只为部分动态分区键配置默认值。
  • 默认分区命名: 建议使用具有明确业务含义的默认值,如 __DEFAULT__, UNKNOWN, NULL 等,便于下游识别和处理。
  • 示例:
    • job.writer.partition: dt=,region=
    • job.writer.default_partition_value: region=UNKNOWN
    • 这意味着,如果某条数据的 region 字段为 NULL,它将被写入 dt=.../region=UNKNOWN 分区。

4. 参数联动

  • job.writer.partition: 此参数只对 partition 中声明为动态分区(值为空)的键生效。
  • job.writer.partition_type: 默认值的类型会受到 partition_type 的影响。例如,如果分区类型是 int,那么默认值也应该是合法的整数。

5. FAQ(用户提问)

  • 问: 如果不配置这个参数,遇到 NULL 的分区值会怎么样?
    • 答: 这取决于 Hive 的配置。通常,Hive 会使用一个特殊的默认分区名(如 __HIVE_DEFAULT_PARTITION__)来存储这些数据。配置此参数可以让您自定义这个回退分区的名称,使其更具业务可读性。
  • 问: 我可以为所有分区键都设置默认值吗?
    • 答: 可以,但不常见。通常只为那些已知数据质量可能不佳的动态分区字段设置默认值。
  • 问: 这个参数对静态分区有效吗?
    • 答: 无效。它只作用于动态分区。

6. 注意事项

  • 监控默认分区: 配置了默认分区后,建议定期监控该分区的数据量。如果数据量异常增大,可能说明上游数据质量出现了严重问题。
  • 下游感知: 确保下游的数据消费者知道这个默认分区的存在及其业务含义。

7. 总结说明

job.writer.default_partition_value 是一个用于提升动态分区任务鲁棒性的容错参数。当您的源数据中分区字段可能存在 NULL 或非法值时,通过配置一个有意义的默认分区,可以避免数据丢失,并将这些“问题数据”统一归集管理,便于后续定位和清洗。

job.writer.write_mode

1. 参数概述

  • 参数名: job.writer.write_mode
  • 适用范围: Hive Sink
  • 单位: 无
  • 默认值: overwrite
  • 核心作用: 定义数据写入 Hive 表的行为模式,目前主要支持 overwrite(覆盖)和 directlyInsert(追加)。

2. 适用场景

  • 全量更新: 当任务需要用最新的数据完全替换某个分区或整张表的数据时,使用 overwrite 模式。这是批处理任务最常见的模式。例如,每日计算前一天的全量指标并覆盖写入 dt=昨天 的分区。
  • 增量追加: 当任务需要在现有数据的基础上,追加新的数据时,使用 directlyInsert 模式。例如,持续不断地将新的日志数据追加到当天的分区中。

3. 调参建议 / 推荐配置

  • 默认推荐: overwrite。它能保证任务重跑时的幂等性,即无论任务成功运行多少次,最终分区的数据都是最后一次成功运行的结果,不会产生重复数据。
  • 增量场景: 仅在业务逻辑明确为增量追加,且能处理好重跑可能导致的数据重复问题时,才使用 directlyInsert。
  • 不支持 insert: 请注意,标准的 insert 模式当前不支持,错误配置会导致任务失败。

4. 参数联动

  • job.writer.partition: write_mode 的作用域是 partition 参数所指定的分区。
    • 在 overwrite 模式下,如果是静态分区,它会删除并重建该分区;如果是动态分区,它会删除本次任务涉及到的所有动态生成的分区,然后写入新数据。
  • job.writer.enable_partition_dir_rename: overwrite 模式下开启此参数,可以获得更好的提交性能。

5. FAQ(用户提问)

  • 问: overwrite 和 directlyInsert 有什么本质区别?
    • 答: overwrite 在写入数据前会先清空目标分区。directlyInsert 则直接在目标分区现有数据的基础上创建新文件进行写入。
  • 问: 如果我的 overwrite 任务失败重跑,数据会丢失吗?
    • 答: 不会。overwrite 的清空和写入通常是一个原子性操作。在任务成功提交(commit)之前,旧数据不会被真正删除。如果任务中途失败,分区会回滚到任务开始前的状态。
  • 问: directlyInsert 模式下,如果任务重跑了怎么办?
    • 答: 数据会重复。例如,一个任务向分区写入了 100 条数据,如果它被重跑一次,分区里最终会有 200 条数据。因此,使用 directlyInsert 模式时,下游应用需要有去重的能力,或者上游调度系统需要保证任务不会被重复执行。

6. 注意事项

  • 幂等性: overwrite 是保证任务幂等性的关键。在不确定时,优先选择 overwrite。
  • 动态分区下的 Overwrite: 当使用动态分区时,overwrite 的行为是“覆盖本次写入涉及的所有分区”。例如,如果任务写入了 dt=1, dt=2 两个分区,它只会清空这两个分区,而不会影响 dt=3。

7. 总结说明

job.writer.write_mode 控制着数据的写入方式。overwrite(覆盖)是默认且推荐的模式,它能保证任务重跑的幂等性,适用于全量更新场景。directlyInsert(追加)用于增量数据写入,但使用时必须注意重跑可能导致的数据重复问题。请根据您的业务需求审慎选择。

job.writer.storage_type

1. 参数概述

  • 参数名: job.writer.storage_type
  • 适用范围: Hive Sink
  • 单位: 无
  • 默认值: hdfs
  • 核心作用: 指定 Hive 表底层数据实际存储的文件系统类型。

2. 适用场景

  • HDFS: 当您的数据湖构建在 Hadoop Distributed File System (HDFS) 之上时,使用 hdfs。这是最传统的 Hadoop 生态默认存储。
  • 对象存储 (TOS/S3): 当数据湖采用云上的对象存储作为底座时(如字节跳动的 TOS、AWS 的 S3),需要将此参数配置为 tos 等对应值。
  • 加速文件系统: 在特定场景下,可能会使用 lasfs(Lustre)或 raw_tos(直通 TOS,绕过某些缓存层)等,以获取特定的性能或功能。

3. 调参建议 / 推荐配置

  • 根据数据源选择: 此参数应与您在平台数据源配置中选择的集群类型保持一致。通常情况下,用户无需手动配置,系统会根据数据源信息自动填充。
  • 云上环境: 在公有云或私有云环境,tos 是常见的配置。

4. 参数联动

  • job.writer.emr_hadoop_conf: storage_type 的选择会决定需要加载哪一套 Hadoop 文件系统客户端配置。例如,选择 tos 会加载与 TOS 交互所需的 Access Key、Endpoint 等配置。
  • proton.cache.enable: 这是一个特殊的联动。如果在 Hadoop 配置中开启了 proton.cache.enable=true,即使 storage_type 配置为 tos,系统也会在内部强制将其转换为 raw_tos,以配合 Proton 缓存层的行为。

5. FAQ(用户提问)

  • 问: 我怎么知道该填什么值?
    • 答: 您通常不需要手动填写。在您选择写入的数据源时,平台已经知道了其底层的存储类型,并会自动配置此参数。如果您正在进行非常规的跨系统数据同步,请咨询目标集群的管理员其存储类型。
  • 问: tos 和 raw_tos 有什么区别?
    • 答: tos 是标准的访问对象存储的方式。raw_tos 是一种特殊的访问模式,通常用于配合名为“Proton”的缓存加速服务,它会绕过一些客户端或代理层的缓存,直接与对象存储后端交互。除非您正在使用 Proton,否则不应配置为 raw_tos。
  • 问: 填错了会怎么样?
    • 答: 任务会因无法找到正确的文件系统实现或缺少必要的认证信息而失败。报错信息通常与 "FileSystem not supported" 或 "No FileSystem for scheme..." 相关。

6. 注意事项

  • 与环境强相关: 此参数的配置完全取决于您的基础设施,没有通用的“最优值”。
  • 通常无需手动配置: 重复强调,此参数通常由系统根据数据源自动管理。

7. 总结说明

job.writer.storage_type 用于声明 Hive 表底层所使用的文件系统类型,如 hdfs 或 tos(对象存储)。该参数与您的数据基础设施紧密绑定,在绝大多数情况下,您无需手动配置,只需正确选择数据源,系统便会自动处理。

job.writer.emr_hive_conf

1. 参数概述

  • 参数名: job.writer.emr_hive_conf
  • 适用范围: Hive Sink
  • 单位: 无
  • 默认值: 根据数据源(或 cid)自动从配置中心获取
  • 核心作用: 提供一整套用于初始化 HiveConf 的配置项。HiveConf 是 Hive 客户端的核心配置对象,包含了连接 Metastore、执行 DDL、权限控制等所需的所有信息。

2. 适用场景

  • 自动配置: 在标准流程中,此参数由系统根据用户选择的数据源自动填充,包含了连接目标 Hive 集群所需的所有标准配置。用户无需关心其内容。
  • 临时覆盖与调试: 当需要临时修改某个 Hive 客户端的行为,而又不想或无法更改数据源的全局配置时,可以通过手动添加或修改 emr_hive_conf 中的键值对来实现。例如,临时调大 Metastore 客户端的超时时间。

3. 调参建议 / 推荐配置

  • 默认推荐: 不配置,使用系统从数据源获取的默认配置。
  • 临时调试: 仅在排查特定问题(如 Metastore 连接超时)并得到技术支持指导时,才考虑手动修改。例如,在 JSON 配置中添加 "hive.metastore.client.socket.timeout": "600" 来延长超时时间。

4. 参数联动

  • job.writer.cid: 如果未提供 emr_hive_conf,系统会使用 cid 从配置中心拉取配置来填充它。
  • job.writer.emr_hadoop_conf: HiveConf 继承自 Hadoop 的 Configuration,因此 emr_hadoop_conf 中的配置也会影响到 Hive 的行为,尤其 HDFS 相关的部分。

5. FAQ(用户提问)

  • 问: emr_hive_conf 和 hive-site.xml 文件是什么关系?
    • 答: 您可以把 emr_hive_conf 理解为一个内容为 hive-site.xml 的、程序化的 Map 结构。它最终会被用来构建一个等效于加载了 hive-site.xml 的配置对象。
  • 问: 我可以在这里配置哪些参数?
    • 答: 理论上,任何 hive-site.xml 中合法的参数都可以在这里配置。但随意修改可能导致非预期的后果。
  • 问: 如果我只想改动其中一个值,需要把所有的配置都复制过来吗?
    • 答: 不需要。如果您在任务配置中手动指定了 emr_hive_conf,它通常会与从数据源获取的配置进行合并,您手动指定的值会覆盖默认值。但具体合并策略可能因平台版本而异,建议先小范围测试。

6. 注意事项

  • 高阶参数: 这是非常底层的参数,改动前请务必理解您要修改的 Hive 配置项的含义和潜在影响。
  • 风险: 错误的配置(如错误的 Metastore URI)将直接导致任务失败。

7. 总结说明

job.writer.emr_hive_conf 承载了连接和操作 Hive 所需的全部客户端配置。在日常使用中,此参数由系统根据您选择的数据源自动管理,无需用户干预。它为高级用户和问题排查提供了一个临时覆盖默认配置的入口,但任何修改都应在充分理解其影响后谨慎进行。

job.writer.emr_hadoop_conf

1. 参数概述

  • 参数名: job.writer.emr_hadoop_conf
  • 适用范围: Hive Sink
  • 单位: 无
  • 默认值: 根据数据源(或 cid)自动获取
  • 核心作用: 提供一整套用于初始化 Hadoop JobConf 的配置项。JobConf 控制着所有与 Hadoop 生态组件(尤其是 HDFS 和 MapReduce/YARN 客户端)交互的行为。

2. 适用场景

  • 文件系统交互: 控制与底层文件系统(HDFS, TOS 等)交互的细节,如副本数、块大小、客户端重试策略、超时时间等。
  • Kerberos 认证: 当启用 Kerberos 时,相关的认证配置(如 RPC 保护级别)会包含在这里。
  • 性能调优: 调整一些影响写入性能的底层参数,例如 dfs.client.socket-timeout。
  • Proton 缓存: proton.cache.enable 这个关键参数就定义在此处,用于决定是否启用客户端缓存。

3. 调参建议 / 推荐配置

  • 默认推荐: 与 emr_hive_conf 类似,强烈建议使用系统根据数据源提供的默认配置,不要手动修改。
  • 排障专用: 仅在排查底层文件系统问题(如连接 NameNode 超时、写数据慢、权限问题)时,根据技术支持的建议进行调整。
  • 示例: 在排查写入 HDFS 超时问题时,可能会被建议临时调大 "dfs.client.socket-timeout": "180000"。

4. 参数联动

  • job.writer.extra_config: extra_config 中的内容会与 emr_hadoop_conf 合并,作为 JobConf 的补充。
  • job.writer.storage_type: storage_type 决定了 emr_hadoop_conf 中哪些与文件系统相关的配置(如 fs.tos.* 或 fs.defaultFS)是必需的。
  • proton.cache.enable: 此参数的存在与否会直接影响 storage_type 的最终解释。

5. FAQ(用户提问)

  • 问: emr_hadoop_conf 和 core-site.xml/hdfs-site.xml 是什么关系?
    • 答: emr_hadoop_conf 在功能上等价于将 core-site.xml 和 hdfs-site.xml 等多个 Hadoop 配置文件的内容合并后的一个 Map 结构。
  • 问: 我应该在哪里修改 HDFS 客户端的重试次数?
    • 答: 可以在 emr_hadoop_conf 中添加或修改类似 dfs.client.retry.policy.enabled 和 dfs.client.retry.max.attempts 这样的参数。但再次强调,这些都属于专家级操作。
  • 问: emr_hive_conf 和 emr_hadoop_conf 有什么区别?
    • 答: emr_hadoop_conf 更底层,主要负责与存储(HDFS)和资源调度(YARN)的交互。emr_hive_conf 更上层,负责与 Hive 元数据(Metastore)和 Hive 执行逻辑的交互。HiveConf 是 HadoopConf 的子集,因此所有 Hadoop 配置对 Hive 客户端也可见。

6. 注意事项

  • 影响范围广: emr_hadoop_conf 中的配置会影响到所有基于 Hadoop API 的操作,改动需非常谨慎。
  • 常见报错关键字: 配置错误可能导致 connection refused, query timeout, permission denied 等 HDFS 或 YARN 客户端级别的错误。

7. 总结说明

job.writer.emr_hadoop_conf 是控制任务与底层 Hadoop(尤其是 HDFS)交互行为的核心配置集合。它由系统根据数据源自动管理,用户通常无需接触。这是一个强大的、但同时也很危险的参数,任何手动修改都应仅限于在专家指导下进行问题排查。

job.writer.extra_config

1. 参数概述

  • 参数名: job.writer.extra_config
  • 适用范围: Hive Sink
  • 单位: 无
  • 默认值: 无 (空 Map)
  • 核心作用: 作为 job.writer.emr_hadoop_conf 的一个补充,提供一个额外的、用户可以自由添加 Hadoop 配置的入口。其内容最终会与 emr_hadoop_conf 合并,共同作用于 JobConf。

2. 适用场景

  • 用户自定义配置: 当 emr_hadoop_conf 由系统管理,但用户又需要注入少量自定义的 Hadoop 配置时,使用此参数最为合适。它避免了直接覆盖复杂的 emr_hadoop_conf 整体。
  • 临时测试: 快速测试某个 Hadoop 参数的效果,而不想影响数据源的默认配置。

3. 调参建议 / 推荐配置

  • 按需添加: 只添加您确实需要覆盖或新增的 Hadoop 参数。
  • 示例:
    • 如果想启用 Proton 缓存,但又不想修改 emr_hadoop_conf,可以在 extra_config 中添加 {"proton.cache.enable": "true"}。

4. 参数联动

  • job.writer.emr_hadoop_conf: extra_config 的内容会叠加在 emr_hadoop_conf 之上。如果存在同名key,extra_config 中的值通常会覆盖 emr_hadoop_conf 中的值(具体合并策略取决于代码实现,但覆盖是常见行为)。

5. FAQ(用户提问)

  • 问: extra_config 和 emr_hadoop_conf 我应该用哪个?
    • 答: 优先考虑使用 extra_config。emr_hadoop_conf 是系统管理的一大块配置,直接修改它容易出错。extra_config 则像一个轻量级的“补丁”,只关注您想改动的几个点,更安全、更清晰。
  • 问: 我可以在 extra_config 里配置 Hive 的参数吗?
    • 答: 可以,但不推荐。因为 HiveConf 继承自 HadoopConf,所以理论上是可行的。但为了配置的清晰和可维护性,Hive 相关的参数建议通过 emr_hive_conf 来覆盖,Hadoop 相关的参数通过 extra_config 来覆盖。

6. 注意事项

  • 用途清晰: 将此参数专门用于补充 Hadoop 配置,保持职责单一。
  • 合并逻辑: 请注意,最终生效的是合并后的结果。在排查问题时,需要同时考虑 emr_hadoop_conf 和 extra_config 的内容。

7. 总结说明

job.writer.extra_config 为用户提供了一个向任务注入自定义 Hadoop 配置的便捷入口。当您需要微调底层 HDFS 客户端行为或启用某些特殊功能(如客户端缓存)时,推荐使用此参数,而非直接修改由系统管理的、庞大的 emr_hadoop_conf。

job.writer.hive_parquet_compression

1. 参数概述

  • 参数名: job.writer.hive_parquet_compression
  • 适用范围: Hive Sink
  • 单位: 无
  • 默认值: 若不配置,则最终兜底为 gzip
  • 核心作用: 设置写入 Hive 的 Parquet 文件的压缩算法。

2. 适用场景

  • 存储与性能权衡:
    • 高压缩率场景: 当存储成本是主要考量时,可以选择 gzip 或 zstd,它们能提供较高的压缩比,但压缩和解压时消耗的 CPU 较多。
    • 高查询性能场景: 当查询速度是主要考量时,可以选择 snappy 或 lzo。它们的压缩比略低,但压缩和解压速度非常快,能有效降低查询时的 CPU 开销,提升查询性能。
  • 数据特征适应: 不同的压缩算法对不同类型的数据(如文本、数值)有不同的效果,可以根据数据特征进行选择。

3. 调参建议 / 推荐配置

  • 吞吐优先 (推荐): snappy。它在压缩率和 CPU 开销之间取得了很好的平衡,是目前大数据领域最主流的通用压缩算法,能为下游查询提供良好的性能。
  • 存储优先: gzip。如果存储空间非常敏感,可以选择 gzip。
  • 默认行为:
    1. 优先使用 Hive 表自身 TBLPROPERTIES 中定义的 parquet.compression。
    2. 如果表未定义,则检查任务配置中是否显式提供了 job.writer.hive_parquet_compression。
    3. 如果任务也未配置,则最终兜底使用 gzip。

4. 参数联动

  • job.writer.parquet_config: 也可以通过 parquet_config 这个更通用的参数来设置 {"parquet.compression": "snappy"},效果相同。
  • writable_extractor_type: 此参数必须在 writable_extractor_type 为 parquet 时才有意义。

5. FAQ(用户提问)

  • 问: snappy 和 gzip 我应该怎么选?
    • 答: 如果不确定,就选 snappy。它能提供更快的查询速度,这在大多数分析型场景中比节省一点存储空间更重要。只有在您的存储预算极其紧张,且能接受查询变慢时,才考虑 gzip。
  • 问: 我在任务里配置了 snappy,为什么没生效,最后还是 gzip?
    • 答: 很可能是因为您的目标 Hive 表的属性(TBLPROPERTIES)里已经强制指定了 parquet.compression 为 gzip。表的配置优先级高于任务的配置。您需要修改表属性才能让任务配置生效。
  • 问: 这个参数支持哪些压缩算法?
    • 答: 支持 Parquet 格式标准支持的所有算法,常见的有 uncompressed, snappy, gzip, lzo, brotli, lz4, zstd。

6. 注意事项

  • 表配置优先: 一定要记住,Hive 表自身的属性会覆盖任务中的此项配置。
  • 下游兼容性: 确保您选择的压缩算法能够被所有下游查询引擎(如 Presto, Spark SQL)支持。snappy 和 gzip 的兼容性最好。

7. 总结说明

job.writer.hive_parquet_compression 用于设定输出 Parquet 文件的压缩算法,是平衡存储成本和查询性能的关键参数。我们推荐使用 snappy 以获得更优的查询性能。请注意,该参数的效力低于 Hive 表自身的属性设置,如果表已指定压缩格式,则任务配置会被忽略。

job.writer.parquet_config

1. 参数概述

  • 参数名: job.writer.parquet_config
  • 适用范围: Hive Sink
  • 单位: 无
  • 默认值: 无
  • 核心作用: 以 JSON 字符串的形式,向任务注入任意数量的、细粒度的 Parquet 相关配置项。这是一个专家级的调优参数。

2. 适用场景

  • 精细化性能调优:
    • 调整行组大小 (parquet.block.size): 行组是 Parquet 文件中列式存储的基本单元。较大的行组可以提升压缩率和顺序扫描性能,但需要更多内存。默认值通常是 128MB。
    • 调整页大小 (parquet.page.size): 页是行组内部的数据组织单元。较大的页大小可以提升压缩率,但可能在点查时带来更多 I/O。默认值通常是 1MB。
    • 调整字典编码 (parquet.enable.dictionary): 控制是否启用字典编码。对于低基数列,字典编码能极大地提升压缩率和过滤性能。
  • 启用或禁用特定功能: 例如,禁用 Parquet 的 CRC 校验 (parquet.validation=false) 来在极端情况下压榨写入性能(有数据损坏风险)。

3. 调参建议 / 推荐配置

  • 保持默认: 对于绝大多数用户和场景,Parquet 的默认配置已经足够优化,无需调整此参数。
  • 专家建议: 仅在有明确的性能瓶颈,并得到资深数据工程师或技术支持的建议时,才考虑修改。
  • 示例:
    • 调大行组大小以适应超大文件场景: {"parquet.block.size": "268435456"} (256MB)
    • 禁用字典编码以排查特定数据类型的编码问题: {"parquet.enable.dictionary": "false"}

4. 参数联动

  • job.writer.hive_parquet_compression: 可以在此参数中设置压缩,如 {"parquet.compression": "snappy"},其效果与直接配置 job.writer.hive_parquet_compression 类似,但配置方式更通用。

5. FAQ(用户提问)

  • 问: 我应该从哪里入手调优这些 Parquet 参数?
    • 答: 不建议用户自行“探索式”调优。Parquet 的内部参数相互关联,且效果与数据特征紧密相关。如果没有深厚的理论知识和实践经验,盲目调整很可能起反作用。正确的做法是,当遇到性能问题时,向平台方或数据专家求助,让他们根据您的数据和场景给出具体的调优建议。
  • 问: 这个参数和 Hive 表属性里的 Parquet 配置是什么关系?
    • 答: 与压缩配置类似,此处的配置会与表属性中的配置进行合并,且表属性的优先级通常更高。

6. 注意事项

  • 高风险操作: 这是一个非常底层的调优参数,不当的配置可能严重影响文件格式、读写性能甚至数据正确性。
  • JSON 格式: 参数值必须是严格的 JSON Map 字符串,例如 {"key1": "value1", "key2": "value2"}。格式错误会导致任务解析失败。
  • 仅在显式出现时生效: 代码逻辑决定了只有当 job.writer.parquet_config 这个字段在任务配置中明确出现时,其内容才会被解析和应用。

7. 总结说明

job.writer.parquet_config 是一个提供给专家的、用于对 Parquet 文件格式进行精细化调优的接口。它允许您调整行组大小、页大小、字典编码等底层参数。对于普通用户,强烈建议不要使用此参数,保持 Parquet 的默认配置即可获得良好的性能。

job.writer.enable_partition_dir_rename

1. 参数概述

  • 参数名: job.writer.enable_partition_dir_rename
  • 适用范围: Hive Sink
  • 单位: 无
  • 默认值: FALSE
  • 核心作用: 改变任务成功后的数据提交(commit)策略。从默认的“逐文件移动”模式,切换到更高效的“重命名整个目录”模式。

2. 适用场景

  • 大批量文件写入: 当一个任务会向单个分区写入大量小文件时(例如,上游并行度很高,或者未使用合并小文件策略),默认的逐文件 rename 会对 NameNode 造成巨大压力,并消耗大量时间。
  • 高流量、高并发任务: 在实时或准实时的高频ETL任务中,commit 阶段的时间占比可能很高,启用此参数可以显著缩短 commit 时间,提升任务的整体吞吐和时效性。
  • 动态分区写入: 当一个任务动态生成了大量新分区时,此策略同样适用,它可以一次性提交一个分区下的所有文件。

3. 调参建议 / 推荐配置

  • 吞吐优先/高流量场景 (强烈推荐): 设置为 true。
    • 预期效果: 任务的 commit 阶段耗时将从分钟级降低到秒级,NameNode 的 RPC 负载显著下降,任务整体运行时间缩短。
  • 低流量/小文件数场景: 保持默认 false 即可。当文件数量很少时(例如只有几个文件),两种策略的性能差异不明显。

4. 参数联动

  • job.writer.write_mode: 此参数主要在 overwrite 和 directlyInsert 模式下有意义。它优化的是将临时目录的数据发布到最终目录的过程。

5. FAQ(用户提问)

  • 问: 这个参数的原理是什么?
    • 答:
      • 默认策略 (false): 任务先在 HDFS 上创建一个临时目录(如 .../.tmp/attempt_xxx/dt=20240101/),并将所有数据文件写入其中。Commit 时,它会逐一将这些文件 rename 到最终的目标分区目录(.../warehouse/my_table/dt=20240101/)。如果有 1000 个文件,就需要 1000 次 rename 操作。
      • 目录重命名策略 (true): 任务同样写临时目录。但在 commit 时,它会先将最终目录 rename 为一个备份目录,然后直接将临时目录 rename 为最终目录。这个过程通常只需要 2-3 次 rename 操作,与文件数量无关。
  • 问: 为什么默认是 false?听起来 true 总是更好。
    • 答: 启用目录重命名策略对任务提交流程的原子性和异常处理有更严格的要求。在早期,为了追求最稳妥的兼容性,可能默认采用了更传统的逐文件移动方式。随着技术演进和稳定性验证,目录重命名已成为更优的选择。
  • 问: 启用这个参数有什么风险吗?
    • 答: 在现代的数据平台环境中,该功能的实现已经相当成熟,风险极低。它极大地提升了 commit 效率,带来的收益远大于潜在风险。

6. 注意事项

  • NameNode 友好: 启用此参数是对 NameNode 最友好的做法,尤其是在大规模集群中。
  • 检查任务日志: 您可以在任务的 JM (JobManager) 日志中观察 commit 阶段的耗时,来验证开启此参数前后的效果。

7. 总结说明

job.writer.enable_partition_dir_rename 是一个关键的性能优化参数。当您的任务需要向单个分区写入大量文件时,强烈建议将此参数设置为 true。它能将数据提交阶段的耗时从分钟级锐减至秒级,显著提升任务效率,并减轻底层文件系统的压力。

job.writer.convert_error_column_as_null

1. 参数概述

  • 参数名: job.writer.convert_error_column_as_null
  • 适用范围: Hive Sink
  • 单位: 无
  • 默认值: FALSE
  • 核心作用: 定义当数据行中的某个字段在进行类型转换时发生错误,应如何处理。如果设置为 true,该字段将被当作 NULL 值写入;如果为 false,则整条记录被视为脏数据,并可能导致任务失败。

2. 适用场景

  • 容忍部分数据失真: 当业务可以接受少量字段因格式问题而丢失(变为 NULL),但要求整个任务必须成功运行时,可以开启此参数。例如,一个包含用户信息的宽表,其中某个非关键的日期字段格式不规范,您不希望因为这一个字段的问题导致整行用户数据都写入失败。
  • 数据清洗前置: 在数据质量不佳、上游数据源格式多变的初期接入阶段,开启此项可以暂时保证数据能入库,以便后续进行探查和清洗。

3. 调参建议 / 推荐配置

  • 数据质量优先 (默认推荐): 保持 false。这能让问题在第一时间暴露出来,迫使您去修复上游的数据质量问题或ETL逻辑,而不是悄无声息地接受错误数据。
  • 任务成功优先: 设置为 true。当任务的稳定性、持续运行比个别字段的精确性更重要时采用此配置。

4. 参数联动

  • job.writer.columns: 此参数作用于 columns 中定义的每个字段的类型转换过程。

5. FAQ(用户提问)

  • 问: 什么样的错误会触发这个机制?
    • 答: 典型的例子是:上游是一个字符串 “hello”,但目标 Hive 列的类型是 INT。在将 “hello” 转换为整数时会发生 NumberFormatException。如果此参数为 true,这个字段就会以 NULL 写入;如果为 false,任务就会报错或记录一条脏数据。
  • 问: 开启这个参数后,我怎么知道哪些数据被转成了 NULL?
    • 答: 该机制本身通常不会提供详细的“转换报告”。您需要在任务成功后,去查询目标表中 IS NULL 的数据,并与源数据进行比对,才能定位到被转换的记录。因此,开启此参数也意味着问题排查的成本会增加。
  • 问: 这和 default_partition_value 有什么区别?
    • 答: default_partition_value 只作用于动态分区键字段,并且是当源值为 NULL 时提供一个默认分区名。而 convert_error_column_as_null 作用于所有非分区键的普通字段,并且是在类型转换失败时将该字段的值变为 NULL。

6. 注意事项

  • 数据静默丢失风险: 开启此参数的最大风险在于,它会“隐藏”上游的数据质量问题,导致数据在您不知情的情况下静默地变成了 NULL。
  • 仅用于非关键字段: 即使开启,也应确保它只影响那些业务上不那么重要的字段。关键业务字段(如订单ID、金额)的转换失败,应让任务直接失败。

7. 总结说明

job.writer.convert_error_column_as_null 是一个在数据质量和任务稳定性之间进行取舍的参数。默认情况下(false),系统会严格要求数据类型匹配,任何转换失败都会导致错误,以保证数据质量。当您可以容忍部分非关键字段因格式问题丢失,并优先保障任务能持续成功运行时,可将其设置为 true。

job.writer.is_drop_delims

1. 参数概述

  • 参数名: job.writer.is_drop_delims
  • 适用范围: Hive Sink
  • 单位: 无
  • 默认值: FALSE
  • 核心作用: 在写入数据之前,移除字符串字段中可能存在的换行符 (\n, \r) 以及 Hive 默认的字段和行分隔符(如 \u0001, \u0002)。这主要借鉴自 Sqoop 工具的 –hive-drop-import-delims 选项。

2. 适用场景

  • 防止格式破坏: 当上游的源数据(尤其是自由文本字段,如用户评论、备注等)中可能包含换行符或其他特殊控制字符时,这些字符如果被直接写入文本格式的 Hive 表(如 TextFile),可能会破坏文件的行列结构,导致下游读取时发生错位或解析失败。
  • 数据清洗: 作为一种简单的数据清洗手段,确保写入的数据不含可能干扰 Hive 处理的默认分隔符。

3. 调参建议 / 推荐配置

  • Parquet/ORC 格式: 如果您的目标表是 Parquet 或 ORC 等列式存储格式,通常无需开启此参数。这些格式自身有健全的编码和边界定义,不会被字段内的特殊字符干扰。
  • TextFile 格式: 如果目标表是 TextFile 格式,且您怀疑源数据中含有换行符等特殊字符,建议设置为 true 以增加数据写入的安全性。
  • 默认推荐: 保持 false。优先使用 Parquet 等现代存储格式,从根本上避免此类问题。

4. 参数联动

  • 此参数独立作用于数据清洗阶段,与其他参数无强联动。

5. FAQ(用户提问)

  • 问: 开启这个参数会影响性能吗?
    • 答: 会有轻微的性能影响,因为需要对每个字符串字段进行遍历和替换操作。对于大多数任务,这种影响可以忽略不计。但对于数据量极大且字符串字段非常多的任务,可能会观察到 CPU 使用率的少量增加。
  • 问: 这个参数会移除哪些字符?
    • 答: 主要移除换行符 \n、回车符 \r,以及 Hive 用作默认分隔符的一些不常见的控制字符。
  • 问: 如果我的文本字段本身就需要保留换行符怎么办?
    • 答: 那么就不应该开启此参数。同时,您应该选择像 Parquet 这样能够安全处理字段内特殊字符的存储格式,而不是 TextFile。

6. 注意事项

  • 适用格式有限: 此参数主要针对 TextFile 格式有意义。对于 Parquet/ORC 等二进制列存格式,其作用不大。
  • 数据内容变更: 请注意,开启此参数会改变您的数据内容(移除了特定字符)。请确保这对您的业务逻辑没有影响。

7. 总结说明

job.writer.is_drop_delims 是一个数据清洗选项,用于移除字符串中的换行符及 Hive 默认分隔符,以防止在写入 TextFile 等纯文本格式时破坏文件结构。当您使用 Parquet 等现代列式存储格式时,通常无需开启此参数。仅在向 TextFile 写入且源数据质量存疑时,可考虑开启以增强鲁棒性。

job.writer.empty_list_map_write_null / output.empty_list_map_write_null

1. 参数概述

  • 参数名: job.writer.empty_list_map_write_null (任务级), output.empty_list_map_write_null (全局级)
  • 适用范围: Hive Sink
  • 单位: 无
  • 默认值: FALSE
  • 核心作用: 控制当遇到空的 List 或 Map 类型字段时,是将其写入为 Hive 中的 NULL,还是写入为空集合([] 或 {})。

2. 适用场景

  • 下游处理逻辑统一: 当下游的数据消费者(如查询引擎、报表工具)对 NULL 和空集合的处理方式不同,且您希望统一为其中一种时。例如,下游的 SQL 查询中使用 COUNT(map_col) 时,NULL 和空 Map 的结果可能不同。
  • 数据模型对齐: 如果您的数据模型定义中,一个不存在的集合与一个空的集合在语义上应被视为 NULL,则可以开启此参数。

3. 调参建议 / 推荐配置

  • 默认推荐 (FALSE): 保持默认值 false。这能最真实地反映源数据的状态:空集合([], {})就是空集合,NULL 就是 NULL。这种区分在数据分析中通常是有价值的。
  • 需要转为 NULL 时 (TRUE): 当您的业务逻辑明确要求将所有空集合视为 NULL 对待时,将 job.writer.empty_list_map_write_null 设置为 true。

4. 参数联动

  • 优先级: job.writer.empty_list_map_write_null 是任务级别的配置,其优先级高于 output.empty_list_map_write_null 这个应用级别的全局配置。
  • 配置逻辑: 系统会首先检查任务是否配置了 job.writer.empty_list_map_write_null。如果配置了,则以此为准。如果未配置,则会去查找全局的 output.empty_list_map_write_null 配置。如果全局也未配置,则最终默认为 false。

5. FAQ(用户提问)

  • 问: NULL 和空集合在 Hive 里有什么区别?
    • 答:
      • NULL: 表示该值未知、缺失或不适用。
      • 空集合 ([], {}): 表示该值存在,但集合内没有任何元素。
      • 在很多函数和操作中,它们的行为不同。例如 size(col) 函数,对于 NULL 列会返回 NULL,对于空集合会返回 0。
  • 问: 我应该修改哪个参数,job.writer.* 还是 output.*?
    • 答: 始终优先使用 job.writer.empty_list_map_write_null。这是一个针对单个任务的精细化控制,影响范围可控。output.empty_list_map_write_null 是全局配置,修改它会影响平台上所有未显式配置此项的任务,风险较大,不建议普通用户修改。

6. 注意事项

  • 语义变更: 开启此参数会改变数据的原始语义,请确保下游系统能够正确理解和处理这种变更。
  • 咨询下游: 在决定是否开启前,最好与使用该数据的下游团队沟通,确认他们期望如何处理空集合。

7. 总结说明

job.writer.empty_list_map_write_null 参数允许您选择如何处理空的 List 或 Map 字段:是将其作为 NULL 写入,还是保留为空集合([]/{})。默认行为是保留为空集合,这能更精确地反映数据原貌。仅当您的下游业务逻辑明确需要将两者统一视为 NULL 时,才开启此选项。建议使用 job.writer. 前缀的参数进行任务级配置。

job.writer.date_to_string_as_long

1. 参数概述

  • 参数名: job.writer.date_to_string_as_long
  • 适用范围: Hive Sink
  • 单位: 无
  • 默认值: FALSE
  • 核心作用: 当上游数据源的字段类型是 Date, Time 或 Timestamp,而目标 Hive 表的对应列类型是 String 时,此参数决定了转换的行为。如果为 true,会先将日期时间类型转换为一个长整型(Long)的 Unix 时间戳,然后再将这个数字作为字符串写入。

2. 适用场景

  • 存储时间戳字符串: 当您不希望将日期存储为格式化的字符串(如 “2024-04-13 10:00:00”),而是希望存储为其对应的 Unix 时间戳的字符串形式(如 “1712973600”)时,应开启此参数。这在某些需要跨系统、跨语言对接,且以时间戳作为通用时间表示的场景中很常见。
  • 避免时区问题: 以统一的 UTC 时间戳(Long 型)进行中转和存储,可以有效避免因不同系统、不同客户端时区设置不一导致的日期时间解析混乱问题。

3. 调参建议 / 推荐配置

  • 格式化字符串 (默认 FALSE): 保持默认。这会产生人类可读的日期时间字符串(如 yyyy-MM-dd HH:mm:ss.SSS),在大多数报表和即席查询场景下更直观。
  • 时间戳字符串 (TRUE): 当下游系统需要以时间戳形式消费数据,或为了严格统一时间标准时,设置为 true。

4. 参数联动

  • job.writer.date_precision: 当 date_to_string_as_long 为 true 时,此参数决定了生成的 Unix 时间戳是秒级还是毫秒级。

5. FAQ(用户提问)

  • 问: 什么是 Unix 时间戳?
    • 答: Unix 时间戳是指从格林尼治时间 1970年01月01日00时00分00秒 起至现在的总秒数(或毫秒数)。它是一个长整型数字,不包含任何时区信息,因此是跨系统交换时间数据的理想选择。
  • 问: 如果我不开启这个参数,日期会怎么转成字符串?
    • 答: 它会使用一个标准的日期时间格式(如 yyyy-MM-dd HH:mm:ss.SSS)将 Date 对象格式化为一个字符串。
  • 问: 开启后,下游怎么把这个时间戳字符串再转回日期?
    • 答: 几乎所有的查询引擎和编程语言都提供了从 Unix 时间戳(无论是数字还是字符串形式)转换回日期时间对象的函数。例如,在 Hive SQL 中可以使用 from_unixtime() 函数。

6. 注意事项

  • 下游兼容性: 开启前请与下游确认,他们是否期望接收时间戳形式的字符串。
  • 精度选择: 同时需要关注 job.writer.date_precision 参数,以确定时间戳的精度是秒还是毫秒。

7. 总结说明

job.writer.date_to_string_as_long 参数控制着如何将日期时间类型的数据转换为字符串。默认情况下,它会生成人类可读的格式化字符串(如 "2024-04-13 10:00:00")。当您需要将日期时间以更通用的 Unix 时间戳(一个长整数)的字符串形式存储时,应将此参数设置为 true,并配合 job.writer.date_precision 指定时间戳的精度。

job.writer.date_precision

1. 参数概述

  • 参数名: job.writer.date_precision
  • 适用范围: Hive Sink
  • 单位: 无
  • 默认值: second
  • 核心作用: 当需要将 Date 或 Timestamp 类型转换为长整型(Long)时(例如,当 job.writer.date_to_string_as_long 为 true 时),此参数决定了转换后的时间戳精度是秒还是毫秒。

2. 适用场景

  • 秒级精度: 当下游系统或业务逻辑只需要秒级的时间戳时使用。这是大多数 Unix 系统的标准。例如,1712973600。
  • 毫秒级精度: 当需要记录更精确的时间,或者与那些默认使用毫秒级时间戳的系统(如 Java)进行交互时,应使用 millisecond。例如,1712973600123。

3. 调参建议 / 推荐配置

  • 默认推荐 (second): 保持默认的 second。秒级时间戳通用性最强,兼容性最好。
  • 需要毫秒时 (millisecond): 仅当您明确知道下游需要毫秒精度时,才将其设置为 millisecond。

4. 参数联动

  • job.writer.date_to_string_as_long: date_precision 只在 date_to_string_as_long 为 true 的场景下,或者其他直接将日期转为数字类型的场景中生效。

5. FAQ(用户提问)

  • 问: 如果我不配置这个参数,会是什么精度?
    • 答: 默认是 second(秒)。
  • 问: 秒和毫秒有什么区别?
    • 答: 毫秒级时间戳比秒级时间戳多了三位数字,代表了秒后面的毫秒部分,精度更高。一个是以秒为单位,一个是以毫秒为单位。
  • 问: 我怎么确定下游需要哪种精度?
    • 答: 查看下游系统的文档或询问其负责人。通常,Java、JavaScript 等语言环境中的时间戳默认为毫秒,而很多底层系统和脚本语言(如 Python 的 time.time())默认为秒。

6. 注意事项

  • 大小写与空格: 代码在解析此参数时,会先将其转换为大写并移除首尾空格。因此 second, Second, SECOND 都是等效的。
  • 一致性: 在一个数据链路中,应尽量保持时间戳精度的一致性,避免混用秒和毫秒,以免造成混乱。

7. 总结说明

job.writer.date_precision 用于设定日期时间转换为长整型时间戳时的精度。默认为 second(秒),您也可以根据下游系统的要求,将其配置为 millisecond(毫秒)。在进行任何日期到数字的转换时,都应确认此参数的配置符合您的精度要求。

job.writer.null_string_as_null

1. 参数概述

  • 参数名: job.writer.null_string_as_null
  • 适用范围: Hive Sink
  • 单位: 无
  • 默认值: FALSE
  • 核心作用: 控制当上游数据源中的字段值为 NULL 且目标 Hive 列类型为 String 时,是将其写入为 SQL NULL,还是写入为空字符串 “”。

2. 适用场景

  • 区分 NULL 与空字符串:
    • 语义不同: 在很多业务场景中,NULL 和空字符串的含义不同。NULL 可能代表“未知”或“不适用”,而空字符串 “” 可能代表“信息已填写,但内容为空”。
    • 查询行为不同: 在 SQL 查询中,WHERE col IS NULL 和 WHERE col = '' 的结果是完全不同的。
  • 对齐下游期望: 当下游系统对 NULL 和空字符串的处理方式有明确区分,并要求上游严格写入 SQL NULL 时,应开启此参数。

3. 调参建议 / 推荐配置

  • 默认 FALSE (写入空字符串): 保持默认。在很多 ETL 场景中,将 NULL 字符串统一处理为空字符串 “” 是一种常见的、简化下游处理的做法。
  • 需要 SQL NULL 时 (TRUE): 当您需要严格区分 NULL 和空字符串的语义时,将此参数设置为 true。

4. 参数联动

  • 无显著的参数联动。此参数独立作用于字符串类型的写入逻辑。

5. FAQ(用户提问)

  • 问: 为什么默认是写入空字符串 “” 而不是 NULL?
    • 答: 这是一种历史性的、较为“防御”的做法。因为在某些旧的系统或查询引擎中,处理 NULL 可能会有非预期的行为(例如,字符串拼接时 concat(col, 'a') 如果 col 是 NULL,结果可能也是 NULL)。将 NULL 提前转换为空字符串,可以避免这类问题,简化下游的 null 判断逻辑。
  • 问: 开启这个参数对性能有影响吗?
    • 答: 性能影响可以忽略不计。
  • 问: 开启后,是不是所有 NULL 都会变成 SQL NULL?
    • 答: 不是。此参数只对目标列是 String 类型时生效。如果目标列是 INT、BIGINT 等数值类型,上游的 NULL 值总是会被写入为 SQL NULL,不受此参数控制。

6. 注意事项

  • 仅对 String 类型有效: 再次强调,此参数只影响向 String 类型的列写入 NULL 值的行为。
  • 与 empty_list_map_write_null 的区别: 不要混淆。null_string_as_null 处理的是 String 类型的 NULL 值。而 empty_list_map_write_null 处理的是 List 或 Map 类型的空集合值。

7. 总结说明

job.writer.null_string_as_null 控制着当一个 String 类型的字段值为 NULL 时,最终写入 Hive 的是 SQL NULL 还是一个空字符串 “”。默认行为是写入空字符串。如果您的业务需要严格区分“未知”(NULL)和“空值”(“”),请将此参数设置为 true。

job.writer.kerberos_enable

1. 参数概述

  • 参数名: job.writer.kerberos_enable
  • 适用范围: Hive Sink
  • 单位: 无
  • 默认值: FALSE 或根据数据源配置
  • 核心作用: 控制是否为数据写入过程启用 Kerberos 安全认证。

2. 适用场景

  • 安全集群写入: 当目标 Hive 集群和其底层的 HDFS 开启了 Kerberos 认证时,必须将此参数设置为 true,否则所有访问都将被拒绝。
  • 非安全集群写入: 如果目标集群未开启 Kerberos,此参数必须为 false。

3. 调参建议 / 推荐配置

  • 根据数据源配置: 此参数的设置完全取决于目标集群的安全策略。在数据平台中,当您选择一个已配置为 Kerberos 集群的数据源时,系统会自动将此参数设置为 true,并填充其他相关认证信息。
  • 手动配置: 仅在您需要连接一个未在平台注册的、启用了 Kerberos 的集群时,才需要手动将其设置为 true,并同时提供 principal, keytab, krb5.conf 等配套信息。

4. 参数联动

  • job.writer.kerberos_principal: 启用 Kerberos 时必需。
  • job.writer.keytab_content_base64: 启用 Kerberos 时必需。
  • job.writer.krb5_conf_content_base64: 启用 Kerberos 时必需。
  • job.writer.kerberos_conf: 可选的额外 Kerberos 配置。
  • job.writer.kerberos_system_props: 可选的额外 Java 系统属性。
  • job.common.host_ips_mapping: 在某些复杂的网络环境下,可能需要此参数来保证 Kerberos 认证中的主机名能正确解析。

5. FAQ(用户提问)

  • 问: 什么是 Kerberos?
    • 答: Kerberos 是一种广泛用于大型网络环境中的计算机网络认证协议。它旨在为客户端/服务器应用程序提供强身份验证,确保通信双方都是其所声称的身份。在Hadoop生态中,它被用来保护对 HDFS、Hive、YARN 等服务的访问。
  • 问: 我怎么知道目标集群是否开启了 Kerberos?
    • 答: 如果您是通过平台的数据源功能来选择集群,数据源的配置信息中会注明其是否为安全集群。如果您是直接连接,可以咨询集群的管理员。一个典型的现象是,未认证的访问会收到包含 "Kerberos" 或 "GSSAPI" 字样的权限拒绝错误。
  • 问: 开启 Kerberos 会影响性能吗?
    • 答: 会有轻微的性能开销,因为每次与服务交互前,客户端都需要获取和验证票据(Ticket)。但在现代硬件和网络下,这点开销通常可以忽略不计,远低于安全带来的好处。

6. 注意事项

  • 配套参数必须齐全: 启用 Kerberos 不仅仅是把 kerberos_enable 设置为 true,还必须同时提供所有必需的认证信息(principal, keytab 等),否则认证必然失败。
  • 常见报错关键字: GSSException, Authentication failed, No valid credentials provided。

7. 总结说明

job.writer.kerberos_enable 是控制是否启用安全认证的总开关。当您需要向一个开启了 Kerberos 的安全集群写入数据时,必须将此参数设为 true,并提供所有必要的认证凭据。对于非安全集群,请保持其为 false。通常,此参数由所选的数据源自动管理。

job.writer.kerberos_principal

1. 参数概述

  • 参数名: job.writer.kerberos_principal
  • 适用范围: Hive Sink
  • 单位: 无
  • 默认值: 无,或根据数据源配置
  • 核心作用: 指定用于向 Hive 和 HDFS 进行 Kerberos 认证的身份主体(Principal)。

2. 适用场景

  • Kerberos 认证: 当 job.writer.kerberos_enable 设置为 true 时,此参数为必需。它告诉 Kerberos KDC(密钥分发中心)“我是谁”。
  • 格式: Principal 通常由三部分组成:primary/instance@REALM。
    • primary: 通常是用户名或服务名。
    • instance: 可选,用于区分一个 primary 的不同实例,如主机名。
    • REALM: 域名,必须大写。
  • 示例: dts_user/hadoop.cluster@YOUR_REALM.COM

3. 调参建议 / 推荐配置

  • 从数据源获取: 与其他 Kerberos 参数一样,此值通常从您选择的数据源配置中自动获取。
  • 精确配置: 手动配置时,必须确保 Principal 的拼写、大小写完全正确,与 Keytab 文件中的身份匹配。

4. 参数联动

  • job.writer.kerberos_enable: 仅当其为 true 时此参数才生效。
  • job.writer.keytab_content_base64: Principal 和 Keytab 必须是一对匹配的凭据。

5. FAQ(用户提问)

  • 问: 我从哪里获取这个 Principal?
    • 答: 它由您的 Kerberos 管理员或集群管理员在创建账户时提供给您。它通常与您用于访问集群的 Keytab 文件相关联。
  • 问: Principal 写错了会怎么样?
    • 答: 认证会失败。KDC 会报告找不到您声称的这个身份,或者该身份与您提供的 Keytab 不匹配。报错信息通常是 "Principal not found" 或 "Client not found in Kerberos database"。

6. 注意事项

  • 拼写和大小写: Kerberos Principal 对大小写敏感,尤其是 REALM 部分必须大写。
  • 保密性: Principal 本身不是机密信息,但它与机密的 Keytab 文件配对使用。

7. 总结说明

job.writer.kerberos_principal 指定了任务在进行 Kerberos 认证时所使用的身份。当写入安全集群时,这是一个必需参数。它通常由数据源配置自动提供,用户无需手动填写。手动配置时,请确保其值的准确性,并与配对的 Keytab 文件一致。

job.writer.keytab_content_base64

1. 参数概述

  • 参数名: job.writer.keytab_content_base64
  • 适用范围: Hive Sink
  • 单位: 无
  • 默认值: 无,或根据数据源配置
  • 核心作用: 提供 Kerberos 认证所需的 Keytab 文件的内容,并使用 Base64 编码。Keytab 文件本质上是一个包含 Principal 及其加密密钥的“密码文件”。

2. 适用场景

  • Kerberos 认证: 当 job.writer.kerberos_enable 为 true 时,此参数为必需。它向 KDC 证明“我拥有这个身份的密钥”。
  • 无文件传输: 通过将 Keytab 内容以 Base64 字符串的形式直接嵌入到任务配置中,避免了在网络上传输或在任务运行节点上存放原始的 Keytab 文件,增强了安全性。

3. 调参建议 / 推荐配置

  • 从数据源获取: 强烈建议通过在数据源中配置 Keytab,让系统自动加密和管理,并在运行时自动填充此参数。
  • 手动生成: 如果需要手动配置,请先使用命令行工具将您的 Keytab 文件转换为 Base64 字符串。例如,在 Linux/macOS 上:base64 -w 0 your_user.keytab。然后将输出的长字符串粘贴到此参数的值中。

4. 参数联动

  • job.writer.kerberos_enable: 仅当其为 true 时此参数才生效。
  • job.writer.kerberos_principal: Keytab 中的密钥必须与 Principal 对应。

5. FAQ(用户提问)

  • 问: 什么是 Keytab 文件?
    • 答: Keytab (Key Table) 文件包含了 Kerberos Principal 和其加密密钥的列表。应用程序可以使用 Keytab 文件来向 KDC 证明自己的身份,而无需用户交互式地输入密码。
  • 问: 为什么要做 Base64 编码?
    • 答: Keytab 是一个二进制文件。Base64 是一种将二进制数据转换为纯文本 ASCII 字符的方法,这使得 Keytab 的内容可以被安全地嵌入到 JSON 或其他基于文本的配置文件中进行传输。
  • 问: Keytab 内容泄露了会怎么样?
    • 答: Keytab 的保密级别等同于密码。任何获得您 Keytab 文件的人,都可以在其有效期内冒充您的身份(由 Principal 指定)访问所有您有权访问的服务。因此,必须妥善保管。

6. 注意事项

  • 高度机密: Keytab 内容是高度敏感的机密信息。在手动配置时,请注意不要将其暴露在日志、代码仓库或不安全的通信中。
  • 不要手动编辑 Base64 字符串: Base64 编码后的字符串非常长且没有明显规律,任何微小的改动都会导致解码失败和认证失败。

7. 总结说明

job.writer.keytab_content_base64 用于提供 Kerberos 认证所需的核心凭据——Keytab 文件的内容(经过 Base64 编码)。这是写入安全集群时的必需参数。为保障安全,强烈建议通过平台的数据源管理功能来上传和配置 Keytab,而不是在任务中手动粘贴其内容。

job.writer.krb5_conf_content_base64

1. 参数概述

  • 参数名: job.writer.krb5_conf_content_base64
  • 适用范围: Hive Sink
  • 单位: 无
  • 默认值: 无,或根据数据源配置
  • 核心作用: 提供 Kerberos 客户端配置文件 (krb5.conf) 的内容,并使用 Base64 编码。krb5.conf 文件告诉 Kerberos 客户端如何找到 KDC、默认的 REALM 是什么,以及加密算法等配置。

2. 适用场景

  • Kerberos 认证: 当 job.writer.kerberos_enable 为 true 时,此参数为必需。它为客户端提供了连接 KDC 的“地图”。
  • 自定义 Kerberos 环境: 当运行任务的环境没有全局的 krb5.conf 文件,或者需要为任务指定一个不同于环境默认值的 Kerberos 配置时使用。

3. 调参建议 / 推荐配置

  • 从数据源获取: 与 Keytab 类似,krb5.conf 的内容也通常由所选的数据源提供。
  • 手动生成: 如果需要手动配置,请将您的 krb5.conf 文件内容进行 Base64 编码(base64 -w 0 krb5.conf)后填入。
  • krb5.conf 核心内容示例:
[libdefaults]
  default_realm = YOUR_REALM.COM
[realms]
  YOUR_REALM.COM = {
    kdc = kdc-server1.example.com
    kdc = kdc-server2.example.com
    admin_server = kdc-server1.example.com
  }

4. 参数联动

  • job.writer.kerberos_enable: 仅当其为 true 时此参数才生效。

5. FAQ(用户提问)

  • 问: 我从哪里可以得到 krb5.conf 文件?
    • 答: 通常由您的 Kerberos 或集群管理员提供。它是一个标准配置文件,同一个集群下的所有用户使用的 krb5.conf 内容都是相同的。
  • 问: 这个文件内容是机密的吗?
    • 答: 不是。krb5.conf 只包含公开的配置信息(如服务器地址和域名),不包含任何密钥或密码,可以安全地共享。
  • 问: 如果不提供这个配置会怎么样?
    • 答: Kerberos 客户端将不知道 KDC 服务器在哪里,认证请求将无法发送,导致任务因无法建立安全上下文而失败。

6. 注意事项

  • REALM 匹配: 确保 krb5.conf 中配置的 default_realm 或 [realms] 部分与您的 Principal 中的 REALM 一致。
  • KDC 可达性: 确保任务运行的环境可以网络访问到 krb5.conf 中指定的 KDC 服务器地址。

7. 总结说明

job.writer.krb5_conf_content_base64 用于向任务提供 Kerberos 的客户端配置文件(krb5.conf)内容。它就像一张地图,指引着任务如何找到并与 Kerberos 认证服务器通信。当写入安全集群时,此为必需参数,且通常由所选数据源自动提供。

job.writer.kerberos_conf

1. 参数概述

  • 参数名: job.writer.kerberos_conf
  • 适用范围: Hive Sink
  • 单位: 无
  • 默认值: 无 (空 Map)
  • 核心作用: 提供一个向 Hadoop 安全模块注入额外配置的入口。这些配置项最终会被合并到 Hadoop Configuration 对象中,用于微调 Kerberos 或 RPC 相关的行为。

2. 适用场景

  • 覆盖默认安全配置: 当数据源提供的默认 Hadoop 安全配置不能满足特定需求时,可以使用此参数进行覆盖。例如,修改 RPC 的保护级别 (hadoop.rpc.protection)。
  • 调试安全问题: 在排查复杂的 Kerberos 认证或通信问题时,可能需要临时开启某些调试开关,如 sun.security.krb5.debug=true(注:此项更适合放在 kerberos_system_props 中)。

3. 调参建议 / 推荐配置

  • 默认不配置: 绝大多数情况下,用户无需关心此参数。
  • 专家使用: 仅在深入排查 Kerberos 问题,并得到安全或平台专家的指导时使用。
  • 示例: {"hadoop.rpc.protection": "privacy"} (要求对 RPC 数据进行加密,而非仅仅认证)。

4. 参数联动

  • job.writer.emr_hadoop_conf: kerberos_conf 的内容会与 emr_hadoop_conf 进行合并,用于构建最终的 Hadoop 配置。

5. FAQ(用户提问)

  • 问: kerberos_conf 和 emr_hadoop_conf / extra_config 有什么区别?
    • 答: 它们最终都会合并到同一个 Hadoop Configuration 对象中。kerberos_conf 在设计上意图更明确,专门用于存放与 Kerberos 安全直接相关的 Hadoop 配置,有助于保持配置的整洁和模块化。而 emr_hadoop_conf 和 extra_config 更通用。
  • 问: 我应该把 hadoop.rpc.protection 放在哪里?
    • 答: 放在 kerberos_conf 或 extra_config 都可以。但从配置的逻辑清晰度来看,放在 kerberos_conf 是一个更好的选择,因为它直接与安全相关。

6. 注意事项

  • 高阶参数: 与其他底层配置一样,不当的修改可能导致认证失败或引入安全风险。
  • 谨慎使用: 在不完全理解参数含义的情况下,请勿使用。

7. 总结说明

job.writer.kerberos_conf 是一个专家级参数,用于向任务注入额外的、与 Kerberos 安全相关的底层 Hadoop 配置。普通用户无需关心此参数。它为处理复杂的安全认证场景提供了一个灵活的配置扩展点。

job.writer.kerberos_system_props

1. 参数概述

  • 参数名: job.writer.kerberos_system_props
  • 适用范围: Hive Sink
  • 单位: 无
  • 默认值: 无 (空 Map)
  • 核心作用: 提供一个向任务运行的 JVM 注入 Java 系统属性(System Properties)的入口,这些属性主要用于影响 Java 底层安全库(如 JGSS、JAAS)的行为。

2. 适用场景

  • 开启 Kerberos 调试日志: 这是此参数最常见的用途。通过设置 {"sun.security.krb5.debug": "true"},可以在任务日志中打印出非常详细的 Kerberos 认证过程,包括票据请求、加密类型协商、错误详情等,是排查 Kerberos 疑难杂症的终极武器。
  • 配置 JAAS: 在某些特殊的认证场景下,可能需要通过系统属性来指定 JAAS(Java Authentication and Authorization Service)配置文件路径等。

3. 调参建议 / 推荐配置

  • 默认不配置: 正常运行时,无需配置此参数。
  • 排障专用: 仅在排查 Kerberos 问题时,根据需要开启调试。
  • 示例: {"sun.security.krb5.debug": "true"}。

4. 参数联动

  • 此参数直接作用于 JVM 层面,独立于 Hadoop 或 Hive 的配置。

5. FAQ(用户提问)

  • 问: kerberos_system_props 和 kerberos_conf 有什么不同?
    • 答:
      • kerberos_conf: 影响的是 Hadoop 的 Configuration 对象,控制的是 Hadoop 客户端层面的行为。
      • kerberos_system_props: 影响的是整个 Java 虚拟机(JVM),控制的是更底层的 Java 安全库的行为。
  • 问: 开启 sun.security.krb5.debug 会产生大量日志吗?
    • 答: 是的,会产生非常大量的、详细的调试日志。这对于定位问题非常有帮助,但在问题解决后应立即关闭,以免产生不必要的日志淹没正常信息,并带来轻微的性能损耗。

6. 注意事项

  • 临时使用: 调试相关的系统属性应仅作为临时排障手段,问题解决后及时移除。
  • JVM 级别影响: 在此设置的系统属性对任务所在 JVM 的所有线程都可能产生影响。

7. 总结说明

job.writer.kerberos_system_props 是一个用于调试 Kerberos 问题的强大工具。通过设置 sun.security.krb5.debug 为 true,您可以开启详细的底层认证日志,帮助快速定位认证失败的根源。此参数仅供排障时临时使用,正常运行时无需配置。

job.common.host_ips_mapping

1. 参数概述

  • 参数名: job.common.host_ips_mapping
  • 适用范围: Common
  • 单位: 无
  • 默认值: 无,或根据数据源配置
  • 核心作用: 提供一个静态的、从主机名(hostname)到 IP 地址的映射表。任务启动时,会将这些映射关系写入到 JVM 的 DNS 缓存中。

2. 适用场景

  • DNS 解析不稳定: 在某些网络环境中,DNS 服务可能不稳定或有延迟,导致任务在运行时无法正确、快速地将集群服务(如 NameNode, KDC)的主机名解析为 IP 地址,从而导致连接失败。
  • Kerberos 认证: Kerberos 对主机名的反向解析(IP 到主机名)有严格要求。提供静态映射可以避免因 DNS 反向解析配置不当导致的认证失败。
  • 网络隔离环境: 在一些严格网络隔离的环境中,可能无法访问公共 DNS。通过静态 host 映射,可以保证任务能找到它需要连接的各个服务节点。

3. 调参建议 / 推荐配置

  • 按需配置: 此参数并非总是需要。只有当您遇到与主机名解析相关的 UnknownHostException、连接超时,或 Kerberos 认证失败时,才应考虑配置。
  • 从数据源获取: 理想情况下,如果平台知道目标集群处于特殊的网络环境,此映射关系应已包含在数据源配置中,由系统自动提供。
  • 格式: 一个 JSON Map,键是主机名,值是 IP 地址。
  • 示例: {"namenode-01.your-cluster.com": "10.0.0.1", "kdc.your-realm.com": "10.0.0.10"}

4. 参数联动

  • job.writer.kerberos_enable: 在 Kerberos 场景下尤其有用,可以解决很多因网络问题导致的认证疑难杂症。

5. FAQ(用户提问)

  • 问: 这和修改操作系统的 /etc/hosts 文件有什么区别?
    • 答: 效果类似,但作用域不同。修改 /etc/hosts 是对整个操作系统生效,且需要机器的 root 权限,在容器化的云原生环境中不易操作。而 host_ips_mapping 参数只对当前这一个 Java 进程(任务)生效,更加灵活、安全,且无需特殊权限。
  • 问: 什么时候我应该怀疑是 DNS 问题并配置这个参数?
    • 答: 当你看到错误日志中明确报出 java.net.UnknownHostException,或者连接超时,但通过 ping 或 telnet 直接使用 IP 地址又能连通服务时,就应该高度怀疑是 DNS 解析问题。

6. 注意事项

  • IP 地址的准确性: 确保您提供的 IP 地址是准确的、可访问的。错误的 IP 会导致问题更难排查。
  • 维护成本: 静态映射表需要维护。如果集群节点的 IP 地址发生变更,您需要同步更新此处的配置。

7. 总结说明

job.common.host_ips_mapping 相当于为您的任务提供了一个内置的、临时的 /etc/hosts 文件。它用于解决因 DNS 解析不稳定或网络环境特殊导致的主机名无法正确解析为 IP 地址的问题。当您遇到 UnknownHostException 或在 Kerberos 环境下有连接问题时,可以考虑使用此参数提供静态的主机名到 IP 的映射。

最近更新时间:2026.05.07 14:11:24
这个页面对您有帮助吗?
有用
有用
无用
无用