solr - 在 apache solr 云中索引巨大的表记录
问题描述
我有一个包含 900 万条记录的 Cassandra 表,我的数据大小为 500 MB。我有一个具有 3 个节点(3 个分片和 2 个副本)的 Solr 云和三个外部 Zookeeper 集成。我的 Cassandra 是一个 1 节点集群。我正在尝试使用 Apache Solr 对该表进行索引,但是一旦我开始完全导入,我的查询就会超时。
我能够cqlsh
并获取记录,但我无法索引它。这是我的附件solr.log
...
Caused by: org.apache.solr.handler.dataimport.DataImportHandlerException: Unable to execute query: SELECT * from counter.series Processing Document # 1
at org.apache.solr.handler.dataimport.DataImportHandlerException.wrapAndThrow(DataImportHandlerException.java:69)
at org.apache.solr.handler.dataimport.JdbcDataSource$ResultSetIterator.<init>(JdbcDataSource.java:318)
at org.apache.solr.handler.dataimport.JdbcDataSource.getData(JdbcDataSource.java:279)
at org.apache.solr.handler.dataimport.JdbcDataSource.getData(JdbcDataSource.java:54)
at org.apache.solr.handler.dataimport.SqlEntityProcessor.initQuery(SqlEntityProcessor.java:59)
at org.apache.solr.handler.dataimport.SqlEntityProcessor.nextRow(SqlEntityProcessor.java:73)
at org.apache.solr.handler.dataimport.EntityProcessorWrapper.nextRow(EntityProcessorWrapper.java:244)
at org.apache.solr.handler.dataimport.DocBuilder.buildDocument(DocBuilder.java:475)
at org.apache.solr.handler.dataimport.DocBuilder.buildDocument(DocBuilder.java:414)
... 5 more
Caused by: java.sql.SQLTransientConnectionException: TimedOutException()
at org.apache.cassandra.cql.jdbc.CassandraStatement.doExecute(CassandraStatement.java:189)
at org.apache.cassandra.cql.jdbc.CassandraStatement.execute(CassandraStatement.java:205)
at org.apache.solr.handler.dataimport.JdbcDataSource$ResultSetIterator.executeStatement(JdbcDataSource.java:338)
at org.apache.solr.handler.dataimport.JdbcDataSource$ResultSetIterator.<init>(JdbcDataSource.java:313)
... 12 more
Caused by: TimedOutException()
at org.apache.cassandra.thrift.Cassandra$execute_cql3_query_result.read(Cassandra.java:37865)
at org.apache.thrift.TServiceClient.receiveBase(TServiceClient.java:78)
at org.apache.cassandra.thrift.Cassandra$Client.recv_execute_cql3_query(Cassandra.java:1562)
at org.apache.cassandra.thrift.Cassandra$Client.execute_cql3_query(Cassandra.java:1547)
at org.apache.cassandra.cql.jdbc.CassandraConnection.execute(CassandraConnection.java:468)
at org.apache.cassandra.cql.jdbc.CassandraConnection.execute(CassandraConnection.java:494)
at org.apache.cassandra.cql.jdbc.CassandraStatement.doExecute(CassandraStatement.java:164)
... 15 more
我需要一些帮助来索引表,无论是批量还是使用多个线程。欢迎任何帮助或建议.. db-data-config.xml:
<dataConfig>
<dataSource type="JdbcDataSource" driver="org.apache.cassandra.cql.jdbc.CassandraDriver" url="jdbc:cassandra://192.168.0.7:9160/counter" user="cassandra" password="cassandra" autoCommit="true" />
<document>
<entity name="counter" query="SELECT * from counter.series;" autoCommit="true">
<field column="serial" name="serial" />
<field column="random" name="random" />
<field column="remarks" name="remarks" />
<field column="timestamp" name="timestamp" />
</entity>
</document>
</dataConfig>
solrconfig.xml
<requestHandler name="/dataimport" class="org.apache.solr.handler.dataimport.DataImportHandler">
<lst name="defaults">
<str name="config">db-data-config.xml</str>
</lst>
架构.xml
<field name="remarks" type="string" indexed="false" stored="false" required="false" />
<field name="serial" type="string" indexed="true" stored="true" required="true" />
<field name="random" type="string" indexed="false" stored="true" required="true" />
<field name="timestamp" type="string" indexed="false" stored="false" required="false" />
解决方案
问题很可能是发送到 Solr 的数据的有效负载大小。默认情况下,当没有batchSize
指定时JdbcDataSource
默认为 500。在您的情况下,它看起来太多了。您应该在 Solr 端使用较小的数字或增加超时设置
推荐阅读
- postgresql - 使用gorm检索没有模型的记录
- r - 如何使一行成为列名并将字符串拆分为多行
- vba - Excel VBA 在 50 张纸上运行宏
- amazon-s3 - 上传到 S3 后 CSP 阻止 Fineuploader 缩略图
- macos - 我需要什么调整才能使 ssh://user@machine.com URL 在 mac 中的 iterm2 上与 fish 一起使用?
- typescript - Typescript:基于属性值的类型确定
- javascript - 如何一次将两个值输入 y 轴对应于 Highchart 中的单个 x 轴值
- python-3.x - 在 python 列表中交换的意外行为
- c# - 读取控制台应用程序的输出
- sql - 使用 Regexp_Like() 函数列出字符串