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

ASF GitHub Bot commented on FLINK-4348:
---------------------------------------

Github user KurtYoung commented on the issue:

    https://github.com/apache/flink/pull/2571
  
    @mxm Thanks for your thoughts, i really like the discussion.:smirk:
    
    You just pointed out another point which i missed in the previous reply. 
Actually, i noticed that right after i posted the previous reply, as it turns 
out, my solution was exactly the same as you proposed! 
    
    Some comments inline:
    
    > It is guaranteed that the ResourceManager will receive an RPC response of 
some sort. Either a reply from the TaskExecutor, or a timeout/error which is 
returned by the future. If the request is then retried, the TaskExecutor 
receives the same request twice but will simply acknowledge it again
    
    I think it's no need to stick to the failed slot when the allocation fails 
by rpc. Just put it back to the free pool, and give us another shot. Actually, 
i think the pending requests acts like your extra list of unconfirmed requests. 
(And you pointed out last, we dont need this list indeed as TaskManager will 
correct our fault by rejecting allocation).
    
    >There is one more problem thought. How to prevent a false request from the 
ResourceManager to the TaskExecutor in case the ResourceManager hasn't received 
a reply from the TaskExecutor but the TaskExecutor has already removed the slot 
again
    
    When the allocation fails by rpc and we only have one free slot, it's true 
that we will keep retrying the same slot and keeping failing by rpc. And 
actually the task are finished, the slot becomes free again. Then out request 
reached TaskManager. It's ok for TaskManager to accept the request, at the end, 
JobManager will reject this allocation, and the slot will become free again. 
    
    >Again, the only solution for this problem seems to be to keep a list of 
unconfirmed slot allocation removal requests at the TaskExecutor. 
    
    Yes, i also thought this might be a solution. And i think this can work 
with the Heartbeat manager, since if you cannot send the free message to RM, 
you will not be able to send heartbeat too. After some timeout, RM will treat 
the TaskManager as dead, and some garbage collection logic in RM will take care 
all the allocations and slots which belong to this TaskManager. 
    
    All in all,  I think this version is still much simpler than the first one. 
:smirk:


> Implement slot allocation protocol with TaskExecutor
> ----------------------------------------------------
>
>                 Key: FLINK-4348
>                 URL: https://issues.apache.org/jira/browse/FLINK-4348
>             Project: Flink
>          Issue Type: Sub-task
>          Components: Cluster Management
>            Reporter: Kurt Young
>            Assignee: Maximilian Michels
>
> When slotManager finds a proper slot in the free pool for a slot request,  
> slotManager marks the slot as occupied, then tells the taskExecutor to give 
> the slot to the specified JobMaster. 
> when a slot request is sent to taskExecutor, it should contain following 
> parameters: AllocationID, JobID,  slotID, resourceManagerLeaderSessionID. 
> There exists 3 following possibilities of the response from taskExecutor, we 
> will discuss when each possibility happens and how to handle.
> 1. Ack request which means the taskExecutor gives the slot to the specified 
> jobMaster as expected.   
> 2. Decline request if the slot is already occupied by other AllocationID.  
> 3. Timeout which could caused by lost of request message or response message 
> or slow network transfer. 
> On the first occasion, ResourceManager need to do nothing. However, under the 
> second and third occasion, ResourceManager need to notify slotManager, 
> slotManager will verify and clear all the previous allocate information for 
> this slot request firstly, then try to find a proper slot for the slot 
> request again. This may cause some duplicate allocation, e.g. the slot 
> request to TaskManager is successful but the response is lost somehow, so we 
> may request a slot in another TaskManager, this causes two slots assigned to 
> one request, but it can be taken care of by rejecting registration at 
> JobMaster.
> There are still some question need to discuss in a step further.
> 1. Who send slotRequest to taskExecutor, SlotManager or ResourceManager? I 
> think it's better that SlotManager delegates the rpc call to ResourceManager 
> when SlotManager need to communicate with outside world.  ResourceManager 
> know which taskExecutor to send the request based on ResourceID. Besides this 
> RPC call which used to request slot to taskExecutor should not be a 
> RpcMethod,  because we hope only SlotManager has permission to call the 
> method, but the other component, for example JobMaster and TaskExecutor, 
> cannot call this method directly.
> 2. If JobMaster reject the slot offer from a TaskExecutor, the TaskExecutor 
> should notify the free slot to ResourceManager immediately, or wait for next 
> heartbeat sync. The advantage of first way is the resourceManager’s view 
> could be updated faster. The advantage of second way is save a RPC method in 
> ResourceManager.
> 3. There are two communication type. First, the slot request could be sent as 
> an ask operation where the response is returned as a future. Second, 
> resourceManager send the slot request in fire and forget way, the response 
> could be returned by an RPC call. I prefer the first one because it is more 
> simple and could save a RPC method in ResourceManager (for callback in the 
> second way).



--
This message was sent by Atlassian JIRA
(v6.3.4#6332)

Reply via email to