本文介绍了 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.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 | 作为 | 无 | 在 |
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 |
| FALSE | 不建议直接调整,优先使用 |
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 job.writer.classcom.bytedance.dts.batch.hive.parquet.HiveParquetOutputFormat (以当前产品配置为准)...OldHiveParquetOutputFormat)以验证问题是否与组件升级有关。com.bytedance.dts.batch.hive.parquet.OldHiveParquetOutputFormat 进行对比测试。job.writer.class 的选择会决定后续部分参数是否生效。例如,一些与旧版 SQL 校验相关的参数,只有在切换到 OldHiveParquetOutputFormat 时才起作用。job.writer.class。此参数主要用于版本切换和问题排查。job.writer.class 用于选择数据写入的底层实现逻辑,用户通常无需关心或修改。保持默认配置即可获得最佳的性能和稳定性。仅在技术支持的指导下,为排查特定兼容性问题时才考虑调整。
job.writer.hive_version job.writer.hive_version3.1.2)2.3.9)进行精确配置。3.1.2)。虽然有时仅匹配主版本和次版本(如 3.1)也能正常工作,但精确的版本号能最大程度地避免兼容性风险。job.writer.hive_version 用于声明目标 Hive 集群的版本,以确保写入过程的兼容性。大多数情况下用户无需配置,系统会自动处理。当您向一个非标准或版本特殊的 Hive 集群写入数据时,请确保此参数已正确设置为目标集群的实际版本号。
job.writer.cid / job.common.cid job.writer.cid, job.common.cidcid (Cluster ID) 是一个内部标识,用于定位并获取目标 Hive 集群的完整配置,包括连接地址(Metastore URI)、Hadoop 配置、Kerberos 信息等。job.writer.cid 优先于 job.common.cid。cid,用户无需关心此参数。cid。cid 进行配置。cid 直接决定了 job.writer.emr_hive_conf 和 job.writer.emr_hadoop_conf 的内容来源。如果 cid 指定错误,后续所有与 Hive 和 HDFS 的交互都将失败。cid 和 job.writer.emr_hive_conf,后者会覆盖从 cid 获取的配置。cid?cid 是平台的内部概念,通常不直接对用户暴露。您只需要在任务配置中正确选择目标数据源即可,系统会为您处理 cid 的映射。如果确有需要,请联系平台管理员或技术支持获取。job.writer.cid 和 job.common.cid 有什么区别?job.writer.cid 是专门为数据写入(Sink)指定的集群配置,优先级更高。如果 job.writer.cid 未配置,系统会使用通用的 job.common.cid 作为备选。这种设计允许读、写操作使用不同的集群。cid 的作用就是让系统能自动找到包括地址在内的一整套配置。手动配置 cid 后,就不应再手动配置 emr_hive_conf 或 emr_hadoop_conf,除非您想覆盖 cid 中的部分特定配置。cid。cid 是一个内部参数,用于关联您的任务与目标数据集群的配置。用户只需在界面上正确选择数据源,系统便会自动处理此参数,无需手动配置。这是一个核心的连接参数,错误的配置将导致任务无法连接到目标集群。
job.common.instance_id job.common.instance_idinstance_id 可以帮助快速定位到具体的任务运行实例。instance_id 和其他任务标识。instance_id 还有用吗?instance_id,在 HDFS 的临时目录下(通常是 /user/app/dts/.tmp/ 等路径)快速找到该次运行产生的文件,便于问题排查。-1)。这在多任务并行或重试时可能导致临时文件路径冲突,引发写入错误或数据覆盖,因此 instance_id 对于保障任务正确性至关重要。job.common.instance_id 是每次任务运行的唯一ID,由系统自动生成,主要用于创建隔离的临时文件目录,保证任务的稳定和正确。用户通常无需关心此参数,但在需要深入排查文件系统层面的问题时,它是一个定位临时数据的重要标识。
job.writer.db_name job.writer.db_name (别名: db_name)job.writer.table_name 共同构成了写入目标的完整坐标。job.writer.table_name: 必须与 table_name 配对使用,共同定义一个完整的目标表路径 (db_name.table_name)。job.writer.cid: db_name 指定的数据库必须存在于由 cid 或 emr_hive_conf 指定的 Hive 集群中。db_name.table_name 的元数据。如果数据库不存在,任务会立即失败,并报出类似 “Database not found” 的错误。db_name。如果需要写入多个数据库,您需要配置多个独立的任务。db_name 和 database 这两个参数名都可以用吗?db_name 这个别名。为保持统一,建议在配置中始终使用 job.writer.db_name。job.writer.db_name 是一个必需参数,用于指定数据写入的目标 Hive 数据库。请务必确保其配置正确,并与 job.writer.table_name 共同指向您期望的数据表。它是定位写入目标的基础。
job.writer.table_name job.writer.table_name (别名: table_name)job.writer.db_name 一样,这是任何 Hive 写入任务都必须配置的核心参数。它构成了写入目标的最终落点。job.writer.db_name: 与 db_name 共同组成完整表名。job.writer.columns: 任务配置的 columns 列表应与 table_name 指定的 Hive 表结构在列名、顺序和类型上保持兼容。job.writer.partition: 任务配置的 partition 信息必须与 table_name 指定的 Hive 表的分区定义一致。db_name 写错类似,任务会因找不到元数据而启动失败。my_table_20240413),这个参数支持吗?job.writer.table_name 在任务启动时即被固定。若要实现写入动态表名,您需要通过外部调度系统,每天生成并运行一个新的任务,并在任务配置中传入当天的表名。job.writer.table_name 是一个必需参数,用于指定数据写入的目标数据表。在运行任务前,请务必确认该参数配置正确,且目标表已在 Hive 中创建。它是确保数据能够准确落盘到指定位置的关键配置。
job.writer.columns job.writer.columnscolumns 参数可以进行精确的映射和裁剪。columns 列表中,否则任务将无法从数据中提取分区值,导致启动失败。columns 列表中的字段顺序和类型应严格按照数据写入 RecordWriter 前的 Row 结构来定义。columns 中定义的字段应与目标 Hive 表的列在名称和类型上保持兼容。虽然写入组件有一定的自动转换能力,但保持一致可以避免绝大多数 schema mismatch 问题。dt 和 hh,请确保 columns 列表中包含了名为 dt 和 hh 的字段。job.writer.table_name: columns 的定义需要与目标表的 Schema 兼容。job.writer.partition: 当 partition 参数中包含动态分区时(如 dt=,hh=),dt 和 hh 必须是 columns 的一部分。columns 里的字段比 Hive 表多或少会怎么样?columns 比表字段少:只要不少关键字段(如分区列),任务可以成功写入,表中缺失的列将被填充为 NULL。columns 比表字段多:任务很可能会失败,因为多余的字段在目标表中找不到位置。columns 参数中只声明您想写入的那些列,并确保其与上游数据流的结构一致。columns 列表里应该放在什么位置?columns 中定义的类型至关重要。例如,一个上游为 Long 类型的字段,如果在 columns 中错配为 String,可能会导致写入失败或数据失真。schema mismatch, column not found 等错误。job.writer.columns 定义了写入操作的数据结构,是连接上游数据和目标 Hive 表的关键桥梁。请务必保证其内容(字段名、类型、顺序)与您的数据流相匹配,并与目标表的 Schema 兼容。特别是在使用动态分区时,分区列必须包含在此参数中。
job.writer.writable_extractor_type job.writer.writable_extractor_typeparquetRow)转换为 Hadoop 的可写格式(Writable)。这通常与目标文件的存储格式有关。parquet 类型。这是最常见、性能也最优的场景。general。但在当前实现中,主要优化和测试都集中在 Parquet 格式上。parquet。数据平台上的 Hive 表绝大多数都推荐使用 Parquet 格式,以获得最佳的压缩率和查询性能。general。但更推荐的做法是,将目标表的存储格式也改为 Parquet。job.writer.hive_parquet_compression: 此参数以及其他 Parquet 相关配置(如 parquet_config)通常在 writable_extractor_type 为 parquet 时才有意义。general。但最优实践是将表格式转换为 Parquet。parquet?job.writer.writable_extractor_type 用于选择与目标文件格式相匹配的内部数据转换器。对于最常用且推荐的 Parquet 格式,保持默认的 parquet 设置即可。用户通常无需修改此参数。
job.writer.partition job.writer.partition"" (空字符串,表示无分区或由系统处理)dt=20240401,hh=01。这会将所有数据全部写入该指定分区。dt=,hh= 表示 dt 和 hh 的值将从每条数据中动态获取。dt=20240401,hh=,表示所有数据都写入 20240401 这一天,但具体的小时分区 hh 则根据数据动态决定。分区键1=值1,分区键2=值2。确保值是有效的,符合该分区键的类型。分区键1=,分区键2=。确保这些分区键存在于 job.writer.columns 参数中。job.writer.columns: 动态分区的分区键必须是 columns 的一部分。job.writer.partition_type: 需要与 partition 参数中声明的分区键一一对应,并指定其数据类型。job.writer.default_partition_value: 可以为动态分区提供默认值,以处理数据中分区列为空或非法的情况。job.writer.enable_partition_dir_rename: 在使用动态分区且数据量大时,开启此参数可以显著提升提交效率。dts.hive.no.partition 是什么意思?partition 参数中的分区键顺序应与 Hive 表定义中的分区键顺序保持一致。job.writer.partition 是控制数据写入哪个分区的核心参数。您可以根据需求配置为静态分区(固定目标)、动态分区(按数据内容分发)或两者混合。请优先使用静态分区以保证任务稳定性,仅在必要时使用动态分区,并注意控制动态生成的分区数量。
job.writer.partition_type job.writer.partition_typestringjob.writer.partition 参数配合使用,用于声明每个分区键的数据类型。job.writer.partition 中声明了分区时,此参数用于告知系统如何解析静态分区的值,或如何为动态分区推断数据类型。partition 参数中的键一一对应。例如,若 partition 为 dt=20240101,hr=08,则 partition_type 可能为 string,string 或 int,int,取决于表定义。job.writer.partition: ds=2024-04-13job.writer.partition_type: stringjob.writer.partition: year=2024,month=4job.writer.partition_type: int,intjob.writer.partition: partition_type 中声明的类型数量和顺序必须与 partition 中的分区键完全对应。job.writer.default_partition_value: 当需要为动态分区设置默认值时,partition_type 会影响默认值的解析。string 类型。如果您的分区键实际上是 int 或 bigint 等数值类型,不正确地配置(或不配置)此参数可能导致元数据操作失败,或在查询时无法正确利用分区裁剪。partition_type 和 columns 里的类型有什么关系?columns 的一部分。此时,partition_type 中为该分区键声明的类型,应与 columns 中为该字段定义的类型保持一致,并且最终都要与 Hive 表定义一致。partition_type 就应该提供两个用逗号分隔的类型。partition_type 中的类型顺序与 partition 中的分区键顺序完全一致。string, int, bigint, double 等。job.writer.partition_type 用于声明每个分区键的数据类型,是 job.writer.partition 参数的配套配置。为保证数据能被正确写入和查询,请务必根据目标 Hive 表的真实分区类型,精确配置此参数。
job.writer.default_partition_value job.writer.default_partition_value"" (空字符串)NULL 或类型转换失败)的分区字段提供一个回退的默认值。NULL 值或脏数据时,若不希望因此导致任务失败或数据丢失,可以配置一个默认分区来“收容”这些异常数据。例如,将所有 NULL 地区码的数据都写入 region=UNKNOWN 分区。分区键1=默认值1,分区键2=默认值2 的格式。您可以只为部分动态分区键配置默认值。__DEFAULT__, UNKNOWN, NULL 等,便于下游识别和处理。job.writer.partition: dt=,region=job.writer.default_partition_value: region=UNKNOWNregion 字段为 NULL,它将被写入 dt=.../region=UNKNOWN 分区。job.writer.partition: 此参数只对 partition 中声明为动态分区(值为空)的键生效。job.writer.partition_type: 默认值的类型会受到 partition_type 的影响。例如,如果分区类型是 int,那么默认值也应该是合法的整数。NULL 的分区值会怎么样?__HIVE_DEFAULT_PARTITION__)来存储这些数据。配置此参数可以让您自定义这个回退分区的名称,使其更具业务可读性。job.writer.default_partition_value 是一个用于提升动态分区任务鲁棒性的容错参数。当您的源数据中分区字段可能存在 NULL 或非法值时,通过配置一个有意义的默认分区,可以避免数据丢失,并将这些“问题数据”统一归集管理,便于后续定位和清洗。
job.writer.write_mode job.writer.write_modeoverwriteoverwrite(覆盖)和 directlyInsert(追加)。overwrite 模式。这是批处理任务最常见的模式。例如,每日计算前一天的全量指标并覆盖写入 dt=昨天 的分区。directlyInsert 模式。例如,持续不断地将新的日志数据追加到当天的分区中。overwrite。它能保证任务重跑时的幂等性,即无论任务成功运行多少次,最终分区的数据都是最后一次成功运行的结果,不会产生重复数据。directlyInsert。insert: 请注意,标准的 insert 模式当前不支持,错误配置会导致任务失败。job.writer.partition: write_mode 的作用域是 partition 参数所指定的分区。
overwrite 模式下,如果是静态分区,它会删除并重建该分区;如果是动态分区,它会删除本次任务涉及到的所有动态生成的分区,然后写入新数据。job.writer.enable_partition_dir_rename: overwrite 模式下开启此参数,可以获得更好的提交性能。overwrite 和 directlyInsert 有什么本质区别?overwrite 在写入数据前会先清空目标分区。directlyInsert 则直接在目标分区现有数据的基础上创建新文件进行写入。overwrite 任务失败重跑,数据会丢失吗?overwrite 的清空和写入通常是一个原子性操作。在任务成功提交(commit)之前,旧数据不会被真正删除。如果任务中途失败,分区会回滚到任务开始前的状态。directlyInsert 模式下,如果任务重跑了怎么办?directlyInsert 模式时,下游应用需要有去重的能力,或者上游调度系统需要保证任务不会被重复执行。overwrite 是保证任务幂等性的关键。在不确定时,优先选择 overwrite。overwrite 的行为是“覆盖本次写入涉及的所有分区”。例如,如果任务写入了 dt=1, dt=2 两个分区,它只会清空这两个分区,而不会影响 dt=3。job.writer.write_mode 控制着数据的写入方式。overwrite(覆盖)是默认且推荐的模式,它能保证任务重跑的幂等性,适用于全量更新场景。directlyInsert(追加)用于增量数据写入,但使用时必须注意重跑可能导致的数据重复问题。请根据您的业务需求审慎选择。
job.writer.storage_type job.writer.storage_typehdfshdfs。这是最传统的 Hadoop 生态默认存储。tos 等对应值。lasfs(Lustre)或 raw_tos(直通 TOS,绕过某些缓存层)等,以获取特定的性能或功能。tos 是常见的配置。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 缓存层的行为。tos 和 raw_tos 有什么区别?tos 是标准的访问对象存储的方式。raw_tos 是一种特殊的访问模式,通常用于配合名为“Proton”的缓存加速服务,它会绕过一些客户端或代理层的缓存,直接与对象存储后端交互。除非您正在使用 Proton,否则不应配置为 raw_tos。job.writer.storage_type 用于声明 Hive 表底层所使用的文件系统类型,如 hdfs 或 tos(对象存储)。该参数与您的数据基础设施紧密绑定,在绝大多数情况下,您无需手动配置,只需正确选择数据源,系统便会自动处理。
job.writer.emr_hive_conf job.writer.emr_hive_confcid)自动从配置中心获取HiveConf 的配置项。HiveConf 是 Hive 客户端的核心配置对象,包含了连接 Metastore、执行 DDL、权限控制等所需的所有信息。emr_hive_conf 中的键值对来实现。例如,临时调大 Metastore 客户端的超时时间。"hive.metastore.client.socket.timeout": "600" 来延长超时时间。job.writer.cid: 如果未提供 emr_hive_conf,系统会使用 cid 从配置中心拉取配置来填充它。job.writer.emr_hadoop_conf: HiveConf 继承自 Hadoop 的 Configuration,因此 emr_hadoop_conf 中的配置也会影响到 Hive 的行为,尤其 HDFS 相关的部分。emr_hive_conf 和 hive-site.xml 文件是什么关系?emr_hive_conf 理解为一个内容为 hive-site.xml 的、程序化的 Map 结构。它最终会被用来构建一个等效于加载了 hive-site.xml 的配置对象。hive-site.xml 中合法的参数都可以在这里配置。但随意修改可能导致非预期的后果。emr_hive_conf,它通常会与从数据源获取的配置进行合并,您手动指定的值会覆盖默认值。但具体合并策略可能因平台版本而异,建议先小范围测试。job.writer.emr_hive_conf 承载了连接和操作 Hive 所需的全部客户端配置。在日常使用中,此参数由系统根据您选择的数据源自动管理,无需用户干预。它为高级用户和问题排查提供了一个临时覆盖默认配置的入口,但任何修改都应在充分理解其影响后谨慎进行。
job.writer.emr_hadoop_conf job.writer.emr_hadoop_confcid)自动获取JobConf 的配置项。JobConf 控制着所有与 Hadoop 生态组件(尤其是 HDFS 和 MapReduce/YARN 客户端)交互的行为。dfs.client.socket-timeout。proton.cache.enable 这个关键参数就定义在此处,用于决定是否启用客户端缓存。emr_hive_conf 类似,强烈建议使用系统根据数据源提供的默认配置,不要手动修改。"dfs.client.socket-timeout": "180000"。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 的最终解释。emr_hadoop_conf 和 core-site.xml/hdfs-site.xml 是什么关系?emr_hadoop_conf 在功能上等价于将 core-site.xml 和 hdfs-site.xml 等多个 Hadoop 配置文件的内容合并后的一个 Map 结构。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 客户端也可见。emr_hadoop_conf 中的配置会影响到所有基于 Hadoop API 的操作,改动需非常谨慎。connection refused, query timeout, permission denied 等 HDFS 或 YARN 客户端级别的错误。job.writer.emr_hadoop_conf 是控制任务与底层 Hadoop(尤其是 HDFS)交互行为的核心配置集合。它由系统根据数据源自动管理,用户通常无需接触。这是一个强大的、但同时也很危险的参数,任何手动修改都应仅限于在专家指导下进行问题排查。
job.writer.extra_config job.writer.extra_configjob.writer.emr_hadoop_conf 的一个补充,提供一个额外的、用户可以自由添加 Hadoop 配置的入口。其内容最终会与 emr_hadoop_conf 合并,共同作用于 JobConf。emr_hadoop_conf 由系统管理,但用户又需要注入少量自定义的 Hadoop 配置时,使用此参数最为合适。它避免了直接覆盖复杂的 emr_hadoop_conf 整体。emr_hadoop_conf,可以在 extra_config 中添加 {"proton.cache.enable": "true"}。job.writer.emr_hadoop_conf: extra_config 的内容会叠加在 emr_hadoop_conf 之上。如果存在同名key,extra_config 中的值通常会覆盖 emr_hadoop_conf 中的值(具体合并策略取决于代码实现,但覆盖是常见行为)。extra_config 和 emr_hadoop_conf 我应该用哪个?extra_config。emr_hadoop_conf 是系统管理的一大块配置,直接修改它容易出错。extra_config 则像一个轻量级的“补丁”,只关注您想改动的几个点,更安全、更清晰。extra_config 里配置 Hive 的参数吗?HiveConf 继承自 HadoopConf,所以理论上是可行的。但为了配置的清晰和可维护性,Hive 相关的参数建议通过 emr_hive_conf 来覆盖,Hadoop 相关的参数通过 extra_config 来覆盖。emr_hadoop_conf 和 extra_config 的内容。job.writer.extra_config 为用户提供了一个向任务注入自定义 Hadoop 配置的便捷入口。当您需要微调底层 HDFS 客户端行为或启用某些特殊功能(如客户端缓存)时,推荐使用此参数,而非直接修改由系统管理的、庞大的 emr_hadoop_conf。
job.writer.hive_parquet_compression job.writer.hive_parquet_compressiongzipgzip 或 zstd,它们能提供较高的压缩比,但压缩和解压时消耗的 CPU 较多。snappy 或 lzo。它们的压缩比略低,但压缩和解压速度非常快,能有效降低查询时的 CPU 开销,提升查询性能。snappy。它在压缩率和 CPU 开销之间取得了很好的平衡,是目前大数据领域最主流的通用压缩算法,能为下游查询提供良好的性能。gzip。如果存储空间非常敏感,可以选择 gzip。parquet.compression。job.writer.hive_parquet_compression。gzip。job.writer.parquet_config: 也可以通过 parquet_config 这个更通用的参数来设置 {"parquet.compression": "snappy"},效果相同。writable_extractor_type: 此参数必须在 writable_extractor_type 为 parquet 时才有意义。snappy 和 gzip 我应该怎么选?snappy。它能提供更快的查询速度,这在大多数分析型场景中比节省一点存储空间更重要。只有在您的存储预算极其紧张,且能接受查询变慢时,才考虑 gzip。snappy,为什么没生效,最后还是 gzip?parquet.compression 为 gzip。表的配置优先级高于任务的配置。您需要修改表属性才能让任务配置生效。uncompressed, snappy, gzip, lzo, brotli, lz4, zstd。snappy 和 gzip 的兼容性最好。job.writer.hive_parquet_compression 用于设定输出 Parquet 文件的压缩算法,是平衡存储成本和查询性能的关键参数。我们推荐使用 snappy 以获得更优的查询性能。请注意,该参数的效力低于 Hive 表自身的属性设置,如果表已指定压缩格式,则任务配置会被忽略。
job.writer.parquet_config job.writer.parquet_configparquet.block.size): 行组是 Parquet 文件中列式存储的基本单元。较大的行组可以提升压缩率和顺序扫描性能,但需要更多内存。默认值通常是 128MB。parquet.page.size): 页是行组内部的数据组织单元。较大的页大小可以提升压缩率,但可能在点查时带来更多 I/O。默认值通常是 1MB。parquet.enable.dictionary): 控制是否启用字典编码。对于低基数列,字典编码能极大地提升压缩率和过滤性能。parquet.validation=false) 来在极端情况下压榨写入性能(有数据损坏风险)。{"parquet.block.size": "268435456"} (256MB){"parquet.enable.dictionary": "false"}job.writer.hive_parquet_compression: 可以在此参数中设置压缩,如 {"parquet.compression": "snappy"},其效果与直接配置 job.writer.hive_parquet_compression 类似,但配置方式更通用。{"key1": "value1", "key2": "value2"}。格式错误会导致任务解析失败。job.writer.parquet_config 这个字段在任务配置中明确出现时,其内容才会被解析和应用。job.writer.parquet_config 是一个提供给专家的、用于对 Parquet 文件格式进行精细化调优的接口。它允许您调整行组大小、页大小、字典编码等底层参数。对于普通用户,强烈建议不要使用此参数,保持 Parquet 的默认配置即可获得良好的性能。
job.writer.enable_partition_dir_rename job.writer.enable_partition_dir_renameFALSErename 会对 NameNode 造成巨大压力,并消耗大量时间。true。
false 即可。当文件数量很少时(例如只有几个文件),两种策略的性能差异不明显。job.writer.write_mode: 此参数主要在 overwrite 和 directlyInsert 模式下有意义。它优化的是将临时目录的数据发布到最终目录的过程。.../.tmp/attempt_xxx/dt=20240101/),并将所有数据文件写入其中。Commit 时,它会逐一将这些文件 rename 到最终的目标分区目录(.../warehouse/my_table/dt=20240101/)。如果有 1000 个文件,就需要 1000 次 rename 操作。rename 为一个备份目录,然后直接将临时目录 rename 为最终目录。这个过程通常只需要 2-3 次 rename 操作,与文件数量无关。false?听起来 true 总是更好。job.writer.enable_partition_dir_rename 是一个关键的性能优化参数。当您的任务需要向单个分区写入大量文件时,强烈建议将此参数设置为 true。它能将数据提交阶段的耗时从分钟级锐减至秒级,显著提升任务效率,并减轻底层文件系统的压力。
job.writer.convert_error_column_as_null job.writer.convert_error_column_as_nullFALSEtrue,该字段将被当作 NULL 值写入;如果为 false,则整条记录被视为脏数据,并可能导致任务失败。false。这能让问题在第一时间暴露出来,迫使您去修复上游的数据质量问题或ETL逻辑,而不是悄无声息地接受错误数据。true。当任务的稳定性、持续运行比个别字段的精确性更重要时采用此配置。job.writer.columns: 此参数作用于 columns 中定义的每个字段的类型转换过程。“hello”,但目标 Hive 列的类型是 INT。在将 “hello” 转换为整数时会发生 NumberFormatException。如果此参数为 true,这个字段就会以 NULL 写入;如果为 false,任务就会报错或记录一条脏数据。IS NULL 的数据,并与源数据进行比对,才能定位到被转换的记录。因此,开启此参数也意味着问题排查的成本会增加。default_partition_value 有什么区别?default_partition_value 只作用于动态分区键字段,并且是当源值为 NULL 时提供一个默认分区名。而 convert_error_column_as_null 作用于所有非分区键的普通字段,并且是在类型转换失败时将该字段的值变为 NULL。NULL。job.writer.convert_error_column_as_null 是一个在数据质量和任务稳定性之间进行取舍的参数。默认情况下(false),系统会严格要求数据类型匹配,任何转换失败都会导致错误,以保证数据质量。当您可以容忍部分非关键字段因格式问题丢失,并优先保障任务能持续成功运行时,可将其设置为 true。
job.writer.is_drop_delims job.writer.is_drop_delimsFALSE\n, \r) 以及 Hive 默认的字段和行分隔符(如 \u0001, \u0002)。这主要借鉴自 Sqoop 工具的 –hive-drop-import-delims 选项。true 以增加数据写入的安全性。false。优先使用 Parquet 等现代存储格式,从根本上避免此类问题。\n、回车符 \r,以及 Hive 用作默认分隔符的一些不常见的控制字符。job.writer.is_drop_delims 是一个数据清洗选项,用于移除字符串中的换行符及 Hive 默认分隔符,以防止在写入 TextFile 等纯文本格式时破坏文件结构。当您使用 Parquet 等现代列式存储格式时,通常无需开启此参数。仅在向 TextFile 写入且源数据质量存疑时,可考虑开启以增强鲁棒性。
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 (全局级)FALSEList 或 Map 类型字段时,是将其写入为 Hive 中的 NULL,还是写入为空集合([] 或 {})。NULL 和空集合的处理方式不同,且您希望统一为其中一种时。例如,下游的 SQL 查询中使用 COUNT(map_col) 时,NULL 和空 Map 的结果可能不同。NULL,则可以开启此参数。FALSE): 保持默认值 false。这能最真实地反映源数据的状态:空集合([], {})就是空集合,NULL 就是 NULL。这种区分在数据分析中通常是有价值的。TRUE): 当您的业务逻辑明确要求将所有空集合视为 NULL 对待时,将 job.writer.empty_list_map_write_null 设置为 true。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。NULL 和空集合在 Hive 里有什么区别?NULL: 表示该值未知、缺失或不适用。[], {}): 表示该值存在,但集合内没有任何元素。size(col) 函数,对于 NULL 列会返回 NULL,对于空集合会返回 0。job.writer.* 还是 output.*?job.writer.empty_list_map_write_null。这是一个针对单个任务的精细化控制,影响范围可控。output.empty_list_map_write_null 是全局配置,修改它会影响平台上所有未显式配置此项的任务,风险较大,不建议普通用户修改。job.writer.empty_list_map_write_null 参数允许您选择如何处理空的 List 或 Map 字段:是将其作为 NULL 写入,还是保留为空集合([]/{})。默认行为是保留为空集合,这能更精确地反映数据原貌。仅当您的下游业务逻辑明确需要将两者统一视为 NULL 时,才开启此选项。建议使用 job.writer. 前缀的参数进行任务级配置。
job.writer.date_to_string_as_long job.writer.date_to_string_as_longFALSEDate, Time 或 Timestamp,而目标 Hive 表的对应列类型是 String 时,此参数决定了转换的行为。如果为 true,会先将日期时间类型转换为一个长整型(Long)的 Unix 时间戳,然后再将这个数字作为字符串写入。“2024-04-13 10:00:00”),而是希望存储为其对应的 Unix 时间戳的字符串形式(如 “1712973600”)时,应开启此参数。这在某些需要跨系统、跨语言对接,且以时间戳作为通用时间表示的场景中很常见。FALSE): 保持默认。这会产生人类可读的日期时间字符串(如 yyyy-MM-dd HH:mm:ss.SSS),在大多数报表和即席查询场景下更直观。TRUE): 当下游系统需要以时间戳形式消费数据,或为了严格统一时间标准时,设置为 true。job.writer.date_precision: 当 date_to_string_as_long 为 true 时,此参数决定了生成的 Unix 时间戳是秒级还是毫秒级。yyyy-MM-dd HH:mm:ss.SSS)将 Date 对象格式化为一个字符串。from_unixtime() 函数。job.writer.date_precision 参数,以确定时间戳的精度是秒还是毫秒。job.writer.date_to_string_as_long 参数控制着如何将日期时间类型的数据转换为字符串。默认情况下,它会生成人类可读的格式化字符串(如 "2024-04-13 10:00:00")。当您需要将日期时间以更通用的 Unix 时间戳(一个长整数)的字符串形式存储时,应将此参数设置为 true,并配合 job.writer.date_precision 指定时间戳的精度。
job.writer.date_precision job.writer.date_precisionsecondDate 或 Timestamp 类型转换为长整型(Long)时(例如,当 job.writer.date_to_string_as_long 为 true 时),此参数决定了转换后的时间戳精度是秒还是毫秒。1712973600。millisecond。例如,1712973600123。second): 保持默认的 second。秒级时间戳通用性最强,兼容性最好。millisecond): 仅当您明确知道下游需要毫秒精度时,才将其设置为 millisecond。job.writer.date_to_string_as_long: date_precision 只在 date_to_string_as_long 为 true 的场景下,或者其他直接将日期转为数字类型的场景中生效。second(秒)。time.time())默认为秒。second, Second, SECOND 都是等效的。job.writer.date_precision 用于设定日期时间转换为长整型时间戳时的精度。默认为 second(秒),您也可以根据下游系统的要求,将其配置为 millisecond(毫秒)。在进行任何日期到数字的转换时,都应确认此参数的配置符合您的精度要求。
job.writer.null_string_as_null job.writer.null_string_as_nullFALSENULL 且目标 Hive 列类型为 String 时,是将其写入为 SQL NULL,还是写入为空字符串 “”。NULL 与空字符串:
NULL 和空字符串的含义不同。NULL 可能代表“未知”或“不适用”,而空字符串 “” 可能代表“信息已填写,但内容为空”。WHERE col IS NULL 和 WHERE col = '' 的结果是完全不同的。NULL 和空字符串的处理方式有明确区分,并要求上游严格写入 SQL NULL 时,应开启此参数。FALSE (写入空字符串): 保持默认。在很多 ETL 场景中,将 NULL 字符串统一处理为空字符串 “” 是一种常见的、简化下游处理的做法。NULL 时 (TRUE): 当您需要严格区分 NULL 和空字符串的语义时,将此参数设置为 true。“” 而不是 NULL?NULL 可能会有非预期的行为(例如,字符串拼接时 concat(col, 'a') 如果 col 是 NULL,结果可能也是 NULL)。将 NULL 提前转换为空字符串,可以避免这类问题,简化下游的 null 判断逻辑。NULL 都会变成 SQL NULL?String 类型时生效。如果目标列是 INT、BIGINT 等数值类型,上游的 NULL 值总是会被写入为 SQL NULL,不受此参数控制。String 类型的列写入 NULL 值的行为。empty_list_map_write_null 的区别: 不要混淆。null_string_as_null 处理的是 String 类型的 NULL 值。而 empty_list_map_write_null 处理的是 List 或 Map 类型的空集合值。job.writer.null_string_as_null 控制着当一个 String 类型的字段值为 NULL 时,最终写入 Hive 的是 SQL NULL 还是一个空字符串 “”。默认行为是写入空字符串。如果您的业务需要严格区分“未知”(NULL)和“空值”(“”),请将此参数设置为 true。
job.writer.kerberos_enable job.writer.kerberos_enableFALSE 或根据数据源配置true,否则所有访问都将被拒绝。false。true,并填充其他相关认证信息。true,并同时提供 principal, keytab, krb5.conf 等配套信息。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 认证中的主机名能正确解析。kerberos_enable 设置为 true,还必须同时提供所有必需的认证信息(principal, keytab 等),否则认证必然失败。GSSException, Authentication failed, No valid credentials provided。job.writer.kerberos_enable 是控制是否启用安全认证的总开关。当您需要向一个开启了 Kerberos 的安全集群写入数据时,必须将此参数设为 true,并提供所有必要的认证凭据。对于非安全集群,请保持其为 false。通常,此参数由所选的数据源自动管理。
job.writer.kerberos_principal job.writer.kerberos_principaljob.writer.kerberos_enable 设置为 true 时,此参数为必需。它告诉 Kerberos KDC(密钥分发中心)“我是谁”。primary/instance@REALM。
primary: 通常是用户名或服务名。instance: 可选,用于区分一个 primary 的不同实例,如主机名。REALM: 域名,必须大写。dts_user/hadoop.cluster@YOUR_REALM.COMjob.writer.kerberos_enable: 仅当其为 true 时此参数才生效。job.writer.keytab_content_base64: Principal 和 Keytab 必须是一对匹配的凭据。REALM 部分必须大写。job.writer.kerberos_principal 指定了任务在进行 Kerberos 认证时所使用的身份。当写入安全集群时,这是一个必需参数。它通常由数据源配置自动提供,用户无需手动填写。手动配置时,请确保其值的准确性,并与配对的 Keytab 文件一致。
job.writer.keytab_content_base64 job.writer.keytab_content_base64job.writer.kerberos_enable 为 true 时,此参数为必需。它向 KDC 证明“我拥有这个身份的密钥”。base64 -w 0 your_user.keytab。然后将输出的长字符串粘贴到此参数的值中。job.writer.kerberos_enable: 仅当其为 true 时此参数才生效。job.writer.kerberos_principal: Keytab 中的密钥必须与 Principal 对应。job.writer.keytab_content_base64 用于提供 Kerberos 认证所需的核心凭据——Keytab 文件的内容(经过 Base64 编码)。这是写入安全集群时的必需参数。为保障安全,强烈建议通过平台的数据源管理功能来上传和配置 Keytab,而不是在任务中手动粘贴其内容。
job.writer.krb5_conf_content_base64 job.writer.krb5_conf_content_base64krb5.conf) 的内容,并使用 Base64 编码。krb5.conf 文件告诉 Kerberos 客户端如何找到 KDC、默认的 REALM 是什么,以及加密算法等配置。job.writer.kerberos_enable 为 true 时,此参数为必需。它为客户端提供了连接 KDC 的“地图”。krb5.conf 文件,或者需要为任务指定一个不同于环境默认值的 Kerberos 配置时使用。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 }
job.writer.kerberos_enable: 仅当其为 true 时此参数才生效。krb5.conf 文件?krb5.conf 内容都是相同的。krb5.conf 只包含公开的配置信息(如服务器地址和域名),不包含任何密钥或密码,可以安全地共享。krb5.conf 中配置的 default_realm 或 [realms] 部分与您的 Principal 中的 REALM 一致。krb5.conf 中指定的 KDC 服务器地址。job.writer.krb5_conf_content_base64 用于向任务提供 Kerberos 的客户端配置文件(krb5.conf)内容。它就像一张地图,指引着任务如何找到并与 Kerberos 认证服务器通信。当写入安全集群时,此为必需参数,且通常由所选数据源自动提供。
job.writer.kerberos_conf job.writer.kerberos_confConfiguration 对象中,用于微调 Kerberos 或 RPC 相关的行为。hadoop.rpc.protection)。sun.security.krb5.debug=true(注:此项更适合放在 kerberos_system_props 中)。{"hadoop.rpc.protection": "privacy"} (要求对 RPC 数据进行加密,而非仅仅认证)。job.writer.emr_hadoop_conf: kerberos_conf 的内容会与 emr_hadoop_conf 进行合并,用于构建最终的 Hadoop 配置。kerberos_conf 和 emr_hadoop_conf / extra_config 有什么区别?Configuration 对象中。kerberos_conf 在设计上意图更明确,专门用于存放与 Kerberos 安全直接相关的 Hadoop 配置,有助于保持配置的整洁和模块化。而 emr_hadoop_conf 和 extra_config 更通用。hadoop.rpc.protection 放在哪里?kerberos_conf 或 extra_config 都可以。但从配置的逻辑清晰度来看,放在 kerberos_conf 是一个更好的选择,因为它直接与安全相关。job.writer.kerberos_conf 是一个专家级参数,用于向任务注入额外的、与 Kerberos 安全相关的底层 Hadoop 配置。普通用户无需关心此参数。它为处理复杂的安全认证场景提供了一个灵活的配置扩展点。
job.writer.kerberos_system_props job.writer.kerberos_system_props{"sun.security.krb5.debug": "true"},可以在任务日志中打印出非常详细的 Kerberos 认证过程,包括票据请求、加密类型协商、错误详情等,是排查 Kerberos 疑难杂症的终极武器。{"sun.security.krb5.debug": "true"}。kerberos_system_props 和 kerberos_conf 有什么不同?kerberos_conf: 影响的是 Hadoop 的 Configuration 对象,控制的是 Hadoop 客户端层面的行为。kerberos_system_props: 影响的是整个 Java 虚拟机(JVM),控制的是更底层的 Java 安全库的行为。sun.security.krb5.debug 会产生大量日志吗?job.writer.kerberos_system_props 是一个用于调试 Kerberos 问题的强大工具。通过设置 sun.security.krb5.debug 为 true,您可以开启详细的底层认证日志,帮助快速定位认证失败的根源。此参数仅供排障时临时使用,正常运行时无需配置。
job.common.host_ips_mapping job.common.host_ips_mappingUnknownHostException、连接超时,或 Kerberos 认证失败时,才应考虑配置。{"namenode-01.your-cluster.com": "10.0.0.1", "kdc.your-realm.com": "10.0.0.10"}job.writer.kerberos_enable: 在 Kerberos 场景下尤其有用,可以解决很多因网络问题导致的认证疑难杂症。/etc/hosts 文件有什么区别?/etc/hosts 是对整个操作系统生效,且需要机器的 root 权限,在容器化的云原生环境中不易操作。而 host_ips_mapping 参数只对当前这一个 Java 进程(任务)生效,更加灵活、安全,且无需特殊权限。java.net.UnknownHostException,或者连接超时,但通过 ping 或 telnet 直接使用 IP 地址又能连通服务时,就应该高度怀疑是 DNS 解析问题。job.common.host_ips_mapping 相当于为您的任务提供了一个内置的、临时的 /etc/hosts 文件。它用于解决因 DNS 解析不稳定或网络环境特殊导致的主机名无法正确解析为 IP 地址的问题。当您遇到 UnknownHostException 或在 Kerberos 环境下有连接问题时,可以考虑使用此参数提供静态的主机名到 IP 的映射。