Solr 7.2.1导入SQL Server百万数据仅10条,求配置排查
首先,咱们先从配置文件的明显语法错误入手,这些问题很可能是导致导入提前终止的直接原因:
1. 修复data.import.xml的语法问题
你的配置里有几处标签闭合和属性错误:
<entity结尾缺失闭合符号,应该写成</entity>- 根标签
<dataConfig>结尾写成了<dataConfig>,正确闭合应为</dataConfig> password="<<PASSWORD"缺少闭合的双引号,需修正为password="<<PASSWORD>>"
修正后的data.import.xml示例:
<dataConfig> <dataSource type="JdbcDataSource" driver="com.microsoft.sqlserver.jdbc.SQLServerDriver" url="jdbc:sqlserver://<<SERVER>>;databaseName=<<DATABASE>>;" user="<<USER>>" password="<<PASSWORD>>" /> <document name="MY_DOCUMENT"> <entity name="doc" query="SELECT * FROM MYTABLE"> <field column='Field1' name='field1' /> <field column='field2' name='field2' /> ... </entity> </document> </dataConfig>
2. 修正solrconfig.xml的lucene版本不匹配问题
你使用的是Solr 7.2.1,但luceneMatchVersion设置为6.0,版本不兼容可能导致字段处理、数据导入过程中出现隐性错误。请将其修改为与Solr版本一致的7.2.1:
<luceneMatchVersion>7.2.1</luceneMatchVersion>
接下来分析SQL Server的ASYNC_NETWORK_IO挂起错误:这个错误本质是SQL Server已准备好数据,但客户端(Solr)迟迟未接收完数据,导致连接挂起。结合仅导入10条数据的现象,核心原因是百万级数据一次性拉取的压力过大,再加上可能的驱动、内存配置问题。
3. 优化DataImportHandler的查询逻辑(核心解决方案)
百万条数据全量导入时,绝对不能用SELECT * FROM MYTABLE一次性拉取,会导致Solr内存溢出、数据传输卡顿。推荐采用分页导入的方式:
方式一:使用DIH自带的分页参数
在entity标签中添加分页配置,每次拉取固定行数(比如1000条):
<entity name="doc" query="SELECT * FROM MYTABLE ORDER BY field1 OFFSET ${dataimporter.offset} ROWS FETCH NEXT 1000 ROWS ONLY" pagination="true" rows="1000"> <!-- 字段映射内容 --> </entity>
这里使用SQL Server的OFFSET/FETCH语法分页,field1作为主键确保排序稳定。
方式二:基于主键的增量式全量导入(更可靠)
如果你的表有主键(比如field1),可以利用DIH的增量导入逻辑实现分批全量导入:
<entity name="doc" query="SELECT * FROM MYTABLE" deltaQuery="SELECT field1 FROM MYTABLE WHERE 1=1" <!-- 全量时触发所有主键 --> deltaImportQuery="SELECT * FROM MYTABLE WHERE field1 = '${dataimporter.delta.field1}'" pk="field1"> <!-- 字段映射内容 --> </entity>
这种方式会将全量导入拆分为单个主键的查询,避免一次性拉取大量数据。
4. 检查JDBC驱动兼容性
确保你使用的SQL Server JDBC驱动适配Java 8和你的SQL Server版本:
- 将适配的驱动jar(比如
mssql-jdbc-6.4.0.jre8.jar)放到Solr的server/lib目录下 - 避免使用过旧的驱动,旧驱动在处理大结果集时容易出现传输卡顿
5. 调整Solr的JVM内存
百万条数据导入需要足够的内存支撑,修改Solr的启动配置:
- Linux:编辑
solr.in.sh,修改JAVA_OPTS:JAVA_OPTS="-Xmx4g -Xms2g -XX:+UseG1GC" - Windows:编辑
solr.in.cmd,修改set JAVA_OPTS:set JAVA_OPTS=-Xmx4g -Xms2g -XX:+UseG1GC
可根据服务器实际内存调整,一般至少分配2-4G堆内存。
6. 查看Solr日志定位隐性错误
到Solr的logs目录下打开solr.log,搜索dataimport相关日志,里面会记录导入过程中的详细错误(比如字段类型不匹配、数据转换失败),这些错误可能导致导入中途终止,仅导入部分数据。
内容的提问来源于stack exchange,提问作者arcee123

