基于3个Solr 6.6.3实例与单ZooKeeper,如何配置Cassandra数据导入处理器?
没问题,我帮你一步步搞定Solr 6.6.3配置DataImport Handler(DIH)从Cassandra集群抽取数据的事儿!结合你是SolrCloud(3个实例+1个ZK)的环境,下面是具体操作步骤:
1. 准备兼容的Cassandra依赖包
Solr本身不带Cassandra的Java驱动,得自己加。你需要下载兼容Solr 6.6.3和你的Cassandra版本的驱动包,推荐用DataStax的官方驱动:
- 核心驱动包:
cassandra-driver-core-3.11.0.jar(适配Cassandra 3.x系列,和Solr 6.6.3的Java 8环境兼容) - 辅助依赖:
guava-19.0.jar(Solr 6.x内置的guava版本是19,避免版本冲突) - 可选:如果Cassandra用了认证,可能还需要
cassandra-driver-extras-3.11.0.jar
把这些包放到每个Solr实例的server/lib/ext目录下;如果是SolrCloud模式,也可以把这些包放到配置集的lib目录里,然后上传到ZK,这样所有节点都会加载。
2. 配置Solr的DIH处理器
在你的Solr配置集的solrconfig.xml里添加DIH的请求处理器,同时确保依赖包被正确加载:
<!-- 加载Cassandra驱动包(如果没放到ext目录,就指定你的lib路径) --> <lib dir="${solr.config.dir}/lib" regex="cassandra-driver-.*\.jar" /> <lib dir="${solr.config.dir}/lib" regex="guava-.*\.jar" /> <!-- 配置DataImport Handler --> <requestHandler name="/dataimport" class="org.apache.solr.handler.dataimport.DataImportHandler"> <lst name="defaults"> <str name="config">data-config.xml</str> <!-- 指定DIH的配置文件 --> </lst> </requestHandler>
3. 编写DIH核心配置文件(data-config.xml)
在配置集目录下创建data-config.xml,这是定义数据源和数据抽取规则的核心文件:
<dataConfig> <!-- 配置Cassandra数据源 --> <dataSource type="org.apache.solr.handler.dataimport.CassandraDataSource" cluster="192.168.1.10:9042,192.168.1.11:9042" <!-- 你的Cassandra集群接触点,多个用逗号分隔 --> keyspace="your_target_keyspace" <!-- 要抽取数据的Cassandra键空间 --> username="your_cassandra_user" <!-- 如果Cassandra开启了认证,填用户名 --> password="your_cassandra_pwd" /> <!-- 对应密码 --> <!-- 定义要导入的文档结构 --> <document> <!-- 实体:对应Cassandra的一张表 --> <entity name="your_cassandra_table" <!-- 全量导入查询:获取表中所有数据 --> query="SELECT id, product_name, category, price, create_time FROM your_cassandra_table" <!-- 增量导入查询:获取上次索引后更新的数据(需要有时间戳/递增字段) --> deltaQuery="SELECT id FROM your_cassandra_table WHERE create_time > '${dataimporter.last_index_time}'" <!-- 增量导入详情查询:根据deltaQuery返回的ID获取完整数据 --> deltaImportQuery="SELECT id, product_name, category, price, create_time FROM your_cassandra_table WHERE id = '${dataimporter.delta.id}'"> <!-- 字段映射:Cassandra列名 → Solr字段名 --> <field column="id" name="id"/> <field column="product_name" name="product_name"/> <field column="category" name="category"/> <field column="price" name="price" type="float"/> <field column="create_time" name="create_time" type="pdate"/> </entity> </document> </dataConfig>
注意:如果不需要增量导入,可以删掉deltaQuery和deltaImportQuery这两行;增量导入的前提是你的Cassandra表有可以判断更新的字段(比如时间戳)。
4. 同步Solr Schema与Cassandra字段
确保你的Solr Schema(managed-schema或schema.xml)里已经定义了对应Cassandra列的字段,类型要匹配:
<field name="id" type="string" indexed="true" stored="true" required="true" multiValued="false"/> <field name="product_name" type="text_general" indexed="true" stored="true"/> <field name="category" type="string" indexed="true" stored="true"/> <field name="price" type="float" indexed="true" stored="true"/> <field name="create_time" type="pdate" indexed="true" stored="true"/>
5. 上传配置到ZK(SolrCloud模式)
因为你是SolrCloud环境,需要把修改后的配置集上传到ZooKeeper,让所有Solr节点同步:
# 用Solr的zk命令上传配置,替换成你的实际路径和ZK地址 bin/solr zk upconfig -n your_configset_name -d /path/to/your/config_dir -z zk_host:2181
如果已经有对应的collection,需要重启collection让新配置生效:
bin/solr collection --reload your_collection_name
6. 测试数据导入
- 打开Solr Admin UI,进入对应collection的
Dataimport页面 - 选择
your_cassandra_table实体,先试试Full-Import全量导入,点击Execute - 查看页面的日志输出,或者去Solr的日志文件
server/logs/solr.log里检查是否有错误 - 导入完成后,用Solr的查询页面验证数据是否成功导入
常见问题排查
- 如果出现Cassandra连接失败:检查集群地址是否正确、Cassandra服务是否正常、防火墙是否开放9042端口
- 如果出现依赖冲突:检查guava版本是否和Solr内置的一致(Solr 6.6.3用的是guava 19)
- 如果增量导入不生效:确认
deltaQuery里的时间字段格式和Solr的last_index_time格式匹配,Cassandra里的时间字段是timestamp类型的话,格式要对应
内容的提问来源于stack exchange,提问作者Rj1
相关产品推荐
相关产品推荐

