[ 
https://issues.apache.org/jira/browse/SPARK-22163?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=16193907#comment-16193907
 ] 

Michael N commented on SPARK-22163:
-----------------------------------

Vadim Semenov and Steve Loughran, per your inquiries in ticket 
https://issues.apache.org/jira/browse/SPARK-21999, I am posting the reply here 
because this issue involves Spark's design and not necessarily its code 
implementation.

---

My application does not spin up its own thread. All the threads are controlled 
by Spark.

Batch interval = 5 seconds

Batch #3
1. Driver - Spark Thread #1 - starts batch #3 and blocks until all slave 
threads are done with this batch
2. Slave A - Spark Thread #2 takes 10 seconds to complete
3. Slave B - Spark Thread #3 takes 1 minutes to complete

4. Both thread 1 for the driver and thread 2 for Slave A do not jump ahead and 
process batch #4. Instead, they synchronize with  thread B until it is done.  
=> So there is synchronization among the threads within the same batch, and 
also batch to batch is synchronous.

5. After Spark Thread #3 is done, the driver does other processing to finish 
the current batch.  In my case, it updates a list of objects.

The above steps repeat for the next batch #4 and subsequent batches.

Based on the exception stack trace, it looks like in step 5, Spark has another 
thread #4 that serializes application objects asynchronously, so it causes 
random occurrences of ConcurrentModificationException, because the list of 
objects is being changed by Spark Thread #1 the driver.

So the issue is not that my application "is modifying a collection 
asynchronously w.r.t. Spark" as Sean kept claiming. It is Spark's asynchronous 
operations among its own different threads. 

I understand Spark needs to serializes objects for check point purposes. 
However, since Spark controls all the threads and their synchronization, it is 
a Spark design's issue for the lack of synchronization between threads #1 and 
#4, that triggers ConcurrentModificationException. 

Further, even if the application does not modify its list, in step 5 the driver 
could be modifying multiple native objects say two integers.  The driver could 
have updated integer X and before it could update integer Y,  Spark's  thread 
#4  asynchronous serializes the application objects. So the persisted 
serialized data does not match with the actual data.  So a permutation of this 
issue is false positive condition with partial correct data.

One solution is the modify Spark's design to allow the serialization of 
application objects by Spark's  thread #4 to be configurable per application to 
be either asynchronous or synchronous.  That way, it is up to individual 
applications to decide based on the nature of their business requirements.


> Design Issue of Spark Streaming that Causes Random Run-time Exception
> ---------------------------------------------------------------------
>
>                 Key: SPARK-22163
>                 URL: https://issues.apache.org/jira/browse/SPARK-22163
>             Project: Spark
>          Issue Type: Bug
>          Components: DStreams, Structured Streaming
>    Affects Versions: 2.2.0
>         Environment: Spark Streaming
> Kafka
> Linux
>            Reporter: Michael N
>
> The application objects can contain List and can be modified dynamically as 
> well.   However, Spark Streaming framework asynchronously serializes the 
> application's objects as the application runs.  Therefore, it causes random 
> run-time exception on the List when Spark Streaming framework happens to 
> serializes the application's objects while the application modifies a List in 
> its own object.  
> In fact, there are multiple bugs reported about
> Caused by: java.util.ConcurrentModificationException
> at java.util.ArrayList.writeObject
> that are permutation of the same root cause. So the design issue of Spark 
> streaming framework is that it should do this serialization asynchronously.  
> Instead, it should either
> 1. do this serialization synchronously. This is preferred to eliminate the 
> issue completely.  Or
> 2. Allow it to be configured per application whether to do this serialization 
> synchronously or asynchronously, depending on the nature of each application.
> Also, Spark documentation should describe the conditions that trigger Spark 
> to do this type of serialization asynchronously, so the applications can work 
> around them until the fix is provided. 



--
This message was sent by Atlassian JIRA
(v6.4.14#64029)

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

Reply via email to