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
>> >>>>>>>>
>> >>>>>>
>> >>>>>>
>> >>>>>
>> >>>>
>> >>>
>> >>>
>> >
>>

Reply via email to