solrcloud将索引数据写到hdfs
Running Solrcloud+Hdfs
SolrCloud客户端
Solr启动脚本
SolrCloud+Hdfs模式的solr启动脚本与之前稍有差异,如下:
exec java $JVM_ARGS -Djetty.port=$1 -XX:MaxDirectMemorySize=5g -Dsolr.directoryFactory=HdfsDirectoryFactory -Dsolr.lock.type=hdfs -Dsolr.hdfs.home=/solrcloud/feed -Dsolr.hdfs.confdir=/home/deploy/solr-hdfs-client/hadoop-2.0.6-solr/etc/hadoop -Dbootstrap_conf=true -DnumShards=$SHARDS -DzkHost=$ZK_SERVERS -DzkClientTimeout=$ZK_TIMEOUT -Dsolr.solr.home=$BASE_DIR -jar $BASE_DIR/start.jar |
红色字体为与普通的solrcloud集群的启动脚本差异的地方。
-XX:MaxDirectMemorySize=5g 为了提高写性能,设置的堆外内存。
- -Dsolr.hdfs.home
指的是:solr索引在HDFS上存储的根目录
- Dsolr.hdfs.confdir
指的是:solr操作HDFS集群的hadoop客户端配置文件的目录。下一节将主要介绍Hadoop客户端的配置。
solrconfig.xml
directoryFactory需要调整成HdfsDirectoryFactory,并可以设置缓存等信息。
<directoryFactory name="DirectoryFactory" class="solr.HdfsDirectoryFactory"> <str name="solr.hdfs.home">${solr.hdfs.home:}</str> <str name="solr.hdfs.confdir">${solr.hdfs.confdir:}</str> <bool name="solr.hdfs.blockcache.enabled">true</bool> <int name="solr.hdfs.blockcache.slab.count">1</int> <bool name="solr.hdfs.blockcache.direct.memory.allocation">true</bool> <int name="solr.hdfs.blockcache.blocksperbank">16384</int> <bool name="solr.hdfs.blockcache.read.enabled">true</bool> <bool name="solr.hdfs.blockcache.write.enabled">true</bool> <bool name="solr.hdfs.nrtcachingdirectory.enable">true</bool> <int name="solr.hdfs.nrtcachingdirectory.maxmergesizemb">16</int> <int name="solr.hdfs.nrtcachingdirectory.maxcachedmb">64</int> </directoryFactory> |
Solr服务的Hadoop客户端
我们是将Hadoop服务器集群随便拷贝了一个节点放到/home/deploy/目录下,并新建了一个solr-hdfs-client目录,与其他应用(如:solr服务)的部署目录同级别。
/home/deploy/
-| solr-hdfs-client
- 客户端挂载
Solr的Hadoop客户端需要定义一个挂载文件:mountTable.xml
在etc/hadoop目录下的目的是方便在core-site.xml中引用。
<configuration>
<property> <name>fs.viewfs.mounttable.default.link./user</name> <value>hdfs://ns1/test</value> </property>
</configuration> |
第一个启动的solr服务,挂载必须是/user,因为solr就找这个挂载名,否则会报错,如下:
至于这个挂载链接具体的hdfs系统中是那个目录是随意的,比如我做的测试是test目录,实际项目中还是要起有实际意义的名字,我们的生产环境就是/user,因为solr在往hdfs里面写数据的时候会将solr进程的拥有者作为/user的下级目录,之后才是在“-Dsolr.hdfs.home”指定的目录,如:
另外,我在集群的core-site.xml配置了/user挂载,这样集群在启动的时候就初始化了这个挂载,所以在第一个solr客户端挂载表中不指定/user也没关系,因为solr节点启动的时候就找集群中有没有/user这个挂载,后续solr节点启动过程就找到了,可以任意配置挂载。
我的测试两个分片的数据存储目录:
- 客户端core-site.xml
其余都和其他的节点一样,只需在最上面,将上面说的挂载文件引入进来即可:
<xi:include href="mountTable.xml"/> |