Quick update for future readers :) The shared collection, using static instances works.
>From this task I learned: - Instantiate in the 'prepare' method and not in constructor - Don't pass shared objects from the main to the bolts - Good (?) old fashioned singleton pattern with synchronized Eyal *Eyal Golan* Connect [image: Gmail] <egola...@gmail.com> [image: LinkedIn] <http://www.linkedin.com/in/egolan74> [image: My Blog] <http://eyalgo.com/> [image: Twitter] <http://twitter.com/eyalgo_egolan> [image: Skype] [image: GitHub] <https://github.com/eyalgo> [image: Facebook] <http://www.facebook.com/eyal.golan.14> P Save a tree. Please don't print this e-mail unless it's really necessary On Thu, Dec 4, 2014 at 11:20 PM, Dima Dragan <dima.dra...@belleron.net> wrote: > Hi Eyal, > > I used the same approach as Michael. > > As far as I understand, your shared collection should be changeable. So > do not forget use concurrent collection. > > Solution for copies by worker are: > > 1) Represent one collection as group of collections (collection per > worker), using storm grouping make sure that input bolts emit to the > appropriate cache-bolts. > > 2) use external storage for state persistence. > > It depends from your needs. > > Best regards, > Dmytro Dragan > On Dec 4, 2014 10:54 PM, "Michael Rose" <mich...@fullcontact.com> wrote: > >> Yes, as long as they're in the same JVM. If you have 4 workers, that's 4 >> JVMs, and 4 copies of the data. >> >> Storm will ensure that if you have 4 bolts of type A, and 8 of type B, >> that 1 of type A and 2 of type B exist in each JVM. Since the singleton's >> field is static, it'll be shared. >> >> Michael Rose (@Xorlev <https://twitter.com/xorlev>) >> Senior Platform Engineer, FullContact <http://www.fullcontact.com/> >> mich...@fullcontact.com >> >> On Thu, Dec 4, 2014 at 1:34 PM, Eyal Golan <egola...@gmail.com> wrote: >> >>> Michael, >>> I understand your solution, however, if bolt of type A "wins" the >>> initialization, will bolts of type B see the same instance? >>> >>> Sent from my Android phone >>> On Dec 4, 2014 10:26 PM, "Eyal Golan" <egola...@gmail.com> wrote: >>> >>>> Thanks Michael and Ben ! >>>> >>>> Sent from my Android phone >>>> On Dec 4, 2014 9:53 PM, "Flint, Ben" <bfl...@popcap.com> wrote: >>>> >>>>> I’ve used Hazelcast for use cases like this with great success. It >>>>> makes it relatively straightforward to implement a distributed data >>>>> structure. >>>>> >>>>> From: Eyal Golan <egola...@gmail.com> >>>>> Reply-To: "user@storm.apache.org" <user@storm.apache.org> >>>>> Date: Thursday, December 4, 2014 at 11:40 AM >>>>> To: "user@storm.apache.org" <user@storm.apache.org> >>>>> Subject: Re: Shared static data between bolts >>>>> >>>>> Thanks! >>>>> All the answers give me good idea. >>>>> Here's why I need this list be sharable. >>>>> One bolt needs the list for computation. >>>>> Another bolt will periodically update the list. >>>>> In other words, the list is changeable. >>>>> >>>>> I tried passing it in conf but there are some 3rd party libs in the >>>>> wrapper. >>>>> >>>>> Anyway, I also need to improve the topology. Separate bolt to two etc. >>>>> That way, it would be easier to handle that cache. >>>>> >>>>> One more question, I thought about giving hazelcast a try. >>>>> Create local node and then the bolts will have clients. >>>>> >>>>> What do you think? >>>>> >>>>> Sent from my Android phone >>>>> On Dec 4, 2014 9:14 PM, "Kushan Maskey" < >>>>> kushan.mas...@mmillerassociates.com> wrote: >>>>> >>>>>> Hi Eyal, >>>>>> >>>>>> I had the similar issue earlier. Static objects are not a good way >>>>>> of passing the variables around in Storm due to clustered nature of the >>>>>> Storm. You will see null for all the static variables. >>>>>> >>>>>> This is how I implemented mine, for instance I wanted to pass >>>>>> around the server properties such and host name and username/password. I >>>>>> read the properties file and then created a map of these properties then >>>>>> set it into the Config object. Like below. >>>>>> >>>>>> *In topology:* >>>>>> >>>>>> Map<Stirng, Stirng> map = new HashMap(); >>>>>> map.put("hostname", "localhost"); >>>>>> map.put("username", "testuser"); >>>>>> map.put("password", "testpassord"); >>>>>> map.put("port", "1234"); >>>>>> >>>>>> Config config = new Config(); >>>>>> >>>>>> config.put("MY_MAP", map) >>>>>> *In Bolts:* >>>>>> >>>>>> public void prepare(Map stormConf, TopologyContext context) { >>>>>> >>>>>> HashMap<Stirng, Stirng> map = stormConfig.get("MY_MAP"); >>>>>> >>>>>> } >>>>>> This how i resolved my problem.Try that if that helps. >>>>>> -- >>>>>> Kushan Maskey >>>>>> 817.403.7500 >>>>>> M. Miller & Associates <http://mmillerassociates.com/> >>>>>> kushan.mas...@mmillerassociates.com >>>>>> >>>>>> On Thu, Dec 4, 2014 at 1:01 PM, Eyal Golan <egola...@gmail.com> >>>>>> wrote: >>>>>> >>>>>>> Hi all, >>>>>>> I am newbie with Storm and having some issues with static objects in >>>>>>> the topology. >>>>>>> In the main class, where I set the topology, I also set a static >>>>>>> object. It's actually a wrapper for a collection of strings. >>>>>>> This object needs to he shared between different bolts. >>>>>>> It's big so I want it to be only one instance. >>>>>>> >>>>>>> The problem is that when a bolt tries to get this static instance: >>>>>>> example - MyMain.Shared... It's null. Although I instantiated it in the >>>>>>> main method. >>>>>>> >>>>>>> I guess I'm doing something wrong. >>>>>>> >>>>>>> Thanks for any assistance. >>>>>>> >>>>>>> Eyal >>>>>>> >>>>>>> Sent from my Android phone >>>>>>> >>>>>> >>>>>> >>