[ 
https://issues.apache.org/jira/browse/SPARK-49123?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Cheng Pan resolved SPARK-49123.
-------------------------------
    Fix Version/s: 4.3.0
       Resolution: Fixed

Issue resolved by pull request 57297
[https://github.com/apache/spark/pull/57297]

> Improve the logging behavior when Spark loaded zero result from Kafka after 
> poll timeout
> ----------------------------------------------------------------------------------------
>
>                 Key: SPARK-49123
>                 URL: https://issues.apache.org/jira/browse/SPARK-49123
>             Project: Spark
>          Issue Type: Improvement
>          Components: SQL
>    Affects Versions: 3.3.0
>         Environment: java version: openjdk version "1.8.0_402"
> python version: 3.10.2
> os: amazon linux 2
>  
>  
>            Reporter: Yang Guo
>            Priority: Major
>              Labels: kafka, pull-request-available, sql
>             Fix For: 4.3.0
>
>   Original Estimate: 48h
>  Remaining Estimate: 48h
>
> When using spark structured streaming to read data from Kafka, the poll 
> request can time out if the producer is writing data to the topic in 
> transaction mode but not commit the transaction for a long time.
>  
> When this happened, the `r.isEmpty` as `True` but the offsetAfterPoll 
> changed. This will not thrown any error or warning logs. This makes users 
> have no idea why the related spark task delay for `pollTimeoutMs`. Here is 
> the related 
> [code|https://github.com/apache/spark/blob/v3.3.0/external/kafka-0-10-sql/src/main/scala/org/apache/spark/sql/kafka010/consumer/KafkaDataConsumer.scala#L85-L101]:
>  
>  
> {code:java}
>     if (r.isEmpty) {
>       // We cannot fetch anything after `poll`. Two possible cases:
>       // - `offset` is out of range so that Kafka returns nothing. 
> `OffsetOutOfRangeException` will
>       //   be thrown.
>       // - Cannot fetch any data before timeout. `TimeoutException` will be 
> thrown.
>       // - Fetched something but all of them are not invisible. This is a 
> valid case and let the
>       //   caller handles this.
>       if (offset < range.earliest || offset >= range.latest) {
>         throw new OffsetOutOfRangeException(
>           Map(topicPartition -> java.lang.Long.valueOf(offset)).asJava)
>       } else if (offset == offsetAfterPoll) {
>         throw new TimeoutException(
>           s"Cannot fetch record for offset $offset in $pollTimeoutMs 
> milliseconds")
>       }
>     }{code}
>  
>  
> To improve the user experience for troubleshooting when the poll get zero 
> result before timeout but offsetAfterPoll changed, there should add some 
> warning or error level logs:
>  
> A sample looks like the following:
>  
> {code:java}
>     if (r.isEmpty) {
>       // We cannot fetch anything after `poll`. Two possible cases:
>       // - `offset` is out of range so that Kafka returns nothing. 
> `OffsetOutOfRangeException` will
>       //   be thrown.
>       // - Cannot fetch any data before timeout. `TimeoutException` will be 
> thrown.
>       // - Fetched something but all of them are invisible. This is a valid 
> case and let the
>       //   caller handles this. Although this is a valid case, it is 
> necessary to add warning level logs to indicate zero data returned before 
> timeout.
>       if (offset < range.earliest || offset >= range.latest) {
>         throw new OffsetOutOfRangeException(
>           Map(topicPartition -> java.lang.Long.valueOf(offset)).asJava)
>       } else if (offset == offsetAfterPoll) {
>         throw new TimeoutException(
>           s"Cannot fetch record for offset $offset in $pollTimeoutMs 
> milliseconds")
>       } else {
>         logWarning(s"After taking $pollTimeoutMs milliseconds polling, ZERO 
> record fetched while offset changed from $offset to $offsetAfterPoll.")
>       }
> } {code}
>  
>  
> By the way, fix the typo from `Fetched something but all of them are not 
> invisible` to `Fetched something but all of them are invisible`.



--
This message was sent by Atlassian Jira
(v8.20.10#820010)

---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to