簡體   English   中英

使用 JdbcSourceConnector 時區問題的雪花到 kafka 主題

[英]Snowflake to kafka topic using JdbcSourceConnector timezone issue

我正在使用 POC Usecase 設置 JDBC 連接器以從 Snowflake 數據庫獲取數據並將其推送到 Kafka 主題。 我遇到了與時區相關的問題,例外情況是Kafka Connect Date type should not have any time fields set to non-zero values

我正在使用雪花視圖來獲取數據,視圖列數據類型如下。 LOADDATE 是時間戳列,其數據類型是 TIMESTAMP_NTZ(9),其中 NTZ 是沒有時區的 UTC。

AGENTFIRSTNAME    VARCHAR(200)
AGENTMIDDLENAME    VARCHAR(200)
AGENTLASTNAME    VARCHAR(200)
AGENTNAME    VARCHAR(400)
AGENTKEY    NUMBER(38,0)
ISAGENCY    BOOLEAN
NPN            VARCHAR(50)
AGENTNUMBER    VARCHAR(100)
AGENTSTATE    VARCHAR(50)
VUENAME            VARCHAR(100)
GROUPNAME    VARCHAR(200)
TYPENAME    VARCHAR(80)
SUBMITDATE    DATE
CONFNUMBER    VARCHAR(100)
SRCE            VARCHAR(100)
INSFIRSTNAME    VARCHAR(16777216)
INSLASTNAME    VARCHAR(16777216)
INSCITY            VARCHAR(16777216)
INSSTATE    VARCHAR(16777216)
INSBIRTHDATE    DATE
LOADDATE    TIMESTAMP_NTZ(9)

我參考了 stackoverflow 和在線論壇,為了解決Kafka Connect Date type should not have any time fields set to non-zero values的問題,建議在連接器配置 db.timezone 參數中設置:

我已經運行查詢SHOW PARAMETERS LIKE 'TIMEZONE' IN ACCOUNT; 在雪花查詢 window 中查找時區並返回 America/Los_Angeles。
在此處輸入圖像描述

我嘗試使用 America/Los_Angeles 作為時區,然后我也嘗試在我的 sfconnector.json 中使用 UTC 作為時區並重建 docker 圖像,然后我運行了 docker 容器,但到目前為止我沒有在 Kafka 主題中發送消息。

我在 containerlog 文件中附加了異常,DataException: Kafka Connect Date type should not have any time fields set to non-zero values.

例外:

2023-01-27 09:34:50  (org.apache.kafka.connect.runtime.ConnectorConfig$EnrichedConnectorConfig)
2023-01-27 09:35:01 [2023-01-27 15:35:01,039] ERROR Error encountered in task jdbc-snowflake-source-0. Executing stage 'VALUE_CONVERTER' with class 'io.confluent.connect.avro.AvroConverter', where source record is = SourceRecord{sourcePartition={protocol=1, table=DEV_ED.DBO.VW_CENTERENROLLMENT_IC}, sourceOffset={}} ConnectRecord{topic='VW_CENTERENROLLMENT_IC', kafkaPartition=null, key=null, keySchema=null, value=Struct{AGENTFIRSTNAME=GRECHEN,AGENTMIDDLENAME=LYNN,AGENTLASTNAME=SOWELL,AGENTNAME=GRECHEN LYNN SOWELL,AGENTKEY=690042,ISAGENCY=false,NPN=8991475,AGENTNUMBER=8991475,AGENTSTATE=MI,VUENAME=POE,GROUPNAME=Ana,TYPENAME=PDP,SUBMITDATE=2020-10-20,CONFNUMBER=SMVW8PDYWC,SOURCE=Sunfest,INSFIRSTNAME=Mary,INSLASTNAME=Hoefler,INSCITY=Grand Rapids,INSSTATE=MI,INSBIRTHDATE=1970-09-21,LOADDATE=2020-12-09 16:29:51.0}, valueSchema=Schema{VW_CENTERENROLLMENT_IC:STRUCT}, timestamp=null, headers=ConnectHeaders(headers=)}. (org.apache.kafka.connect.runtime.errors.LogReporter)
2023-01-27 09:35:01 org.apache.kafka.connect.errors.DataException: Kafka Connect Date type should not have any time fields set to non-zero values.

附件是 sfconnector 配置和完整的 ContainerLog。

sf連接器配置:

{
"connector.class": "io.confluent.connect.jdbc.JdbcSourceConnector",
"mode": "timestamp",    
"timestamp.column.name": "LOADDATE",
"db.timezone": "America/Los_Angeles", 
"numeric.mapping": "best_fit",
"errors.log.include.messages": "true",    
"tasks.max": "1",
"validate.non.null": "false",   
"connection.url": "jdbc:snowflake://dp8881.central-us.azure.snowflakecomputing.com/?warehouse=ED_WH&db=DEV_ED&role=FR_IC_ANLYST&schema=DBO&user=IC_SERVICE_ACT&private_key_file=/tmp/snowflake_key.p8",
"errors.log.enable": "true", 
"table.whitelist": "DEV_ED.DBO.VW_CENTERENROLLMENT_IC",
"table.types": "VIEW"

}

感謝 Vamshi

在對問題進行故障排除時,我發現問題是由視圖中的時間戳和日期列引起的。 我必須在視圖中使用 convert_timezone 將時間戳和所有 DATE 列轉換為 UTC。 使用 convert_timezone 更新:

convert_timezone('UTC', Loaddate) 作為加載日期,convert_timezone('UTC', Submitdate) 作為提交日期,convert_timezone('UTC', Insbirthdate) 作為 Insbirthdate。

上述視圖更新后,創建了 Kafka 主題並將消息存儲到其中,但觀察到所有三個 convert_timezone 列數據,即(Loaddate、Submitdate、Insbirthdate)都丟失/未記錄在 Kafka 主題中。

根據 Docker 容器日志,警告/錯誤消息記錄為“當前不支持 TIMESTAMPTZ”

但是當我將這三個日期列轉換為 CHAR 時,這些值也會存儲到 Kafka 主題中。

感謝 Vamshi

想分享我上面帖子的解決方案:

我使用的是最新版本的 Jdbc 驅動程序 3.13.26 但是使用這個最新版本的 Jdbc 驅動程序,存在時間戳問題。 這里的類型是 TIMESTAMP_TZ,JDBC 的 GenericDialect 不支持它,因此我們得到像這樣的異常

a)WARN JDBC 當前不支持類型 2014 (TIMESTAMPIZ)。 b) 未找到 TIMESTAMP 列。

在舊版本 3.13.16 中,它以 TIMESTAMP 的形式出現。

所以我在我的 Dockerfile 中使用了 3.13.16 Jdbc 驅動程序安裝命令,並重新構建了 Docker 圖像,這修復了我的 POC Usecase 中的問題。

感謝 Vamshi

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM