故障诊断

访问错误信息

根据信息类型的不同,信息和错误信息显示在不同的位置:

流量配置问题
流程图提供的指导和错误详情如下:
  • 通过隐式验证发现的问题会显示在问题列表中。
  • 出现问题的阶段或流程配置问题的画布上会显示错误图标。
错误记录信息
您可以使用错误记录流程属性将错误记录和相关详细信息写入另一个系统进行审查。 记录头属性中的信息可以帮助您确定发生的问题。 更多信息,请参阅内部属性
有关错误记录和错误记录处理的更多信息,请参阅错误记录处理

流量基础知识

使用以下提示来帮助您掌握基本流程

为什么没有启用 " 运行 " 图标?
流程有效时,您可以启动它。 使用问题图标查看流程中的问题列表。 问题解决后," 运行 " 图标就会启用。

一般验证错误

使用以下提示帮助您解决一般流程验证错误:
流程的阶段验证错误集如下:
CONTAINER_0901 - Could not find stage definition for <stage library name>:<stage name>.
CREATION_006 - Stage definition not found. Library <stage library name>. Stage <stage name>. 
Version <version>
VALIDATION_0006 - Stage definition does not exist, library <stage library name>, 
name <stage name>, version <version>
流程使用的阶段未安装在数据收集器引擎上。 如果您从不同版本的引擎导入流程 ,而当前引擎未启用使用阶段,则可能会出现这种情况。
如果数据收集器引擎使用不同版本的阶段,可以删除无效版本,并用本地有效版本取而代之。 例如,如果版数据收集器的数据流使用了旧版本的 MongoDB Atlas 目标 ,则可将其替换为当前引擎使用的版本。
若需使用引擎未安装的阶段,请安装相关的阶段库 有关安装附加驱动程序的信息 ,请阅安装外部库。

资料来源

请使用以下提示来帮助处理阶段和系统。

目录

为什么目录没有读取我的所有文件?
目录根据配置的文件名模式、读取顺序和要处理的第一个文件读取一组文件。 如果新文件在目录的读取顺序中超过其位置后到达,除非重置目录 ,否则目录不会读取这些文件。
使用最后修改时间戳读取顺序时,到达文件的时间戳应晚于目录中的文件。
同样,在使用按词典升序排列的文件名读取顺序时,请确保文件的命名约定是按词典升序排列的。 例如, filename-1.log, filename-2.log 等、 在 filename-10.log 之前运行正常。 如果 filename-10.log 在目录完成读取 filename-2.log 之后到达,则目录不会读取 filename-10.log ,因为它在词法上早于 filename-2.log
更多信息,请参阅 " 阅读订单 "。

Elasticsearch

具有 Elasticsearch的流启动失败,并出现 SSL / TLS 错误,例如:
ELASTICSEARCH_43 - Could not connect to the server(s) <SSL/TLS error details>
此消息可能因多种不同的 SSL / TLS 问题而显示。 查看相关信息的详细信息,以确定应采取的纠正措施。
下面举例说明何时会显示该信息的某个版本:
  • 若将阶段配置为使用 SSL / TLS ,但未指定启用 HTTPS 的端口。

    要解决这个问题,请指定一个 HTTPS 启用的端口。

  • 若将阶段配置为使用 SSL / TLS 并指定启用了 HTTPS 的端口,但错误配置了 URL (例如 http://<host>:<port>.

    要解决这个问题,请更新 URL 以使用 HTTPS ,具体做法如下: https://<host>:<port>.

  • 若您将环境配置为使用 SSL / TLS ,但指定信任存储库中未包含证书。

    要解决这个问题,请将有效证书放入信任库。

JDBC 资源

我的 MySQL JDBC 驱动程序 5.0 无法验证 JBDC 查询消费者源中的查询。
在查询中使用 LIMIT 子句时可能会出现这种情况。
解决方法:升级到 5.1 版本。
我正在使用 JDBC 读取 MySQL 数据。 为什么设置为零的日期时间值会被当作错误记录处理?
MySQL 将无效日期视为例外情况,因此 查询消费者和 多可选消费者都会为无效日期创建错误记录。 JDBC JDBC
您可以通过在源代码中设置 JDBC 配置属性来覆盖这一行为。 添加 zeroDateTimeBehavior 属性,并将值设置为 "convertToNull"。
有关此属性和其他 MySQL-specific JDBC 配置属性的更多信息,请参阅 http://dev.mysql.com/doc/connector-j/en/connector-j-reference-configuration-properties.html.
使用 JDBC Query Consumer 源的 流程不断停止,并出现以下错误:
JDBC_77 <db error message> attempting to execute query '<query>'. Giving up 
after <error count> errors as per stage configuration. First error: <first db error>.
数据源无法成功执行查询时,就会出现这种情况。 要处理瞬时连接或网络错误,可尝试增加 JDBC 选项卡上查询错误重试次数属性的值。
我的流程使用 JDBC ,在读取大表时会产生内存不足错误。
在 JDBC 源中启用自动提交属性后,某些驱动程序会忽略由源中最大批量大小属性配置的获取大小限制。 在读取内存中无法完全容纳的大型表格时,这可能会导致内存不足错误。
要解决这个问题,请禁用 "高级 "选项卡上的 "自动提交 "属性。

Oracle CDC 客户

Oracle CDC 客户端流程的数据预览不断超时。
使用 Oracle CDC 客户端的流程启动数据预览所需的时间可能比预期的要长。 如果预览超时,请尝试逐步增加预览超时属性。

有关对该数据源使用预览的更多信息,请参阅 Oracle CDC Client 的数据预览

我的 Oracle CDC 客户端流程在夏令时变化期间暂停了处理。
如果被配置为使用夏令时的数据库时区,则流程会在时间变化窗口期间暂停处理,以确保正确处理所有数据。 时间更改完成后, 流程将以上次保存的偏移量恢复处理。
更多信息,请参阅数据库时区

PostgreSQL CDC 客户端

PostgreSQL CDC 客户端流程会产生以下错误:
com.streamsets.pipeline.api.StageException: JDBC_606 - Wal Sender is not active
如果为源配置的 Status Interval 属性大于 PostgreSQL postgresql.conf 配置文件中的 wal_sender_timeout 属性,就会出现这种情况。
状态间隔属性应小于 wal_sender_timeout 属性。 理想情况下,它应设置为 wal_sender_timeout 属性值的一半。
例如,默认状态间隔为 30 秒,默认 wal_sender_timeout 值为 60000 毫秒或 1 分钟。

Salesforce

流量产生缓冲容量错误
当 Salesforce 流量因缓冲容量错误(如 Buffering capacity 1048576 exceeded )而失败时,可通过编辑订阅选项卡上的 "流缓冲区大小 "属性来增加缓冲区大小。

脚本

手动停止时, 流量无法停止
脚本必须包含在用户停止流程时停止脚本的代码。 在脚本中,使用 sdc.isStopped 方法检查流量是否已停止。
Jython 脚本不会在导入锁定后继续运行
如果 Jython 脚本在失败或出错时没有释放导入锁,则流程会冻结。 如果脚本不释放导入锁,则必须重启 Data Collector 才能释放锁。 为避免这一问题,请在 Jython 脚本中使用 try 语句和 finally 代码块。 更多信息,请参阅 Jython 脚本中的线程安全

SQL Server CDC 客户端

预览数据时未显示任何数值
设置 "最大事务长度 "属性后, 源会在多个时间窗口中获取数据。 该属性决定了每个时间窗口的大小。 预览数据仅显示第一个时间窗口的数据,但数据源可能需要处理多个时间窗口才能找到变化值并在预览中显示。

要在预览数据时查看数值,请增加最大事务长度或设置为 -1 ,以便在单个时间窗口内获取数据。

在读取所有更改之前,会生成 "无更多数据 "事件
设置 "最大事务长度 "属性后, 源会在多个时间窗口中获取数据。 该属性决定了每个时间窗口的大小。 在处理完每个时间窗口中的所有可用行后, 源会生成一个 "无更多数据 "事件,即使后续时间窗口仍可处理。

处理器数

使用以下提示来帮助处理程序。

加密与解密字段

启动流程后,日志中显示以下错误信息:
CONTAINER_0701 - Stage 'EncryptandDecryptFields_01' initialization error: java.lang.IllegalArgumentException: Input byte array has incorrect ending byte at 44
当处理器使用用户提供的密钥时,您提供的 Base64 编码密钥的长度必须与所选密码套件预期的密钥长度一致。 例如,如果处理器使用 264 位(32 字节)密码套件,则 Base64 编码密钥的长度必须为 32 字节。
当 Base64 编码密钥的长度与预期长度不符时,您可能会收到此信息。

目标

使用以下提示来帮助您确定目标阶段和系统。

Azure Data Lake Storage

Azure Data Lake Storage 目标似乎导致内存不足错误,以下对象使用了所有可用内存:
com.streamsets.pipeline.stage.destination.hdfs.writer.ActiveRecordWriters
出现这种情况的原因可能是 Hadoop 已知问题,它会影响 Azure Data Lake Storage Gen2 目标
有关变通方法的说明,请参阅 Gen2 目标的文档。

Cassandra

为什么只有几条记录有问题,而整个批次的流程都出现故障?
由于 Cassandra 的要求,当您向 Cassandra 集群写入数据时,批次是原子的。 这意味着一条或多条记录中的错误会导致整个批处理失败。
为什么我的所有数据都被错误发送? 每一批都失败了。
当每个批次都失败时,可能是数据类型不匹配。 Cassandra 要求数据类型与 列的数据类型完全匹配。 Cassandra
要确定问题所在,请检查与错误记录相关的错误信息。 如果出现类似下面的信息,说明数据类型不匹配。 以下错误信息表明数据类型不匹配,因为整数数据无法成功写入 Varchar 列:
CASSANDRA_06 - Could not prepare record 'sdk:': 
Invalid type for value 0 of CQL type varchar, expecting class java.lang.String but class java.lang. 
Integer provided`
要纠正这个问题,可以使用字段类型转换处理器来转换字段数据类型。 在这种情况下,您需要将整数数据转换为字符串。

Elasticsearch 目标

具有 Elasticsearch 目标流程启动失败,并出现 SSL / TLS 错误,例如:
ELASTICSEARCH_43 - Could not connect to the server(s) <SSL/TLS error details>
此消息可能因多种不同的 SSL / TLS 问题而显示。 查看相关信息的详细信息,以确定应采取的纠正措施。
下面举例说明何时会显示该信息的某个版本:
  • 若将阶段配置为使用 SSL / TLS ,但未指定启用 HTTPS 的端口。

    要解决这个问题,请指定一个 HTTPS 启用的端口。

  • 若将阶段配置为使用 SSL / TLS 并指定启用了 HTTPS 的端口,但错误配置了 URL (例如 http://<host>:<port>.

    要解决这个问题,请更新 URL 以使用 HTTPS ,具体做法如下: https://<host>:<port>.

  • 若您将环境配置为使用 SSL / TLS ,但指定信任存储库中未包含证书。

    要解决这个问题,请将有效证书放入信任库。

Kafka 生产者

Kafka 制作人可以创建主题吗?
Kafka 制片人可以在以下所有条件都为真时创建主题:
  • 您将 Kafka Producer 配置为写入不存在的主题名称。
  • 为 Kafka 生产者定义的 Kafka 代理中至少有一个已启用 auto.create.topics.enable 属性。
  • 当 Kafka Producer 查找主题时,具有启用属性的代理已启动并可用。
写入 Kafka 的流程不断失败并重新启动,循环往复。
流量尝试向 Kafka 0.8 写入的报文长度超过 Kafka 的最大报文大小时,就会出现这种情况。
解决方法:重新配置 Kafka 代理服务器,允许较大的信息,或确保传入记录在配置的限制范围内。

JDBC 连接

使用 JDBC 连接来连接数据库的阶段时,请使用以下提示。 对于某些阶段, 数据采集器包含连接数据库所需的 JDBC 驱动程序。 对于其他阶段,必须安装 JDBC 驱动程序。

以下阶段需要安装 JDBC 驱动程序:
  • JDBC 多种消费者来源
  • JDBC 查询消费者来源
  • MySQL 二进制日志
  • Oracle 散装货源
  • Oracle 疾病预防控制中心资料来源
  • Oracle CDC 客户端源
  • Oracle 多种消费者来源
  • Oracle 目标
  • SAP HANA 查询消费者来源
  • JDBC 查询处理器
  • JDBC 三通处理器
  • 使用数据库解析模式时的 SQL 解析器处理器
  • JDBC 生产商目标
  • JDBC 查询执行器

没有合适的驱动程序

数据收集器无法找到某个阶段的 JDBC 驱动程序时, 数据收集器可能会生成以下错误消息之一:
JDBC_00 - Cannot connect to specified database: com.streamsets.pipeline.api.StageException:
JDBC_06 - Failed to initialize connection pool: java.sql.SQLException: No suitable driver

确认是否已按照安装外部库中的说明安装了其他驱动程序。

您还可以使用这些额外的提示来帮助解决问题:

JDBC 连接字符串不正确。
该阶段的 JDBC 连接字符串属性必须包括 jdbc: 前缀。 例如, PostgreSQL 连接字符串可能是 jdbc:postgresql://<database host>/<database name>
请查阅数据库文档,了解所需的连接字符串格式。 例如,如果使用非标准端口,则必须在连接字符串中指定该端口。
包含 JDBC 驱动程序的外部资源存档文件未正确设置。
在外部资源存档文件中包含 JDBC 驱动程序时,存档文件必须使用所需的文件夹名称和目录结构。 有关所需归档文件结构的详细信息,请参阅归档结构
JDBC 驱动程序无法正确加载或注册。
有时, 流程所需的 JDBC 驱动程序无法正确加载或注册。 例如某个 JDBC 驱动程序可能无法正确支持 4.0JDBC 自动加载功能,从而导致错误信息 No suitable driver 出现。
有两种方法可以解决这个问题:
  • 在舞台的 " 传统驱动程序 "选项卡上的 JDBC Class Driver Name 属性中添加驱动程序的类名。
  • 配置数据收集器以自动加载特定驱动程序。 在数据收集器 配置属性中,取消注释 stage.conf_com.streamsets.pipeline.stage.jdbc.drivers.load 属性,并将其设置为以逗号分隔的 JDBC 驱动程序列表,这些驱动程序是流程中各阶段所需的。

无法连接数据库

数据收集器无法连接到数据库时,会显示类似以下的错误消息 - 具体消息可能因驱动程序而异:

JDBC_00 - Cannot connect to specified database: com.zaxxer.hikari.pool.PoolInitializationException:
Exception during pool initialization: The TCP/IP connection to the host 1.2.3.4, port 1234 has failed
在这种情况下,请确认数据收集器机器可以通过相关端口访问数据库机器。 为此,您可以使用 ping 和 netcat (nc) 等工具。 例如,验证主机 1.2.3.4 是否可访问:
$ ping 1.2.3.4 
PING 1.2.3.4 (1.2.3.4): 56 data bytes 
64 bytes from 1.2.3.4: icmp_seq=0 ttl=57 time=12.063 ms 
64 bytes from 1.2.3.4: icmp_seq=1 ttl=57 time=11.356 ms 
64 bytes from 1.2.3.4: icmp_seq=2 ttl=57 time=11.626 ms 
^C
--- 1.2.3.4 ping statistics --- 
3 packets transmitted, 3 packets received, 0.0% packet loss 
round-trip min/avg/max/stddev = 11.356/11.682/12.063/0.291 ms
然后验证 1234 端口是否可以访问:
$ nc -v -z -w2 1.2.3.4 1234 
nc: connectx to 1.2.3.4 port 1234 (tcp) failed: Connection refused

如果无法访问主机或端口,请检查路由和防火墙配置。

MySQL JDBC 驱动程序和时间值

由于 MySQL JDBC 驱动程序问题,该驱动程序无法返回毫秒级的时间值。 相反,驱动程序会将这些值返回给第二个程序。

例如,如果某列的值为 20:12:50.581 ,驱动程序会将其读作 20:12:50.000。

性能

使用以下提示帮助提高性能:
如何减少从源系统读取数据之间的延迟?
数据流读取记录的速度快于处理记录或将记录写入目标系统的速度时, 从源系统读取记录之间就会出现较长的延迟。 由于流量一次只处理一个批次,因此流量必须等到一个批次提交到目标系统后才能读取下一个批次,从而导致流量无法以稳定的速度读取。 以稳定的速度读取数据比零散读取数据性能更好。
如果无法提高处理器或目标的吞吐量,请限制流量 从源系统读取记录的速率。 配置流量速率限制属性,以定义流量在一秒内可读取的最大记录数。
当我尝试启动一个或多个流程时,会收到线程数量不足的错误信息
默认情况下, 数据收集器可同时运行约 22 个独立数据流。 如果同时运行大量独立数据流 ,可能会出现以下错误:
CONTAINER_0166 - Cannot start flow '<flow name>' as there are not enough threads available
要解决此错误,请增加数据收集器配置属性runner.thread.pool.size 属性的值。
如何提高总体流量性能?
您可以通过调整流量使用的批次大小来提高性能。 批量大小决定了一次通过流量的数据量。 默认情况下,批量大小为 1000 条记录。
您可以根据记录的大小或到达的速度来调整批量大小。 例如,如果记录非常多,可以减少批量大小来提高处理速度。 或者,如果记录较少且很快到达,可以增加批量大小。
试验批量大小并检查结果。
要更改批量大小,请在数据收集器配置属性中配置 production.maxBatchSize 属性。