Thanks for the detailed explanation, Mahadev and Ted. The suggestions
are very valuable to us.


One additional question for how zookeeper handles errors:

Let's say we have 3 zookeeper servers Z1, Z2, Z3, and 3 clients C1, C2, C3.
C1 is connected to Z1.
C2 is connected to Z2.
C3 is connected to Z3.
C3 has created a ephemeral node.
What will happen if C3 and Z3 are partitioned from the rest of the
world? I guess C3 should see some errors, but where will I get it
(since C3 is not calling any zookeeper functions after the ephemeral
node is created.

I am reading 
http://mail-archives.apache.org/mod_mbox/hadoop-zookeeper-user/200807.mbox/%3c386225.96676...@web31804.mail.mud.yahoo.com%3e
There are 2 types of error that C3 needs to handle: 1. disconnections;
2. session expirations.
Is that still valid (since it's over 1.5 years old)?

I am also reading http://wiki.apache.org/hadoop/ZooKeeper/FAQ and I
guess these are the only 2 types of error that C3 need to handle.
Correct?


Zheng

On Sun, Jan 24, 2010 at 7:08 PM, Mahadev Konar <maha...@yahoo-inc.com> wrote:
> Hi  Zheng,
>> Let's say I have 100 long-running tasks and 20 nodes.
>> I want each of them to take up to 10 tasks. Each of the task should be
>> taken by one and only one node.
> This is exactly one of our users is using ZooKeeper for. You might want to
> make it more general  saying that a directory /tasks/ will have the list of
> tasks that need to be processed - (in your case 0-99). Basically storing the
> list of tasks also in zookeeper. The clients can then read of this list and
> try creating ephemeral nodes for tasks in mytasks/ and assign themselves as
> the owner of those tasks.
> You also should factor in the task dying or the machine not able to start
> that task. In that case the machine should just remove the ephemeral node
> that it created and should let the other machines take up that task.
>
> Here is one minor thing that might be useful. One of the zookeeper users who
> was doing exactly the same thing had the number of failures of booting up a
> task stored as data in /tasks/ znode for that task. This way all the
> machines can update this count and alert (to the admin) if a task cannot be
> started or worked upon by a given count of machines.
>
> Hope this helps.
>
> Thanks
> Mahadev
>
>
> On 1/23/10 12:58 AM, "Zheng Shao" <zsh...@gmail.com> wrote:
>
>> Let's say I have 100 long-running tasks and 20 nodes.
>> I want each of them to take up to 10 tasks. Each of the task should be
>> taken by one and only one node.
>>
>> Will the following solution solve the problem?
>>
>> Create a directory "/mytasks" in zookeeper.
>> Normally there will be 100 EPHEMERAL children in /mytasks directory,
>> named from "0" to "99".
>> The data of each will be the name of the node and the process id in
>> the node. This data is optional but allow us to do lookup from task to
>> node and process id.
>>
>>
>> Each node will start 10 processes.
>>   Each process will list the directory "/mytasks" with a watcher
>>   If trigger by the watcher, we relist the directory.
>>   If we found some missing files in the range of "0" to "99", we
>> create an EPHEMERAL node with no-overwrite option
>>     if the creation is successful, then we disable the watcher and
>> start processing the corresponding task (if something goes wrong, just
>> kill itself and the node will be gone)
>>     if not, we go back to wait for watcher.
>>
>> Will this work?
>>
>>
>
>



-- 
Yours,
Zheng

Reply via email to