Suche senden
Hochladen
Programming with ZooKeeper - A basic tutorial
•
4 gefällt mir
•
1,475 views
Jeff Smith
Folgen
ZooKeeper
Weniger lesen
Mehr lesen
Technologie
Melden
Teilen
Melden
Teilen
1 von 12
Empfohlen
Akka.NET streams and reactive streams
Akka.NET streams and reactive streams
Bartosz Sypytkowski
Behind modern concurrency primitives
Behind modern concurrency primitives
Bartosz Sypytkowski
Tech Talks_25.04.15_Session 3_Tibor Sulyan_Distributed coordination with zook...
Tech Talks_25.04.15_Session 3_Tibor Sulyan_Distributed coordination with zook...
EPAM_Systems_Bulgaria
The uniform interface is 42
The uniform interface is 42
Yevhen Bobrov
A Playful Introduction to Rx
A Playful Introduction to Rx
Andrey Cheptsov
Isolated development in python
Isolated development in python
Andrés J. Díaz
Taking advantage of the Amazon Web Services (AWS) Family
Taking advantage of the Amazon Web Services (AWS) Family
Ben Hall
The Ring programming language version 1.9 book - Part 11 of 210
The Ring programming language version 1.9 book - Part 11 of 210
Mahmoud Samir Fayed
Empfohlen
Akka.NET streams and reactive streams
Akka.NET streams and reactive streams
Bartosz Sypytkowski
Behind modern concurrency primitives
Behind modern concurrency primitives
Bartosz Sypytkowski
Tech Talks_25.04.15_Session 3_Tibor Sulyan_Distributed coordination with zook...
Tech Talks_25.04.15_Session 3_Tibor Sulyan_Distributed coordination with zook...
EPAM_Systems_Bulgaria
The uniform interface is 42
The uniform interface is 42
Yevhen Bobrov
A Playful Introduction to Rx
A Playful Introduction to Rx
Andrey Cheptsov
Isolated development in python
Isolated development in python
Andrés J. Díaz
Taking advantage of the Amazon Web Services (AWS) Family
Taking advantage of the Amazon Web Services (AWS) Family
Ben Hall
The Ring programming language version 1.9 book - Part 11 of 210
The Ring programming language version 1.9 book - Part 11 of 210
Mahmoud Samir Fayed
Rx for Android & iOS by Harin Trivedi
Rx for Android & iOS by Harin Trivedi
harintrivedi
JJUG CCC 2011 Spring
JJUG CCC 2011 Spring
Kiyotaka Oku
Winform
Winform
quocphu199
The Ring programming language version 1.5.2 book - Part 13 of 181
The Ring programming language version 1.5.2 book - Part 13 of 181
Mahmoud Samir Fayed
Understanding Source Code Differences by Separating Refactoring Effects
Understanding Source Code Differences by Separating Refactoring Effects
Shinpei Hayashi
Ingesting streaming data for analysis in apache ignite (stream sets theme)
Ingesting streaming data for analysis in apache ignite (stream sets theme)
Tom Diederich
Dagger & rxjava & retrofit
Dagger & rxjava & retrofit
Ted Liang
Java 7 Launch Event at LyonJUG, Lyon France. Fork / Join framework and Projec...
Java 7 Launch Event at LyonJUG, Lyon France. Fork / Join framework and Projec...
julien.ponge
Java 7 LavaJUG
Java 7 LavaJUG
julien.ponge
Industrial Strength Groovy - Tools for the Professional Groovy Developer: Pau...
Industrial Strength Groovy - Tools for the Professional Groovy Developer: Pau...
Paul King
Testing multi outputformat based mapreduce
Testing multi outputformat based mapreduce
Ashok Agarwal
Exploring OpenFaaS autoscalability on Kubernetes with the Chaos Toolkit
Exploring OpenFaaS autoscalability on Kubernetes with the Chaos Toolkit
Sylvain Hellegouarch
Dpilot Source Code With ScreenShots
Dpilot Source Code With ScreenShots
DeepAnshu Sharma
Source Code for Dpilot
Source Code for Dpilot
Nidhi Chauhan
разработка серверов и серверных приложений лекция №4
разработка серверов и серверных приложений лекция №4
Eugeniy Tyumentcev
Java libraries you can't afford to miss
Java libraries you can't afford to miss
Andres Almiray
Android workshop
Android workshop
Michael Galpin
IPC: AIDL is sexy, not a curse
IPC: AIDL is sexy, not a curse
Yonatan Levin
ZooKeeper Recipes and Solutions
ZooKeeper Recipes and Solutions
Jeff Smith
ZooKeeper Recipes and Solutions
ZooKeeper Recipes and Solutions
Jeff Smith
ZooKeeper Recipes and Solutions
ZooKeeper Recipes and Solutions
Jeff Smith
Junit_.pptx
Junit_.pptx
Suman Sourav
Weitere ähnliche Inhalte
Was ist angesagt?
Rx for Android & iOS by Harin Trivedi
Rx for Android & iOS by Harin Trivedi
harintrivedi
JJUG CCC 2011 Spring
JJUG CCC 2011 Spring
Kiyotaka Oku
Winform
Winform
quocphu199
The Ring programming language version 1.5.2 book - Part 13 of 181
The Ring programming language version 1.5.2 book - Part 13 of 181
Mahmoud Samir Fayed
Understanding Source Code Differences by Separating Refactoring Effects
Understanding Source Code Differences by Separating Refactoring Effects
Shinpei Hayashi
Ingesting streaming data for analysis in apache ignite (stream sets theme)
Ingesting streaming data for analysis in apache ignite (stream sets theme)
Tom Diederich
Dagger & rxjava & retrofit
Dagger & rxjava & retrofit
Ted Liang
Java 7 Launch Event at LyonJUG, Lyon France. Fork / Join framework and Projec...
Java 7 Launch Event at LyonJUG, Lyon France. Fork / Join framework and Projec...
julien.ponge
Java 7 LavaJUG
Java 7 LavaJUG
julien.ponge
Industrial Strength Groovy - Tools for the Professional Groovy Developer: Pau...
Industrial Strength Groovy - Tools for the Professional Groovy Developer: Pau...
Paul King
Testing multi outputformat based mapreduce
Testing multi outputformat based mapreduce
Ashok Agarwal
Exploring OpenFaaS autoscalability on Kubernetes with the Chaos Toolkit
Exploring OpenFaaS autoscalability on Kubernetes with the Chaos Toolkit
Sylvain Hellegouarch
Dpilot Source Code With ScreenShots
Dpilot Source Code With ScreenShots
DeepAnshu Sharma
Source Code for Dpilot
Source Code for Dpilot
Nidhi Chauhan
разработка серверов и серверных приложений лекция №4
разработка серверов и серверных приложений лекция №4
Eugeniy Tyumentcev
Java libraries you can't afford to miss
Java libraries you can't afford to miss
Andres Almiray
Android workshop
Android workshop
Michael Galpin
IPC: AIDL is sexy, not a curse
IPC: AIDL is sexy, not a curse
Yonatan Levin
Was ist angesagt?
(18)
Rx for Android & iOS by Harin Trivedi
Rx for Android & iOS by Harin Trivedi
JJUG CCC 2011 Spring
JJUG CCC 2011 Spring
Winform
Winform
The Ring programming language version 1.5.2 book - Part 13 of 181
The Ring programming language version 1.5.2 book - Part 13 of 181
Understanding Source Code Differences by Separating Refactoring Effects
Understanding Source Code Differences by Separating Refactoring Effects
Ingesting streaming data for analysis in apache ignite (stream sets theme)
Ingesting streaming data for analysis in apache ignite (stream sets theme)
Dagger & rxjava & retrofit
Dagger & rxjava & retrofit
Java 7 Launch Event at LyonJUG, Lyon France. Fork / Join framework and Projec...
Java 7 Launch Event at LyonJUG, Lyon France. Fork / Join framework and Projec...
Java 7 LavaJUG
Java 7 LavaJUG
Industrial Strength Groovy - Tools for the Professional Groovy Developer: Pau...
Industrial Strength Groovy - Tools for the Professional Groovy Developer: Pau...
Testing multi outputformat based mapreduce
Testing multi outputformat based mapreduce
Exploring OpenFaaS autoscalability on Kubernetes with the Chaos Toolkit
Exploring OpenFaaS autoscalability on Kubernetes with the Chaos Toolkit
Dpilot Source Code With ScreenShots
Dpilot Source Code With ScreenShots
Source Code for Dpilot
Source Code for Dpilot
разработка серверов и серверных приложений лекция №4
разработка серверов и серверных приложений лекция №4
Java libraries you can't afford to miss
Java libraries you can't afford to miss
Android workshop
Android workshop
IPC: AIDL is sexy, not a curse
IPC: AIDL is sexy, not a curse
Ähnlich wie Programming with ZooKeeper - A basic tutorial
ZooKeeper Recipes and Solutions
ZooKeeper Recipes and Solutions
Jeff Smith
ZooKeeper Recipes and Solutions
ZooKeeper Recipes and Solutions
Jeff Smith
ZooKeeper Recipes and Solutions
ZooKeeper Recipes and Solutions
Jeff Smith
Junit_.pptx
Junit_.pptx
Suman Sourav
33rd Degree 2013, Bad Tests, Good Tests
33rd Degree 2013, Bad Tests, Good Tests
Tomek Kaczanowski
Struts2 - 101
Struts2 - 101
Munish Gupta
Construire une application JavaFX 8 avec gradle
Construire une application JavaFX 8 avec gradle
Thierry Wasylczenko
JS everywhere 2011
JS everywhere 2011
Oleg Podsechin
GDG Jakarta Meetup - Streaming Analytics With Apache Beam
GDG Jakarta Meetup - Streaming Analytics With Apache Beam
Imre Nagi
OSGi and Eclipse RCP
OSGi and Eclipse RCP
Eric Jain
Servletand sessiontracking
Servletand sessiontracking
vamsi krishna
Beyond Unit Testing
Beyond Unit Testing
Steve Loughran
[xp2013] Narrow Down What to Test
[xp2013] Narrow Down What to Test
Zsolt Fabok
10 Excellent Ways to Secure Spring Boot Applications - Okta Webinar 2020
10 Excellent Ways to Secure Spring Boot Applications - Okta Webinar 2020
Matt Raible
JUnit & Mockito, first steps
JUnit & Mockito, first steps
Renato Primavera
Developing Real-Time Data Pipelines with Apache Kafka
Developing Real-Time Data Pipelines with Apache Kafka
Joe Stein
Building Scalable Stateless Applications with RxJava
Building Scalable Stateless Applications with RxJava
Rick Warren
Appium Automation with Kotlin
Appium Automation with Kotlin
RapidValue
MT_01_unittest_python.pdf
MT_01_unittest_python.pdf
Hans Jones
Curator intro
Curator intro
Jordan Zimmerman
Ähnlich wie Programming with ZooKeeper - A basic tutorial
(20)
ZooKeeper Recipes and Solutions
ZooKeeper Recipes and Solutions
ZooKeeper Recipes and Solutions
ZooKeeper Recipes and Solutions
ZooKeeper Recipes and Solutions
ZooKeeper Recipes and Solutions
Junit_.pptx
Junit_.pptx
33rd Degree 2013, Bad Tests, Good Tests
33rd Degree 2013, Bad Tests, Good Tests
Struts2 - 101
Struts2 - 101
Construire une application JavaFX 8 avec gradle
Construire une application JavaFX 8 avec gradle
JS everywhere 2011
JS everywhere 2011
GDG Jakarta Meetup - Streaming Analytics With Apache Beam
GDG Jakarta Meetup - Streaming Analytics With Apache Beam
OSGi and Eclipse RCP
OSGi and Eclipse RCP
Servletand sessiontracking
Servletand sessiontracking
Beyond Unit Testing
Beyond Unit Testing
[xp2013] Narrow Down What to Test
[xp2013] Narrow Down What to Test
10 Excellent Ways to Secure Spring Boot Applications - Okta Webinar 2020
10 Excellent Ways to Secure Spring Boot Applications - Okta Webinar 2020
JUnit & Mockito, first steps
JUnit & Mockito, first steps
Developing Real-Time Data Pipelines with Apache Kafka
Developing Real-Time Data Pipelines with Apache Kafka
Building Scalable Stateless Applications with RxJava
Building Scalable Stateless Applications with RxJava
Appium Automation with Kotlin
Appium Automation with Kotlin
MT_01_unittest_python.pdf
MT_01_unittest_python.pdf
Curator intro
Curator intro
Mehr von Jeff Smith
vi-vim-cheat-sheet.pdf
vi-vim-cheat-sheet.pdf
Jeff Smith
dfgdgsdg
dfgdgsdg
Jeff Smith
3yudh.pdf
3yudh.pdf
Jeff Smith
nvjiz.pdf
nvjiz.pdf
Jeff Smith
nvjiz.pdf
nvjiz.pdf
Jeff Smith
nvjiz.pdf
nvjiz.pdf
Jeff Smith
nvjiz.pdf
nvjiz.pdf
Jeff Smith
nvjiz.pdf
nvjiz.pdf
Jeff Smith
mctpr.pdf
mctpr.pdf
Jeff Smith
mctpr.pdf
mctpr.pdf
Jeff Smith
mctpr.pdf
mctpr.pdf
Jeff Smith
mctpr.pdf
mctpr.pdf
Jeff Smith
mctpr.pdf
mctpr.pdf
Jeff Smith
0nba4.pdf
0nba4.pdf
Jeff Smith
0nba4.pdf
0nba4.pdf
Jeff Smith
4wa4i.pdf
4wa4i.pdf
Jeff Smith
7k3gy.pdf
7k3gy.pdf
Jeff Smith
b33t2.pdf
b33t2.pdf
Jeff Smith
cqqk2.pdf
cqqk2.pdf
Jeff Smith
ebcbe.docx
ebcbe.docx
Jeff Smith
Mehr von Jeff Smith
(20)
vi-vim-cheat-sheet.pdf
vi-vim-cheat-sheet.pdf
dfgdgsdg
dfgdgsdg
3yudh.pdf
3yudh.pdf
nvjiz.pdf
nvjiz.pdf
nvjiz.pdf
nvjiz.pdf
nvjiz.pdf
nvjiz.pdf
nvjiz.pdf
nvjiz.pdf
nvjiz.pdf
nvjiz.pdf
mctpr.pdf
mctpr.pdf
mctpr.pdf
mctpr.pdf
mctpr.pdf
mctpr.pdf
mctpr.pdf
mctpr.pdf
mctpr.pdf
mctpr.pdf
0nba4.pdf
0nba4.pdf
0nba4.pdf
0nba4.pdf
4wa4i.pdf
4wa4i.pdf
7k3gy.pdf
7k3gy.pdf
b33t2.pdf
b33t2.pdf
cqqk2.pdf
cqqk2.pdf
ebcbe.docx
ebcbe.docx
Kürzlich hochgeladen
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
Miguel Araújo
The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024
Rafal Los
IAC 2024 - IA Fast Track to Search Focused AI Solutions
IAC 2024 - IA Fast Track to Search Focused AI Solutions
Enterprise Knowledge
Presentation on how to chat with PDF using ChatGPT code interpreter
Presentation on how to chat with PDF using ChatGPT code interpreter
naman860154
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
Drew Madelung
Understanding Discord NSFW Servers A Guide for Responsible Users.pdf
Understanding Discord NSFW Servers A Guide for Responsible Users.pdf
UK Journal
CNv6 Instructor Chapter 6 Quality of Service
CNv6 Instructor Chapter 6 Quality of Service
giselly40
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
HampshireHUG
How to convert PDF to text with Nanonets
How to convert PDF to text with Nanonets
naman860154
Finology Group – Insurtech Innovation Award 2024
Finology Group – Insurtech Innovation Award 2024
The Digital Insurer
08448380779 Call Girls In Greater Kailash - I Women Seeking Men
08448380779 Call Girls In Greater Kailash - I Women Seeking Men
Delhi Call girls
Boost PC performance: How more available memory can improve productivity
Boost PC performance: How more available memory can improve productivity
Principled Technologies
08448380779 Call Girls In Diplomatic Enclave Women Seeking Men
08448380779 Call Girls In Diplomatic Enclave Women Seeking Men
Delhi Call girls
Factors to Consider When Choosing Accounts Payable Services Providers.pptx
Factors to Consider When Choosing Accounts Payable Services Providers.pptx
Katpro Technologies
Tata AIG General Insurance Company - Insurer Innovation Award 2024
Tata AIG General Insurance Company - Insurer Innovation Award 2024
The Digital Insurer
TrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
TrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
TrustArc
Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...
Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...
Igalia
Automating Google Workspace (GWS) & more with Apps Script
Automating Google Workspace (GWS) & more with Apps Script
wesley chun
Exploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone Processors
debabhi2
Histor y of HAM Radio presentation slide
Histor y of HAM Radio presentation slide
vu2urc
Kürzlich hochgeladen
(20)
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024
IAC 2024 - IA Fast Track to Search Focused AI Solutions
IAC 2024 - IA Fast Track to Search Focused AI Solutions
Presentation on how to chat with PDF using ChatGPT code interpreter
Presentation on how to chat with PDF using ChatGPT code interpreter
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
Understanding Discord NSFW Servers A Guide for Responsible Users.pdf
Understanding Discord NSFW Servers A Guide for Responsible Users.pdf
CNv6 Instructor Chapter 6 Quality of Service
CNv6 Instructor Chapter 6 Quality of Service
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
How to convert PDF to text with Nanonets
How to convert PDF to text with Nanonets
Finology Group – Insurtech Innovation Award 2024
Finology Group – Insurtech Innovation Award 2024
08448380779 Call Girls In Greater Kailash - I Women Seeking Men
08448380779 Call Girls In Greater Kailash - I Women Seeking Men
Boost PC performance: How more available memory can improve productivity
Boost PC performance: How more available memory can improve productivity
08448380779 Call Girls In Diplomatic Enclave Women Seeking Men
08448380779 Call Girls In Diplomatic Enclave Women Seeking Men
Factors to Consider When Choosing Accounts Payable Services Providers.pptx
Factors to Consider When Choosing Accounts Payable Services Providers.pptx
Tata AIG General Insurance Company - Insurer Innovation Award 2024
Tata AIG General Insurance Company - Insurer Innovation Award 2024
TrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
TrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...
Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...
Automating Google Workspace (GWS) & more with Apps Script
Automating Google Workspace (GWS) & more with Apps Script
Exploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone Processors
Histor y of HAM Radio presentation slide
Histor y of HAM Radio presentation slide
Programming with ZooKeeper - A basic tutorial
1.
Copyright © 2008
The Apache Software Foundation. All rights reserved. Programming with ZooKeeper - A basic tutorial by Table of contents 1 Introduction........................................................................................................................ 2 2 Barriers............................................................................................................................... 3 3 Producer-Consumer Queues...............................................................................................5 4 Complete Source Listing....................................................................................................7
2.
Programming with ZooKeeper
- A basic tutorial Page 2Copyright © 2008 The Apache Software Foundation. All rights reserved. 1 Introduction In this tutorial, we show simple implementations of barriers and producer-consumer queues using ZooKeeper. We call the respective classes Barrier and Queue. These examples assume that you have at least one ZooKeeper server running. Both primitives use the following common excerpt of code: static ZooKeeper zk = null; static Integer mutex; String root; SyncPrimitive(String address) { if(zk == null){ try { System.out.println("Starting ZK:"); zk = new ZooKeeper(address, 3000, this); mutex = new Integer(-1); System.out.println("Finished starting ZK: " + zk); } catch (IOException e) { System.out.println(e.toString()); zk = null; } } } synchronized public void process(WatchedEvent event) { synchronized (mutex) { mutex.notify(); } } Both classes extend SyncPrimitive. In this way, we execute steps that are common to all primitives in the constructor of SyncPrimitive. To keep the examples simple, we create a ZooKeeper object the first time we instantiate either a barrier object or a queue object, and we declare a static variable that is a reference to this object. The subsequent instances of Barrier and Queue check whether a ZooKeeper object exists. Alternatively, we could have the application creating a ZooKeeper object and passing it to the constructor of Barrier and Queue. We use the process() method to process notifications triggered due to watches. In the following discussion, we present code that sets watches. A watch is internal structure that enables ZooKeeper to notify a client of a change to a node. For example, if a client is waiting for other clients to leave a barrier, then it can set a watch and wait for modifications to a particular node, which can indicate that it is the end of the wait. This point becomes clear once we go over the examples.
3.
Programming with ZooKeeper
- A basic tutorial Page 3Copyright © 2008 The Apache Software Foundation. All rights reserved. 2 Barriers A barrier is a primitive that enables a group of processes to synchronize the beginning and the end of a computation. The general idea of this implementation is to have a barrier node that serves the purpose of being a parent for individual process nodes. Suppose that we call the barrier node "/b1". Each process "p" then creates a node "/b1/p". Once enough processes have created their corresponding nodes, joined processes can start the computation. In this example, each process instantiates a Barrier object, and its constructor takes as parameters: • the address of a ZooKeeper server (e.g., "zoo1.foo.com:2181") • the path of the barrier node on ZooKeeper (e.g., "/b1") • the size of the group of processes The constructor of Barrier passes the address of the Zookeeper server to the constructor of the parent class. The parent class creates a ZooKeeper instance if one does not exist. The constructor of Barrier then creates a barrier node on ZooKeeper, which is the parent node of all process nodes, and we call root (Note: This is not the ZooKeeper root "/"). /** * Barrier constructor * * @param address * @param root * @param size */ Barrier(String address, String root, int size) { super(address); this.root = root; this.size = size; // Create barrier node if (zk != null) { try { Stat s = zk.exists(root, false); if (s == null) { zk.create(root, new byte[0], Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT); } } catch (KeeperException e) { System.out .println("Keeper exception when instantiating queue: " + e.toString()); } catch (InterruptedException e) { System.out.println("Interrupted exception"); } } // My node name try { name = new String(InetAddress.getLocalHost().getCanonicalHostName().toString());
4.
Programming with ZooKeeper
- A basic tutorial Page 4Copyright © 2008 The Apache Software Foundation. All rights reserved. } catch (UnknownHostException e) { System.out.println(e.toString()); } } To enter the barrier, a process calls enter(). The process creates a node under the root to represent it, using its host name to form the node name. It then wait until enough processes have entered the barrier. A process does it by checking the number of children the root node has with "getChildren()", and waiting for notifications in the case it does not have enough. To receive a notification when there is a change to the root node, a process has to set a watch, and does it through the call to "getChildren()". In the code, we have that "getChildren()" has two parameters. The first one states the node to read from, and the second is a boolean flag that enables the process to set a watch. In the code the flag is true. /** * Join barrier * * @return * @throws KeeperException * @throws InterruptedException */ boolean enter() throws KeeperException, InterruptedException{ zk.create(root + "/" + name, new byte[0], Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL_SEQUENTIAL); while (true) { synchronized (mutex) { List<String> list = zk.getChildren(root, true); if (list.size() < size) { mutex.wait(); } else { return true; } } } } Note that enter() throws both KeeperException and InterruptedException, so it is the reponsability of the application to catch and handle such exceptions. Once the computation is finished, a process calls leave() to leave the barrier. First it deletes its corresponding node, and then it gets the children of the root node. If there is at least one child, then it waits for a notification (obs: note that the second parameter of the call to getChildren() is true, meaning that ZooKeeper has to set a watch on the the root node). Upon reception of a notification, it checks once more whether the root node has any child. /** * Wait until all reach barrier
5.
Programming with ZooKeeper
- A basic tutorial Page 5Copyright © 2008 The Apache Software Foundation. All rights reserved. * * @return * @throws KeeperException * @throws InterruptedException */ boolean leave() throws KeeperException, InterruptedException{ zk.delete(root + "/" + name, 0); while (true) { synchronized (mutex) { List<String> list = zk.getChildren(root, true); if (list.size() > 0) { mutex.wait(); } else { return true; } } } } } 3 Producer-Consumer Queues A producer-consumer queue is a distributed data estructure thata group of processes use to generate and consume items. Producer processes create new elements and add them to the queue. Consumer processes remove elements from the list, and process them. In this implementation, the elements are simple integers. The queue is represented by a root node, and to add an element to the queue, a producer process creates a new node, a child of the root node. The following excerpt of code corresponds to the constructor of the object. As with Barrier objects, it first calls the constructor of the parent class, SyncPrimitive, that creates a ZooKeeper object if one doesn't exist. It then verifies if the root node of the queue exists, and creates if it doesn't. /** * Constructor of producer-consumer queue * * @param address * @param name */ Queue(String address, String name) { super(address); this.root = name; // Create ZK node name if (zk != null) { try { Stat s = zk.exists(root, false); if (s == null) { zk.create(root, new byte[0], Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT); } } catch (KeeperException e) {
6.
Programming with ZooKeeper
- A basic tutorial Page 6Copyright © 2008 The Apache Software Foundation. All rights reserved. System.out .println("Keeper exception when instantiating queue: " + e.toString()); } catch (InterruptedException e) { System.out.println("Interrupted exception"); } } } A producer process calls "produce()" to add an element to the queue, and passes an integer as an argument. To add an element to the queue, the method creates a new node using "create()", and uses the SEQUENCE flag to instruct ZooKeeper to append the value of the sequencer counter associated to the root node. In this way, we impose a total order on the elements of the queue, thus guaranteeing that the oldest element of the queue is the next one consumed. /** * Add element to the queue. * * @param i * @return */ boolean produce(int i) throws KeeperException, InterruptedException{ ByteBuffer b = ByteBuffer.allocate(4); byte[] value; // Add child with value i b.putInt(i); value = b.array(); zk.create(root + "/element", value, Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT_SEQUENTIAL); return true; } To consume an element, a consumer process obtains the children of the root node, reads the node with smallest counter value, and returns the element. Note that if there is a conflict, then one of the two contending processes won't be able to delete the node and the delete operation will throw an exception. A call to getChildren() returns the list of children in lexicographic order. As lexicographic order does not necessary follow the numerical order of the counter values, we need to decide which element is the smallest. To decide which one has the smallest counter value, we traverse the list, and remove the prefix "element" from each one. /** * Remove first element from the queue. * * @return * @throws KeeperException
7.
Programming with ZooKeeper
- A basic tutorial Page 7Copyright © 2008 The Apache Software Foundation. All rights reserved. * @throws InterruptedException */ int consume() throws KeeperException, InterruptedException{ int retvalue = -1; Stat stat = null; // Get the first element available while (true) { synchronized (mutex) { List<String> list = zk.getChildren(root, true); if (list.size() == 0) { System.out.println("Going to wait"); mutex.wait(); } else { Integer min = new Integer(list.get(0).substring(7)); for(String s : list){ Integer tempValue = new Integer(s.substring(7)); //System.out.println("Temporary value: " + tempValue); if(tempValue < min) min = tempValue; } System.out.println("Temporary value: " + root + "/element" + min); byte[] b = zk.getData(root + "/element" + min, false, stat); zk.delete(root + "/element" + min, 0); ByteBuffer buffer = ByteBuffer.wrap(b); retvalue = buffer.getInt(); return retvalue; } } } } } 4 Complete Source Listing SyncPrimitive.JavaSyncPrimitive.Java import java.io.IOException; import java.net.InetAddress; import java.net.UnknownHostException; import java.nio.ByteBuffer; import java.util.List; import java.util.Random; import org.apache.zookeeper.CreateMode; import org.apache.zookeeper.KeeperException; import org.apache.zookeeper.WatchedEvent; import org.apache.zookeeper.Watcher; import org.apache.zookeeper.ZooKeeper; import org.apache.zookeeper.ZooDefs.Ids; import org.apache.zookeeper.data.Stat; public class SyncPrimitive implements Watcher { static ZooKeeper zk = null; static Integer mutex;
8.
Programming with ZooKeeper
- A basic tutorial Page 8Copyright © 2008 The Apache Software Foundation. All rights reserved. String root; SyncPrimitive(String address) { if(zk == null){ try { System.out.println("Starting ZK:"); zk = new ZooKeeper(address, 3000, this); mutex = new Integer(-1); System.out.println("Finished starting ZK: " + zk); } catch (IOException e) { System.out.println(e.toString()); zk = null; } } //else mutex = new Integer(-1); } synchronized public void process(WatchedEvent event) { synchronized (mutex) { //System.out.println("Process: " + event.getType()); mutex.notify(); } } /** * Barrier */ static public class Barrier extends SyncPrimitive { int size; String name; /** * Barrier constructor * * @param address * @param root * @param size */ Barrier(String address, String root, int size) { super(address); this.root = root; this.size = size; // Create barrier node if (zk != null) { try { Stat s = zk.exists(root, false); if (s == null) { zk.create(root, new byte[0], Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT); } } catch (KeeperException e) { System.out .println("Keeper exception when instantiating queue: " + e.toString()); } catch (InterruptedException e) { System.out.println("Interrupted exception"); } }
9.
Programming with ZooKeeper
- A basic tutorial Page 9Copyright © 2008 The Apache Software Foundation. All rights reserved. // My node name try { name = new String(InetAddress.getLocalHost().getCanonicalHostName().toString()); } catch (UnknownHostException e) { System.out.println(e.toString()); } } /** * Join barrier * * @return * @throws KeeperException * @throws InterruptedException */ boolean enter() throws KeeperException, InterruptedException{ zk.create(root + "/" + name, new byte[0], Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL_SEQUENTIAL); while (true) { synchronized (mutex) { List<String> list = zk.getChildren(root, true); if (list.size() < size) { mutex.wait(); } else { return true; } } } } /** * Wait until all reach barrier * * @return * @throws KeeperException * @throws InterruptedException */ boolean leave() throws KeeperException, InterruptedException{ zk.delete(root + "/" + name, 0); while (true) { synchronized (mutex) { List<String> list = zk.getChildren(root, true); if (list.size() > 0) { mutex.wait(); } else { return true; } } } } } /** * Producer-Consumer queue
10.
Programming with ZooKeeper
- A basic tutorial Page 10Copyright © 2008 The Apache Software Foundation. All rights reserved. */ static public class Queue extends SyncPrimitive { /** * Constructor of producer-consumer queue * * @param address * @param name */ Queue(String address, String name) { super(address); this.root = name; // Create ZK node name if (zk != null) { try { Stat s = zk.exists(root, false); if (s == null) { zk.create(root, new byte[0], Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT); } } catch (KeeperException e) { System.out .println("Keeper exception when instantiating queue: " + e.toString()); } catch (InterruptedException e) { System.out.println("Interrupted exception"); } } } /** * Add element to the queue. * * @param i * @return */ boolean produce(int i) throws KeeperException, InterruptedException{ ByteBuffer b = ByteBuffer.allocate(4); byte[] value; // Add child with value i b.putInt(i); value = b.array(); zk.create(root + "/element", value, Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT_SEQUENTIAL); return true; } /** * Remove first element from the queue. * * @return * @throws KeeperException * @throws InterruptedException */ int consume() throws KeeperException, InterruptedException{ int retvalue = -1;
11.
Programming with ZooKeeper
- A basic tutorial Page 11Copyright © 2008 The Apache Software Foundation. All rights reserved. Stat stat = null; // Get the first element available while (true) { synchronized (mutex) { List<String> list = zk.getChildren(root, true); if (list.size() == 0) { System.out.println("Going to wait"); mutex.wait(); } else { Integer min = new Integer(list.get(0).substring(7)); for(String s : list){ Integer tempValue = new Integer(s.substring(7)); //System.out.println("Temporary value: " + tempValue); if(tempValue < min) min = tempValue; } System.out.println("Temporary value: " + root + "/element" + min); byte[] b = zk.getData(root + "/element" + min, false, stat); zk.delete(root + "/element" + min, 0); ByteBuffer buffer = ByteBuffer.wrap(b); retvalue = buffer.getInt(); return retvalue; } } } } } public static void main(String args[]) { if (args[0].equals("qTest")) queueTest(args); else barrierTest(args); } public static void queueTest(String args[]) { Queue q = new Queue(args[1], "/app1"); System.out.println("Input: " + args[1]); int i; Integer max = new Integer(args[2]); if (args[3].equals("p")) { System.out.println("Producer"); for (i = 0; i < max; i++) try{ q.produce(10 + i); } catch (KeeperException e){ } catch (InterruptedException e){ } } else { System.out.println("Consumer"); for (i = 0; i < max; i++) {
12.
Programming with ZooKeeper
- A basic tutorial Page 12Copyright © 2008 The Apache Software Foundation. All rights reserved. try{ int r = q.consume(); System.out.println("Item: " + r); } catch (KeeperException e){ i--; } catch (InterruptedException e){ } } } } public static void barrierTest(String args[]) { Barrier b = new Barrier(args[1], "/b1", new Integer(args[2])); try{ boolean flag = b.enter(); System.out.println("Entered barrier: " + args[2]); if(!flag) System.out.println("Error when entering the barrier"); } catch (KeeperException e){ } catch (InterruptedException e){ } // Generate random integer Random rand = new Random(); int r = rand.nextInt(100); // Loop for rand iterations for (int i = 0; i < r; i++) { try { Thread.sleep(100); } catch (InterruptedException e) { } } try{ b.leave(); } catch (KeeperException e){ } catch (InterruptedException e){ } System.out.println("Left barrier"); } }