热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

CDH5Solr性能调优

2019独角兽企业重金招聘Python工程师标准Solr性能调优Solr性能调优是个复杂的过程,本文旨在描述Solr在使用过程中对性能优化的注意事项。在安装完成

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

Solr性能调优

Solr性能调优是个复杂的过程,本文旨在描述Solr在使用过程中对性能优化的注意事项。

在安装完成之后的调优

有些配置最好在安装之后立马修改,这样可以避免修改配置之后需要重复索引。

配置一个必须的Lucene版本

配置一个我们安装的最新版本的Lucene版本,最新的版本将拥有最新的特性以及对一些已知bug的修复,推荐使用solr最新版的lucene版本,该配置在solrconfig.xml文件中修改。

 

  1. 4.4  


CDH5.3.2中Solr使用的Lucene版本是4.4,推荐不要修改此内容。

 

Schema设计

当我们创建一个schema的时候,我们需要使用正确的数据类型来描述相应的数据字段,譬如:

  • 使用tdate数据类型来描述日期类型,而不是使用string类型的日期。

  • 推荐使用text类型替代string类型来适应系统语言环境。因为text类型可以返回一个输入条目的子集结果,譬如:当我们查询'John'的时候我们可能会找到'John Smith'的数据结果,如果是string类型的话,则仅仅只会返回匹配的结果。

  • 对于IDs字段,使用string类型。

一般性调优

1.对于Faceting查询来说启动facet.thread来指定多线程并发查询,譬如:

 

  1. http://localhost:8983/solr/collection1/select?q=*:*&facet=true&fl=id&facet.field=f0_ws&facet.threads=100  


上面就是配置100个线程来并发查询,关于Faceting的具体用法可以参看:https://cwiki.apache.org/confluence/display/solr/Faceting

 

2.通过solr.hdfs.blockcache.slab.count参数配置HDFS的块缓存数量,默认 情况下一个HDFS块缓存是128M,推荐使用物理内存的10%~20%来配置count数,譬如一个50G内存的机器,推荐使用5G~10G的内存,那 么count的配置数量范围为:5*1024/128~10*1024/128这个范围内即可。该参数在solrconfig.xml文件中引用,具体如 下:

 

  1.   

  2.     ${solr.hdfs.blockcache.enabled:true}  

  3.     ${solr.hdfs.blockcache.slab.count:1}  

  4.     ${solr.hdfs.blockcache.direct.memory.allocation:true}  

  5.     ${solr.hdfs.blockcache.blocksperbank:16384}  

  6.     ${solr.hdfs.blockcache.read.enabled:true}  

  7.     ${solr.hdfs.blockcache.write.enabled:true}  

  8.     ${solr.hdfs.nrtcachingdirectory.enable:true}  

  9.     ${solr.hdfs.nrtcachingdirectory.maxmergesizemb:16}  

  10.     ${solr.hdfs.nrtcachingdirectory.maxcachedmb:192}  

  11.   

 

其中solr.hdfs.blockcache.slab.count会读取系统配置的solr.hdfs.blockcache.slab.count参数,如果没有配置该参数则默认为1。该参数在Cloudera Manager中通过Solr->配置->Solr Server Default Group->资源管理下进行修改调整。

3.增加了hdfs的块缓存之后我们必须要增大JVM的内存大小来避免OOM异常。如果是手动安装,我们需要在/etc/default /solr(如果是parcel模式下安装的话目录在/opt/cloudera/parcel/CDH-*/etc/default/solr)下增加 如下配置:

 

  1. CATALINA_OPTS="-Xmx10g -XX:MaxDirectMemorySize=15g -XX:+UseLargePages -Dsolr.hdfs.blockcache.slab.count=60"  


如果是通过Cloudera Manager可以通过Solr->配置->Solr Server Default Group->资源管理Solr Server

 

 的Java堆栈大小(字节)Solr 服务其的Java直接内存大小(字节)参数找到,以上是以50G的物理内存作为标准,其中Xmx推荐配置为物理内存的20%左右,MaxDirectMeorySize推荐配置为物理内存的30%左右。

4.为了更好的提升性能,cloudera建议修改linxu的swap空间数,配置如下:

 

  1. # minimize swappiness  

  2. sudo sysctl vm.swappiness=10  

  3. sudo bash -c 'echo "vm.swappiness=10">> /etc/sysctl.conf'  

  4. # disable swap space until next reboot:  

  5. sudo /sbin/swapoff -a  


5.在不同的环境下选择不同的GC机制能够更好的提升Solr的性能,有如下2向GC机制可供选择:

 

  • Concurrent low pause collector:简称CMS,主要适用场景是对响应时间的重 要性大于吞吐量的需求,能够承受垃圾回收线程和应用线程共享处理资源,并且应用中存在比较多的长生命周期对象的应用。主要是对年老代的回收,目标是尽量减 少应用的暂停时间,减少full gc发生的几率,利用和应用线程并发的垃圾回收线程来标记清楚年老代。启用CMS:-XX:+UseConcMarkSweepGC

  • Throughput collector:追求最大吞吐量而设计的垃圾收集机制,主要采用并行收集算法对年轻代的收集。如果solr对吞吐量要求高于用户体验,那么可以采用此机制,但是它通常会连接超时而影响用户体验,启用该机制:-XX:+UseParallelGC

CDH5默认使用的CMS机制,修改可以在Solr->配置->Solr Server Default Group>高级->Solr Server的Java配置选项中修改其参数。

6.如果我们拥有多余的硬件资源,我们可以通过replica来提升查询的吞吐量,当然,添加replica会对第一个replica的写入性能有稍微的影响,但是这应该是最小的负面影响了。

7.solrconfig.xml文件中ramBufferSizeMB参数,表示在添加或者删除文档时,为了 减少频繁的更新索引,solr会选择缓存在内存中,当内存中的文件大小大于该值则会更新到索引库中,较大的值将消耗更多的内存,我们需要确保该值低于 JVM的内存值,当然也不是越大越好,越大就意味着GC的时候越困难。由于CDH中是将索引写入到HDFS中,我们这里ramBufferSizeMB的值应该和上面solr.hdfs.blockcache.slab.count设置的值保持一致。如果solr.hdfs.blockcache.slab.count配置为4,那么该数值配置为4*128(HDFS默认块大小)。值得注意的是与该参数相对应的还有一个maxBufferedDocs参数,该参数表示索引的数目超过配置的数值后就刷新到索引库中,因为我们不知道每条索引的具体数据大小,如果配置了此参数可能会导致ramBufferSizeMB参数失效,所以不推荐开启此参数。

8.solrconfig.xml文件中maxIndexingThreads参数,表示索引时并发的最大线程数,当索引数据时线程数超过该配置值,其它线程将处于等待状态,该值和CPU处理能力有关,默认值为8.

9.solrconfig.xml文件中的filterCache参数,表示用来缓存filter queries(也就是查询参数fq)得到的数据集。查询参数有2种,一种是q,另外一种是fq。如果fq存在,会先查询fq中的数据,再查询q中的数 据,最后取并集,当我们做多参数查询的时候,如果我们采用q参数查询,这样查询命中率会很低,而且占用较多的内存空间,我们可以对查询进行优化,用fq的 形式来求2个数据的交集会很好的提示性能。filterCache启用通过

 

  1.   

 

参数来配置,其中class是基于LRU算法的缓存实现,如果cache的数据插入多查询少那么使用solr.LRUCache;如果查询多插入少 那么使用solr.FastLRUCache。size表示缓存中保存的最大数据条数,initialSize表示cache初始化时的大 小,autowarmCount表示当切换SolrIndexSearcher时,可以对新SolrIndexSearcher做预热处理。该参数表示从 旧的SolrIndexSearcher中取多少数据在新的SolrIndexSearcher中重新引用。如果是近实时搜索,不推荐开启。0表示不开 启。

10.solrconfig.xml文件中的useCompoundFile参数,表示将一个段的多个文件合并 为唯一的文件,开启此特性需要额外消耗大概7%~33%的索引时间,在3.6版本前默认为true,之后默认为false。当然设置为false后要注意 配置linux进程允许打开的文件数目是否有限制,如果有限制可以通过在ulimit参数修改。

10.启动本地shard优先性,在请求中加入preferLocalShard=true来启动该特性。启动该特性后会优先使用本地shard中存储的数据,从而减少网络IO的数据传输。

11.我们需要注意的是SolrCloud已经做了读写分离,并且当我们的写入请求链接是replica的时候,replica会自动把该请求转发给leader,再由leader分发给其它replica。

12.对于本地solr性能优化可以参看:http://wiki.apache.org/lucene-java/ImproveIndexingSpeed



转:https://my.oschina.net/u/2293326/blog/662043



推荐阅读
  • 本文介绍了使用kotlin实现动画效果的方法,包括上下移动、放大缩小、旋转等功能。通过代码示例演示了如何使用ObjectAnimator和AnimatorSet来实现动画效果,并提供了实现抖动效果的代码。同时还介绍了如何使用translationY和translationX来实现上下和左右移动的效果。最后还提供了一个anim_small.xml文件的代码示例,可以用来实现放大缩小的效果。 ... [详细]
  • 本文介绍了Android 7的学习笔记总结,包括最新的移动架构视频、大厂安卓面试真题和项目实战源码讲义。同时还分享了开源的完整内容,并提醒读者在使用FileProvider适配时要注意不同模块的AndroidManfiest.xml中配置的xml文件名必须不同,否则会出现问题。 ... [详细]
  • Android开发实现的计时器功能示例
    本文分享了Android开发实现的计时器功能示例,包括效果图、布局和按钮的使用。通过使用Chronometer控件,可以实现计时器功能。该示例适用于Android平台,供开发者参考。 ... [详细]
  • ubuntu用sqoop将数据从hive导入mysql时,命令: ... [详细]
  • 在Xamarin XAML语言中如何在页面级别构建ControlTemplate控件模板
    本文介绍了在Xamarin XAML语言中如何在页面级别构建ControlTemplate控件模板的方法和步骤,包括将ResourceDictionary添加到页面中以及在ResourceDictionary中实现模板的构建。通过本文的阅读,读者可以了解到在Xamarin XAML语言中构建控件模板的具体操作步骤和语法形式。 ... [详细]
  • MyBatis多表查询与动态SQL使用
    本文介绍了MyBatis多表查询与动态SQL的使用方法,包括一对一查询和一对多查询。同时还介绍了动态SQL的使用,包括if标签、trim标签、where标签、set标签和foreach标签的用法。文章还提供了相关的配置信息和示例代码。 ... [详细]
  • 本文讨论了如何使用Web.Config进行自定义配置节的配置转换。作者提到,他将msbuild设置为详细模式,但转换却忽略了带有替换转换的自定义部分的存在。 ... [详细]
  • 本文介绍了如何使用PHP代码将表格导出为UTF8格式的Excel文件。首先,需要连接到数据库并获取表格的列名。然后,设置文件名和文件指针,并将内容写入文件。最后,设置响应头部,将文件作为附件下载。 ... [详细]
  • Activiti7流程定义开发笔记
    本文介绍了Activiti7流程定义的开发笔记,包括流程定义的概念、使用activiti-explorer和activiti-eclipse-designer进行建模的方式,以及生成流程图的方法。还介绍了流程定义部署的概念和步骤,包括将bpmn和png文件添加部署到activiti数据库中的方法,以及使用ZIP包进行部署的方式。同时还提到了activiti.cfg.xml文件的作用。 ... [详细]
  • MySQL数据库锁机制及其应用(数据库锁的概念)
    本文介绍了MySQL数据库锁机制及其应用。数据库锁是计算机协调多个进程或线程并发访问某一资源的机制,在数据库中,数据是一种供许多用户共享的资源,如何保证数据并发访问的一致性和有效性是数据库必须解决的问题。MySQL的锁机制相对简单,不同的存储引擎支持不同的锁机制,主要包括表级锁、行级锁和页面锁。本文详细介绍了MySQL表级锁的锁模式和特点,以及行级锁和页面锁的特点和应用场景。同时还讨论了锁冲突对数据库并发访问性能的影响。 ... [详细]
  • 本文介绍了在SpringBoot中集成thymeleaf前端模版的配置步骤,包括在application.properties配置文件中添加thymeleaf的配置信息,引入thymeleaf的jar包,以及创建PageController并添加index方法。 ... [详细]
  • 本文讨论了在数据库打开和关闭状态下,重新命名或移动数据文件和日志文件的情况。针对性能和维护原因,需要将数据库文件移动到不同的磁盘上或重新分配到新的磁盘上的情况,以及在操作系统级别移动或重命名数据文件但未在数据库层进行重命名导致报错的情况。通过三个方面进行讨论。 ... [详细]
  • 本文介绍了在MacOS系统上安装MySQL的步骤,并详细说明了如何设置MySQL服务的开机启动和如何修改MySQL的密码。通过下载MySQL的macos版本并按照提示一步一步安装,在系统偏好设置中可以找到MySQL的图标进行设置。同时,还介绍了通过终端命令来修改MySQL的密码的具体操作步骤。 ... [详细]
  • 本文介绍了Oracle存储过程的基本语法和写法示例,同时还介绍了已命名的系统异常的产生原因。 ... [详细]
  • MySQL中的MVVC多版本并发控制机制的应用及实现
    本文介绍了MySQL中MVCC的应用及实现机制。MVCC是一种提高并发性能的技术,通过对事务内读取的内存进行处理,避免写操作堵塞读操作的并发问题。与其他数据库系统的MVCC实现机制不尽相同,MySQL的MVCC是在undolog中实现的。通过undolog可以找回数据的历史版本,提供给用户读取或在回滚时覆盖数据页上的数据。MySQL的大多数事务型存储引擎都实现了MVCC,但各自的实现机制有所不同。 ... [详细]
author-avatar
范二小姐儿
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有