Solr4.2-矫情的shards, facet

使用Solr的分布式多核查询时,Solr提供了shards方便大家使用,只需要设定

  1. SolrQuery.set(“shards”,shardsStr)  

即可,但是实际操作中遇到很多问题,首先是shards参数的格式问题,shards参数一定要是以下形式,否则异常报错:

  1. String shardsStr = 127.0.0.1:8080/solr/core1,127.0.0.1:8080/solr/core2,127.0.0.1:8080/solr/core3;    

shards的好处是很方便的根据需求,在分布式的多服务器多核中进行查询任务,只需配置不同的ip,不同的core即可。facet是Solr另一个很方便的功能,可以根据字段进行统计并进行排序,做多核分布查询时,如果能把shards和facet并用可以免去很多人工后期分布合并并排序的麻烦,因为对于上亿的海量数据来说,进行合并统计并排序无疑是个费时费力的事,如果Solr有良好的数据结构支持这项工作的话就perfect啦。但是使用的过程中遇到了问题,单核测试OK,但是shards多核测试异常:

  1. <response>  
  2. <lst name=“responseHeader”>  
  3. <int name=“status”>500</int>  
  4. <int name=“QTime”>7320</int>  
  5. <lst name=“params”>  
  6. <str name=“facet.missing”>false</str>  
  7. <str name=“facet”>true</str>  
  8. <str name=“shards”>  
  9. 127.0.0.1:8080/solr/core1,127.0.0.1:8080/solr/core2,127.0.0.1:8080/solr/core3   
  10. </str>  
  11. <str name=“facet.mincount”>1</str>  
  12. <str name=“start”>0</str>  
  13. <str name=“facet.sort”>count</str>  
  14. <str name=“q”>*:*</str>  
  15. <str name=“facet.limit”>1000</str>  
  16. <str name=“facet.field”>groupSend</str>  
  17. <str name=“rows”>100000</str>  
  18. </lst>  
  19. </lst>  
  20. <lst name=“error”>  
  21. <str name=“msg”>  
  22. java.lang.RuntimeException: Invalid version (expected 2, but 60) or the data in not in ’javabin’   
  23. format   
  24. </str>  
  25. <str name=“trace”>  
  26. org.apache.solr.common.SolrException: java.lang.RuntimeException: Invalid version (expected 2,   
  27. but 60) or the data in not in ’javabin’ format at   
  28. org.apache.solr.handler.component.SearchHandler.handleRequestBody(SearchHandler.java:302) at   
  29. org.apache.solr.handler.RequestHandlerBase.handleRequest(RequestHandlerBase.java:135) at    
  30. org.apache.solr.core.SolrCore.execute(SolrCore.java:1797) at    
  31. org.apache.solr.servlet.SolrDispatchFilter.execute(SolrDispatchFilter.java:637) at    
  32. org.apache.solr.servlet.SolrDispatchFilter.doFilter(SolrDispatchFilter.java:343) at    
  33. org.apache.solr.servlet.SolrDispatchFilter.doFilter(SolrDispatchFilter.java:141) at    
  34. org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)    
  35. at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210) at    
  36. org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:222) at    
  37. org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123) at    
  38. org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:171) at    
  39. org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:99) at    
  40. org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:947) at    
  41. org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118) at    
  42. org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:408) at    
  43. org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1009) at    
  44. org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:589)    
  45. at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:310) at    
  46. java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) at    
  47. java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) at    
  48. java.lang.Thread.run(Thread.java:722) Caused by: java.lang.RuntimeException: Invalid version    
  49. (expected 2, but 60) or the data in not in ’javabin’ format at    
  50. org.apache.solr.common.util.JavaBinCodec.unmarshal(JavaBinCodec.java:109) at    
  51. org.apache.solr.client.solrj.impl.BinaryResponseParser.processResponse   
  52. (BinaryResponseParser.java:41) at org.apache.solr.client.solrj.impl.HttpSolrServer.request   
  53. (HttpSolrServer.java:387) at org.apache.solr.client.solrj.impl.HttpSolrServer.request   
  54. (HttpSolrServer.java:181) at org.apache.solr.handler.component.HttpShardHandler$1.call   
  55. (HttpShardHandler.java:169) at org.apache.solr.handler.component.HttpShardHandler$1.call   
  56. (HttpShardHandler.java:135) at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:334)    
  57. at java.util.concurrent.FutureTask.run(FutureTask.java:166) at    
  58. java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:471) at    
  59. java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:334) at    
  60. java.util.concurrent.FutureTask.run(FutureTask.java:166) … 3 more   
  61. </str>  
  62. <int name=“code”>500</int>  
  63. </lst>  
  64. </response>  

google发现http://lucene.472066.n3.nabble.com/Invalid-version-expected-2-but-60-or-the-data-in-not-in-javabin-format-td4035206.html 有人遇到了同样的问题,几经测试发现同组的CY同学在之前的测试中测试正常,后来才发现他的query语句中

  1. <str name=“facet.limit”>10</str>  

莫非是统计排序时,要求排序的结果越多消耗内存越大,发生异常现象?测试发现果然如此,测试的tomcat配置在实验室64G的linux服务器上,测试的数据是103W,分布在31个Core上,配置

  1. <str name=“facet.limit”>500</str>  

便产生异常现象,矫情!apache的Solr不能这么矫情吧?Big Data时代啊!后来发现另一个耗内存比较大的参数:

  1. <str name=“rows”>100000</str>  

其实单纯的统计来说,并不需要row输出显示query结果,设为0即可,然后发现配置

  1. <str name=“facet.limit”>1000</str>  

统计已毫无压力。
总体来说,Solr还是比较稳定的,致敬,不过官方的wiki可不可以详细点。。。。。啊。

facet另一个比较好用的是,对于它统计的是字段切分后的索引单元,那么以2-Gram切分的微博内容,facet统计的即是2-Gram的小term

一些博客中提到facet.limit(100)和facet.offset(100)能够起到翻页的效果,如果可以的话,这种是方便的且实效的,因为facet一次返回大量的话,是很消耗资源的。

发表评论

电子邮件地址不会被公开。 必填项已用 * 标注

*

您可以使用这些 HTML 标签和属性: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>