Thank you for answering. Some notes:

1. The Java engine I´ve developed that wrappers SolrJ 4.1  with some
business logic only executes search queries, not index/update operations,
so the problem is not related with concurrent updates, or something similar.

2. As far as I know the better SolrJ interface to index with SolrCloud is
CloudSolrServer, not ConcurrentUpdateSolrServer. If you have many instances
of CloudSolrServer and you correctly balance them with a Round Robin or
something similar you´ll get a better performance in SolrCloud scenarios.
At least is what I´ve read in the documentation, and also I asked to Mark
Miller some months ago when I started dealing with Solr 4.0-BETA.

3. I´m almost convinced that the problem is related with:

- Zookeeper ensemble configuration.
- Zookeeper version (3.4.5) is not compatible with Solr 4.1. expected one.
- SolrJ Zookeeper driver.

In short, all my architecture works perfectly with search operations. Also
I´ve got another NRT Indexer module that deals with CloudSolrServer and
works perfectly. But after two, three days, something happens with
Zookeeper - CloudSolrServer connection, and tries to update cluster status
forever with no success. Only after Zookeeper + SolrCloud leader&replica
shards restart the problem is solved.


2013/3/19 Michael Della Bitta <michael.della.bi...@appinions.com>

> Don't use CloudSolrServer for writes. Instead, use
> ConcurrentUpdateSolrServer, something like:
>
> SolrServer solrServer = new ConcurrentUpdateSolrServer(solrUrl, 100, 4);
>
> The 100 corresponds to how many docs to send in a batch. The higher
> this is, the better performance is (to a point, don't set that to 50k
> or anything).
>
> The 4 corresponds to the number of threads that will be sending batches.
>
> Note that this class doesn't report errors, so if you want to see
> exceptions when bad things happen, you'll have to override
> handleError(Throwable ex) method.
>
> Here's the javadoc for the class:
>
> http://lucene.apache.org/solr/4_2_0/solr-solrj/org/apache/solr/client/solrj/impl/ConcurrentUpdateSolrServer.html
>
> It'd be best if you can use a load balancer in front of your Solr
> Cloud and use that as the solrUrl parameter.
>
> ***Either way, though, Mark is right in that you need to diagnose why
> you're only able to do a few documents per second first.*** Adding
> more threads at this point is probably not going to help.
>
> Michael Della Bitta
>
> ------------------------------------------------
> Appinions
> 18 East 41st Street, 2nd Floor
> New York, NY 10017-6271
>
> www.appinions.com
>
> Where Influence Isn’t a Game
>
>
> On Tue, Mar 19, 2013 at 3:57 PM, Luis Cappa Banda <luisca...@gmail.com>
> wrote:
> > Anyone can help me? Each response may save a little kitten from a
> horrible
> > and dramatic  death somewhere in the world :-P
> > El 15/03/2013 21:06, "Jack Park" <jackp...@topicquests.org> escribió:
> >
> >> Is there a document that tells how to create multiple threads? Search
> >> returns many hits which orbit this idea, but I haven't spotted one
> >> which tells how.
> >>
> >> Thanks
> >> Jack
> >>
> >> On Fri, Mar 15, 2013 at 1:01 PM, Mark Miller <markrmil...@gmail.com>
> >> wrote:
> >> > You def have to use multiple threads with it for it to be fast, but 3
> or
> >> 4 docs a second still sounds absurdly slow.
> >> >
> >> > - Mark
> >> >
> >> > On Mar 15, 2013, at 2:58 PM, Luis Cappa Banda <luisca...@gmail.com>
> >> wrote:
> >> >
> >> >> And up! :-)
> >> >>
> >> >> I´ve been wondering if using CloudSolrServer has something to do
> here.
> >> Does
> >> >> it have a bad performance when a CloudSolrServer singletong receives
> >> >> multiple queries? Is it recommended to have a CloudSolrServer
> instances
> >> >> list and select one of them with a Round Robin criteria?
> >> >>
> >> >>
> >> >>
> >> >> 2013/3/14 Luis Cappa Banda <luisca...@gmail.com>
> >> >>
> >> >>> Hello!
> >> >>>
> >> >>> Thanks a lot, Erick! I've attached some stack traces during a normal
> >> >>> 'engine' running.
> >> >>>
> >> >>> Cheers,
> >> >>>
> >> >>> - Luis Cappa
> >> >>>
> >> >>>
> >> >>> 2013/3/13 Erick Erickson <erickerick...@gmail.com>
> >> >>>
> >> >>>> Stack traces..
> >> >>>>
> >> >>>> First,
> >> >>>> jps -l
> >> >>>>
> >> >>>> that will give you a the process IDs of your running Java
> processes.
> >> Then:
> >> >>>>
> >> >>>> jstack <pid from above>
> >> >>>>
> >> >>>> Usually I pipe the output from jstack into a text file...
> >> >>>>
> >> >>>> Best
> >> >>>> Erick
> >> >>>>
> >> >>>>
> >> >>>> On Wed, Mar 13, 2013 at 1:48 PM, Luis Cappa Banda <
> >> luisca...@gmail.com
> >> >>>>> wrote:
> >> >>>>
> >> >>>>> Uhm, how can I do that... 'cleanly'? I know that with JConsole
> it´s
> >> >>>> posible
> >> >>>>> to output this traces, but with a .war application built on top of
> >> >>>> Spring I
> >> >>>>> don´t know how can I do that. In any case, here is my
> CloudSolrServer
> >> >>>>> wrapper that is used by other classes. There is no sync method or
> >> piece
> >> >>>> of
> >> >>>>> code:
> >> >>>>>
> >> >>>>> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
> - -
> >> >>>> - -
> >> >>>>> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
> - -
> >> >>>>>
> >> >>>>> *public class BinaryLBHttpSolrServer extends LBHttpSolrServer {*
> >> >>>>>
> >> >>>>> private static final long serialVersionUID = 3905956120804659445L;
> >> >>>>>    public BinaryLBHttpSolrServer(String[] endpoints) throws
> >> >>>>> MalformedURLException {
> >> >>>>>    super(endpoints);
> >> >>>>>    }
> >> >>>>>
> >> >>>>>    @Override
> >> >>>>>    protected HttpSolrServer makeServer(String server) throws
> >> >>>>> MalformedURLException {
> >> >>>>>        HttpSolrServer solrServer = super.makeServer(server);
> >> >>>>>        solrServer.setRequestWriter(new BinaryRequestWriter());
> >> >>>>>        return solrServer;
> >> >>>>>    }
> >> >>>>> }
> >> >>>>>
> >> >>>>> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
> - -
> >> >>>> - -
> >> >>>>> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
> - -
> >> >>>>>
> >> >>>>> *public class CloudSolrHttpServerImpl implements
> CloudSolrHttpServer
> >> {*
> >> >>>>> private CloudSolrServer cloudSolrServer;
> >> >>>>>
> >> >>>>> private Logger log =
> Logger.getLogger(CloudSolrHttpServerImpl.class);
> >> >>>>>
> >> >>>>> public CloudSolrHttpServerImpl(String zookeeperEndpoints, String[]
> >> >>>>> endpoints, int clientTimeout,
> >> >>>>> int connectTimeout, String cloudCollection) {
> >> >>>>> try {
> >> >>>>> BinaryLBHttpSolrServer lbSolrServer = new *BinaryLBHttpSolrServer*
> >> >>>>> (endpoints);
> >> >>>>> this.cloudSolrServer = new CloudSolrServer(zookeeperEndpoints,
> >> >>>>> lbSolrServer);
> >> >>>>> this.cloudSolrServer.setZkConnectTimeout(connectTimeout);
> >> >>>>> this.cloudSolrServer.setZkClientTimeout(clientTimeout);
> >> >>>>> this.cloudSolrServer.setDefaultCollection(cloudCollection);
> >> >>>>> } catch (MalformedURLException e) {
> >> >>>>> log.error(e);
> >> >>>>> }
> >> >>>>> }
> >> >>>>>
> >> >>>>> @Override
> >> >>>>> public QueryResponse *search*(SolrQuery query) throws
> >> >>>> SolrServerException {
> >> >>>>> return cloudSolrServer.query(query, METHOD.POST);
> >> >>>>> }
> >> >>>>>
> >> >>>>> @Override
> >> >>>>> public boolean *index*(DocumentBean user) {
> >> >>>>> boolean indexed = false;
> >> >>>>> int retries = 0;
> >> >>>>> do {
> >> >>>>> indexed = addBean(user);
> >> >>>>> retries++;
> >> >>>>> } while(!indexed && retries<4);
> >> >>>>> return indexed;
> >> >>>>> }
> >> >>>>> @Override
> >> >>>>> public boolean *update*(SolrInputDocument updateDoc) {
> >> >>>>> boolean update = false;
> >> >>>>> int retries = 0;
> >> >>>>>
> >> >>>>> do {
> >> >>>>> update = addSolrInputDocument(updateDoc);
> >> >>>>> retries++;
> >> >>>>> } while(!update && retries<4);
> >> >>>>> return update;
> >> >>>>> }
> >> >>>>> @Override
> >> >>>>> public void commit() {
> >> >>>>> try {
> >> >>>>> cloudSolrServer.commit();
> >> >>>>> } catch (SolrServerException e) {
> >> >>>>>     log.error(e);
> >> >>>>> } catch (IOException e) {
> >> >>>>>     log.error(e);
> >> >>>>> }
> >> >>>>> }
> >> >>>>>
> >> >>>>> @Override
> >> >>>>> public boolean *delete*(String ... ids) {
> >> >>>>> boolean deleted = false;
> >> >>>>> List<String> idList = Arrays.asList(ids);
> >> >>>>> try {
> >> >>>>> this.cloudSolrServer.deleteById(idList);
> >> >>>>> this.cloudSolrServer.commit(true, true);
> >> >>>>> deleted = true;
> >> >>>>>
> >> >>>>> } catch (SolrServerException e) {
> >> >>>>> log.error(e);
> >> >>>>>
> >> >>>>> } catch (IOException e) {
> >> >>>>> log.error(e);
> >> >>>>> }
> >> >>>>> return deleted;
> >> >>>>> }
> >> >>>>>
> >> >>>>> @Override
> >> >>>>> public void *optimize*() {
> >> >>>>> try {
> >> >>>>> this.cloudSolrServer.optimize();
> >> >>>>> } catch (SolrServerException e) {
> >> >>>>> log.error(e);
> >> >>>>> } catch (IOException e) {
> >> >>>>> log.error(e);
> >> >>>>> }
> >> >>>>> }
> >> >>>>> /*
> >> >>>>> * ********************
> >> >>>>> *  Getters & setters *
> >> >>>>> * ********************
> >> >>>>> * */
> >> >>>>> public CloudSolrServer getSolrServer() {
> >> >>>>> return cloudSolrServer;
> >> >>>>> }
> >> >>>>>
> >> >>>>> public void setSolrServer(CloudSolrServer solrServer) {
> >> >>>>> this.cloudSolrServer = solrServer;
> >> >>>>> }
> >> >>>>>
> >> >>>>> private boolean addBean(DocumentBean user) {
> >> >>>>> boolean added = false;
> >> >>>>> try {
> >> >>>>> this.cloudSolrServer.addBean(user, 100);
> >> >>>>> this.commit();
> >> >>>>>
> >> >>>>> } catch (IOException e) {
> >> >>>>> log.error(e);
> >> >>>>>
> >> >>>>> } catch (SolrServerException e) {
> >> >>>>> log.error(e);
> >> >>>>> }catch(SolrException e) {
> >> >>>>> log.error(e);
> >> >>>>> }
> >> >>>>> return added;
> >> >>>>> }
> >> >>>>> private boolean addSolrInputDocument(SolrInputDocument updateDoc)
> {
> >> >>>>> boolean added = false;
> >> >>>>> try {
> >> >>>>> this.cloudSolrServer.add(updateDoc, 100);
> >> >>>>> this.commit();
> >> >>>>> added = true;
> >> >>>>> } catch (IOException e) {
> >> >>>>> log.error(e);
> >> >>>>>
> >> >>>>> } catch (SolrServerException e) {
> >> >>>>> log.error(e);
> >> >>>>> }catch(SolrException e) {
> >> >>>>> log.error(e);
> >> >>>>> }
> >> >>>>> return added;
> >> >>>>> }
> >> >>>>> }
> >> >>>>>
> >> >>>>> Thank you very much, Mark.
> >> >>>>>
> >> >>>>>
> >> >>>>> -  Luis Cappa
> >> >>>>>
> >> >>>>>
> >> >>>>>
> >> >>>>> And
> >> >>>>> 2013/3/13 Mark Miller <markrmil...@gmail.com>
> >> >>>>>
> >> >>>>>>
> >> >>>>>> Could you capture some thread stack traces in the 'engine' and
> see
> >> if
> >> >>>>>> there are any blocking methods?
> >> >>>>>>
> >> >>>>>> - Mark
> >> >>>>>>
> >> >>>>>> On Mar 13, 2013, at 1:34 PM, Luis Cappa Banda <
> luisca...@gmail.com>
> >> >>>>> wrote:
> >> >>>>>>
> >> >>>>>>> Just one correction:
> >> >>>>>>>
> >> >>>>>>> When I said:
> >> >>>>>>>
> >> >>>>>>>  - I´ve checked SolrCloud via Solr Admin interface and it´s OK:
> >> >>>>>>>  everything is green, and I cant execute queries directly into
> >> >>>> Solr.
> >> >>>>>>>
> >> >>>>>>> I mean:
> >> >>>>>>>
> >> >>>>>>>
> >> >>>>>>>  - I´ve checked SolrCloud via Solr Admin interface and it´s OK:
> >> >>>>>>>  everything is green, and *I can* execute queries directly into
> >> >>>> Solr.
> >> >>>>>>>
> >> >>>>>>>
> >> >>>>>>> Thanks!
> >> >>>>>>>
> >> >>>>>>>
> >> >>>>>>> - Luis Cappa
> >> >>>>>>>
> >> >>>>>>>
> >> >>>>>>> 2013/3/13 Luis Cappa Banda <luisca...@gmail.com>
> >> >>>>>>>
> >> >>>>>>>> Hello, guys!
> >> >>>>>>>>
> >> >>>>>>>> I´ve been experiencing some annoying behavior with my current
> >> >>>>> production
> >> >>>>>>>> scenario. Here is the snapshot:
> >> >>>>>>>>
> >> >>>>>>>>
> >> >>>>>>>>  - SolrCloud: 2 shards
> >> >>>>>>>>  - Zookeeper ensemble: 3 nodes in *different machines *(most of
> >> >>>> the
> >> >>>>>>>>  tutorials installs 3 Zookeeper nodes in the same machine).
> >> >>>>>>>>  - This is the zoo.cfg from every
> >> >>>>>>>>
> >> >>>>>>>> tickTime=2000  // I´ve also tried with 60000
> >> >>>>>>>>
> >> >>>>>>>> initLimit=10
> >> >>>>>>>>
> >> >>>>>>>> syncLimit=5
> >> >>>>>>>>
> >> >>>>>>>> dataDir=/var/lib/zookeeper
> >> >>>>>>>>
> >> >>>>>>>> clientPort=9000
> >> >>>>>>>>
> >> >>>>>>>> server.1=zoohost1:2888:3888
> >> >>>>>>>>
> >> >>>>>>>> server.2=zoohost1:2888:3888
> >> >>>>>>>>
> >> >>>>>>>> server.3=zoohost1:2888:3888
> >> >>>>>>>>
> >> >>>>>>>>
> >> >>>>>>>>
> >> >>>>>>>>  - I´ve developed a Java Application with a REST API (let´s
> call
> >> >>>> it *
> >> >>>>>>>>  engine*) that dispatches queries into SolrCloud. It´s a
> wrapper
> >> >>>>> around
> >> >>>>>>>>  CloudSolrServer, so it´s mandatory to specify some Zookeeper
> >> >>>>>> configuration
> >> >>>>>>>>  params too. They are loaded dynamically when the application
> is
> >> >>>>>> deployed in
> >> >>>>>>>>  a Tomcat server, but the current values that I´m using are as
> >> >>>>> follows:
> >> >>>>>>>>
> >> >>>>>>>> cloudSolrServer.*setZkConnectTimeout(60000)*
> >> >>>>>>>>
> >> >>>>>>>> cloudSolrServer.*setZkClientTimeout(60000)*
> >> >>>>>>>> *
> >> >>>>>>>> *
> >> >>>>>>>> *
> >> >>>>>>>> *
> >> >>>>>>>>
> >> >>>>>>>> *THE PROBLEM*
> >> >>>>>>>> *
> >> >>>>>>>> *
> >> >>>>>>>> Everything goes OK, but after two days more or less (yes, I´ve
> >> >>>> checked
> >> >>>>>>>> that this behavior occurrs periodically, more or less) the
> *engine
> >> >>>>>> blocks
> >> >>>>>>>> * and cannot dispatch any query to SolrCloud.
> >> >>>>>>>>
> >> >>>>>>>>  - The *engine *log only outputs "updating Zookeeper..." one
> last
> >> >>>>> time,
> >> >>>>>>>>  but never updates.
> >> >>>>>>>>  - I´ve checked SolrCloud via Solr Admin interface and it´s OK:
> >> >>>>>>>>  everything is green, and I cant execute queries directly into
> >> >>>> Solr.
> >> >>>>>>>>  - So then Solr appears to be OK, so the next step is to
> restart
> >> >>>>>> *engine
> >> >>>>>>>>  but *it again appears "updating Zookeeper...". Unfortunately
> >> >>>> switch
> >> >>>>>>>>  off + switch on doesn´t work here, :-(
> >> >>>>>>>>  - I´ve checked too Zookeeper logs and it appears some
> connection
> >> >>>> log
> >> >>>>>>>>  outs, but the ensemble appears to be OK too.
> >> >>>>>>>>  - *The end: *If I restart Zookeeper one by one, and I restart
> >> >>>>>>>>  SolrCloud, plus I restart the engine, the problem is solved.
> I´m
> >> >>>>> using
> >> >>>>>>>>  Amazon AWS as hostage, so I discard connection problems
> between
> >> >>>>>> instances.
> >> >>>>>>>>
> >> >>>>>>>>
> >> >>>>>>>> Does anyone experienced something similar? Can anybody shed
> some
> >> >>>> light
> >> >>>>>> on
> >> >>>>>>>> this problem?
> >> >>>>>>>>
> >> >>>>>>>> Thank you very much.
> >> >>>>>>>>
> >> >>>>>>>>
> >> >>>>>>>> Regards,
> >> >>>>>>>>
> >> >>>>>>>>
> >> >>>>>>>> - Luis Cappa
> >> >>>>>>>>
> >> >>>>>>
> >> >>>>>>
> >> >>>>>
> >> >>>>
> >> >>>
> >> >>>
> >> >
> >>
>



-- 
Luis Cappa Banda

*Phone*: (0034) 686 200 375
*Skype*: luiscappabanda

Reply via email to