@Sharma No this thread is correct, I should have been more specific. To simplify, if you use a new executor (or the default one) for each task, it will be launched inside of a new container. In this situation, the *update* method on the ECP will never be called as far as I can tell.
On 3 December 2014 at 19:47, Tim Chen <[email protected]> wrote: > Forgot to mention, unless you have a custom executor that you launch as a > docker container (by putting DockerInfo in the ExecutorInfo in your > TaskInfo), you can then re-use that executor for multiple tasks. > > Tim > > On Wed, Dec 3, 2014 at 11:47 AM, Tim Chen <[email protected]> wrote: > >> Hi Sharma, >> >> Yes currently docker doesn't really support (out-of-box) launching >> multiple processes in the same container. They just recently added docker >> exec but not quite clear how it's best fit in mesos integration yet. >> >> So each task run in the Docker containerizer has to be a seperate >> container for now. >> >> Tim >> >> On Wed, Dec 3, 2014 at 11:09 AM, Sharma Podila <[email protected]> >> wrote: >> >>> Yes, although, there's a nuance to this specific situation. Here, the >>> same executor is being used for multiple tasks, but, the executor is >>> launching a different Docker container for each task. I was extending the >>> coarse grain allocation concept to within the executor (which is in a fine >>> grained allocation model). >>> What you mention, we do use already for a different framework, not the >>> one Diptanu is talking about. >>> >>> On Wed, Dec 3, 2014 at 11:04 AM, Connor Doyle <[email protected]> >>> wrote: >>> >>>> You're right Sharma, it's dependent upon the framework. If your >>>> scheduler sets a unique ExecutorID for each TaskInfo, then the executor >>>> will not be re-used and you won't have to worry about resizing the >>>> executor's container to accomodate subsequent tasks. This might be a >>>> reasonable simplification to start with, especially if your executor adds >>>> relatively low resource overhead. >>>> -- >>>> Connor >>>> >>>> >>>> > On Dec 3, 2014, at 10:20, Sharma Podila <[email protected]> wrote: >>>> > >>>> > This may have to do with fine-grain Vs coarse-grain resource >>>> allocation. Things may be easier for you, Diptanu, if you are using one >>>> Docker container per task (sort of coarse grain). In that case, I believe >>>> there's no need to alter a running Docker container's resources. Instead, >>>> the resource update of your executor translates into the right Docker >>>> containers running. There's some details to be worked out there, I am sure. >>>> > It sounds like Tom's strategy uses the same Docker container for >>>> multiple tasks. Tom, do correct me otherwise. >>>> > >>>> > On Wed, Dec 3, 2014 at 3:38 AM, Tom Arnfeld <[email protected]> wrote: >>>> > When Mesos is asked to a launch a task (with either a custom Executor >>>> or the built in CommandExecutor) it will first spawn the executor which >>>> _has_ to be a system process, launched via command. This process will be >>>> launched inside of a Docker container when using the previously mentioned >>>> containerizers. >>>> > >>>> > Once the Executor registers with the slave, the slave will send it a >>>> number of launchTask calls based on the number of tasks queued up for that >>>> executor. The Executor can then do as it pleases with those tasks, whether >>>> it's just a sleep(1) or to spawn a subprocess and do some other work. Given >>>> it is possible for the framework to specify resources for both tasks and >>>> executors, and the only thing which _has_ to be a system process is the >>>> executor, the mesos slave will limit the resources of the executor process >>>> to the sum of (TaskInfo.Executor.Resources + TaskInfo.Resources). >>>> > >>>> > Mesos also has the ability to launch new tasks on an already running >>>> executor, so it's important that mesos is able to dynamically scale the >>>> resource limits up and down over time. Designing a framework around this >>>> idea can lead to some complex and powerful workflows which would be a lot >>>> more complex to build without Mesos. >>>> > >>>> > Just for an example... Spark. >>>> > >>>> > 1) User launches a job on spark to map over some data >>>> > 2) Spark launches a first wave of tasks based on the offers it >>>> received (let's say T1 and T2) >>>> > 3) Mesos launches executors for those tasks (let's say E1 and E2) on >>>> different slaves >>>> > 4) Spark launches another wave of tasks based on offers, and tells >>>> mesos to use the same executor (E1 and E2) >>>> > 5) Mesos will simply call launchTasks(T{3,4}) on the two already >>>> running executors >>>> > >>>> > At point (3) mesos is going to launch a Docker container and execute >>>> your executor. However at (5) the executor is already running so the tasks >>>> will be handed to the already running executor. >>>> > >>>> > Mesos will guarantee you (i'm 99% sure) that the resources for your >>>> container have been updated to reflect the limits set on the tasks before >>>> handing the tasks to you. >>>> > >>>> > I hope that makes some sense! >>>> > >>>> > -- >>>> > >>>> > Tom Arnfeld >>>> > Developer // DueDil >>>> > >>>> > >>>> > On Wed, Dec 3, 2014 at 10:54 AM, Diptanu Choudhury < >>>> [email protected]> wrote: >>>> > >>>> > Thanks for the explanation Tom, yeah I just figured that out by >>>> reading your code! You're touching the memory.soft_limit_in_bytes and >>>> memory.limit_in_bytes directly. >>>> > >>>> > Still curios to understand in which situations Mesos Slave would call >>>> the external containerizer to update the resource limits of a container? My >>>> understanding was that once resource allocation happens for a task, >>>> resources are not taken away until the task exits[fails, crashes or >>>> finishes] or Mesos asks the slave to kill the task. >>>> > >>>> > On Wed, Dec 3, 2014 at 2:47 AM, Tom Arnfeld <[email protected]> wrote: >>>> > Hi Diptanu, >>>> > >>>> > That's correct, the ECP has the responsibility of updating the >>>> resource for a container, and it will do as new tasks are launched and >>>> killed for an executor. Since docker doesn't support this, our >>>> containerizer (Deimos does the same) goes behind docker to the cgroup for >>>> the container and updates the resources in a very similar way to the >>>> mesos-slave. I believe this is also what the built in Docker containerizer >>>> will do. >>>> > >>>> > >>>> https://github.com/duedil-ltd/mesos-docker-containerizer/blob/master/containerizer/commands/update.py#L35 >>>> > >>>> > Tom. >>>> > >>>> > -- >>>> > >>>> > Tom Arnfeld >>>> > Developer // DueDil >>>> > >>>> > >>>> > On Wed, Dec 3, 2014 at 10:45 AM, Diptanu Choudhury < >>>> [email protected]> wrote: >>>> > >>>> > Hi, >>>> > >>>> > I had a quick question about the external containerizer. I see that >>>> once the Task is launched, the ECP can receive the update calls, and the >>>> protobuf message passed to ECP with the update call is >>>> containerizer::Update. >>>> > >>>> > This protobuf has a Resources [list] field so does that mean Mesos >>>> might ask a running task to re-adjust the enforced resource limits? >>>> > >>>> > How would this work if the ECP was launching docker containers >>>> because Docker doesn't allow changing the resource limits once the >>>> container has been started? >>>> > >>>> > I am wondering how does Deimos and mesos-docker-containerizer handle >>>> this. >>>> > >>>> > -- >>>> > Thanks, >>>> > Diptanu Choudhury >>>> > Web - www.linkedin.com/in/diptanu >>>> > Twitter - @diptanu >>>> > >>>> > >>>> > >>>> > >>>> > -- >>>> > Thanks, >>>> > Diptanu Choudhury >>>> > Web - www.linkedin.com/in/diptanu >>>> > Twitter - @diptanu >>>> > >>>> > >>>> >>>> >>> >> >

