2015-10-13 148 views
0

我在Ubuntu 12.04上使用Solr 5.2.1。我有大约25万份索引文件。从所有文件中提取2个小字段大约需要2.5分钟。 为什么需要这么长时间,我能做些什么来加快速度?为了摆脱我在做的事情:我正在将solr文档与MySQL记录同步。执行此操作(处理删除)的最简单方法是将Solr中的所有内容与MySQL中的所有内容进行比较。为什么这个Solr查询很慢?

http://localhost:8983/solr/[my集合] /选择?Q = %3A & FL =字段1 & FL =场2 &行= 300000 &重量= JSON

如果我用卷曲取水的时候,我可以看到它的结果写大约50KBps,比普通的本地http服务器文件慢,所以我知道这个问题必须在Solr内部。但为什么?令人惊讶的是,具有wt(写入器类型,也称为响应格式)CSV的相同查询同样缓慢。看来Solr本身就是瓶颈。

我想这可能是由于我如何运行Solr,我相信它是默认选项。下面是从ps过程:

的java -server -Xss256k -Xms512m -Xmx512m -XX:NewRatio = 3 -XX:SurvivorRatio = 4 -XX:TargetSurvivorRatio = 90 -XX:MaxTenuringThreshold = 8 -XX:+ UseConcMarkSweepGC -XX :+ UseParNewGC -XX:ConcGCThreads = 4 -XX:ParallelGCThreads = 4 -XX:+ CMSScavengeBeforeRemark -XX:PretenureSizeThreshold = 64m -XX:+ UseCMSInitiatingOccupancyOnly -XX:CMSInitiatingOccupancyFraction = 50 -XX:CMSMaxAbortablePrecleanTime = 6000 -XX:+ CMSParallelRemarkEnabled -XX :+ PrintRecProcEnabled -XX:CMSFullGCsBeforeCompaction = 1 -XX:CMSTriggerPermRatio = 80 -verbose:gc -XX:+ PrintHeapAtGC -XX:+ PrintGCDetails -XX:+ PrintGCDateStamps -XX:+ PrintGCTimeStamps -XX:+ PrintTenuringDistribution -XX:+ PrintGCApplicationStoppedTime - Xloggc:/home/tylercollier/solr/dist/server/logs/solr_gc.log -Djetty.port = 8983 -DSTOP.PORT = 7983 -DSTOP.KEY = solrrocks -Duser.timezone = UTC -Djetty.home =/home/Ť/home/tylercollier/solr/dist -jar start.jar -XX:OnOutOfMemoryError =/home/tylercollier/solr/dist/bin/oom_solr.sh 8983/home/tylercollier/solr/dist/server/logs --module = http

我即将尝试使用内存大小this page。我仍然首先想在这里提出这个问题,因为我通常发现这些“猜测和检查”设置的内存令人沮丧处理,因为它与代码和机器的情况有很大关系。但我会用我的发现报告。

UPDATE:将Xmx值从512m更改为2g将时间从约150秒减少到约50秒。但进一步增加Xmx似乎没有什么区别(我尝试过3g,4g)。改变Xss似乎没有任何区别。它的默认值是256k,但是我尝试了1m和5m。所以,在150秒内50秒是一个改进,但远不及我想要的。 MySQL可以在2秒内给我这些结果。是什么赋予了?

UPDATE 2:更改查询以返回所有字段(而不是将其限制为2个字段)对时间也没有影响。这对我来说真的很令人惊讶。现在CURL传输速率约为11 MB/s。我不相信Solr无法以更快的速度拉出自己的记录。

UPDATE 3:有没有其他人试过一次从Solr获取这么多文档(无论是使用分页还是一次读取)?这对你来说也慢吗?

+2

我想如果你只抓取所有的数据,你可以读取数据mysql或使用lucene,solr不是数据仓库,尽管你可以做到。可能是你可以尝试solr页面来读取所有数据,行不要设置太大 –

+0

谢谢,但我没有在数据存储中使用它。我使用它来建立索引。在我的情况下,我试图将Solr与MySQL同步。我在这个问题中的笔记讨论了行大小不是瓶颈。 –

+2

您可以使用分页并以块的形式获取数据。这会更快。如果你一次不需要所有的数据。 – YoungHobbit

回答

1

有一个专门的请求处理程序就是为了这个目的,Export Request Handler

如果您需要检索完整的查询集,那可能是更好的解决方案。

Solr的最新版本中还有Streaming API support,如果您需要检索大型结果集并在检索时处理它,而不必一次为整个集合分配内存,这可能是合适的。但是这仅限于支持DocValues的字段,因此在这种情况下可能不适用(如最后的注释所示)。