Solr DataImportHandler的Chunked UrlDataSource

时间:2011-05-12 00:26:36

标签: indexing solr bigdata

我正在考虑将我的数据源分块以便将优化数据导入到solr中,并且想知道是否可以使用将数据分块的主网址。

例如文件1可能有

<chunks>
  <chunk url="http://localhost/chunker?start=0&stop=100" />
  <chunk url="http://localhost/chunker?start=100&stop=200" />
  <chunk url="http://localhost/chunker?start=200&stop=300" />
  <chunk url="http://localhost/chunker?start=300&stop=400" />
  <chunk url="http://localhost/chunker?start=400&stop=500" />
  <chunk url="http://localhost/chunker?start=500&stop=600" />
</chunks>

每个块网址都会导致类似

的内容
<items>
   <item data1="info1" />
   <item data1="info2" />
   <item data1="info3" />
   <item data1="info4" />
</iems>

我正在处理5亿多条记录,所以我认为需要对数据进行分块以避免内存问题(在使用SQLEntityProcessor时遇到这种情况)。我还想避免提出超过500万的网络请求,因为我认为这可能会变得昂贵

2 个答案:

答案 0 :(得分:7)

由于互联网上缺少示例,我想我会发布我最终使用的内容

<?xml version="1.0" encoding="utf-8"?>
<result>
  <dataCollection func="chunked">
    <data info="test" info2="test" />
    <data info="test" info2="test" />
    <data info="test" info2="test" />
    <data info="test" info2="test" />
    <data info="test" info2="test" />
    <data info="test" info2="test" />
    <data hasmore="true" nexturl="http://server.domain.com/handler?start=0&amp;end=1000000000&amp;page=1&amp;pagesize=10"
  </dataCollection>
</result>

重要的是要注意我使用指定下一页上有更多内容并为下一页提供网址。这与Solr Documentation for DataImportHandlers一致。请注意,文档指定分页Feed应该告诉系统它有更多以及在哪里获得下一批。

<dataConfig>
    <dataSource name="b" type="URLDataSource" baseUrl="http://server/" encoding="UTF-8" />
    <document>
        <entity name="continue"
                dataSource="b"
                url="handler?start=${dataimport.request.startrecord}&amp;end=${dataimport.request.stoprecord}&amp;pagesize=100000"
                stream="true"
                processor="XPathEntityProcessor"
                forEach="/result/dataCollection/data"
                transformer="DateFormatTransformer"
                connectionTimeout="120000"
                readTimeout="300000"
                >
            <field column="id"  xpath="/result/dataCollection/data/@info" />
            <field column="id"  xpath="/result/dataCollection/data/@info" />
            <field column="$hasMore" xpath="/result/dataCollection/data/@hasmore" />
            <field column="$nextUrl" xpath="/result/dataCollection/data/@nexturl" />
        </entity>
    </document>

请注意$ hasMore和$ nextUrl字段。您可能希望放置超时。我还建议允许指定页面大小(它有助于使用tweeking设置来获得最佳处理速度)。我使用四核Xeon处理器和32GB内存的单个服务器上的多核(3)solr实例索引@大约每秒12.5K记录。

对结果进行分页的应用程序使用与存储数据的SQL服务器相同的系统。当我们最终对solr服务器进行负载均衡时,我也会通过开始和停止位置来最小化配置更改....

答案 1 :(得分:1)

可以嵌套实体以执行您最初想要的操作。内部实体可以像url="${chunk.link}"那样引用外部字段,其中chunk是外部实体名称&amp; link是字段名称。

<?xml version="1.0" encoding="windows-1250"?>
<dataConfig>
  <dataSource name="b" type="URLDataSource" baseUrl="http://server/" encoding="UTF-8" />
  <document>
    <entity name="chunk"
      dataSource="b"
      url="path/to/chunk.xml"
      stream="true"
      processor="XPathEntityProcessor"
      forEach="/chunks/chunk"
      transformer="DateFormatTransformer"
      connectionTimeout="120000"
      readTimeout="300000" >
      <field column="link" xpath="/chunks/chunk/@url" />
      <entity name="item"
        dataSource="b"
        url="${chunk.link}"
        stream="true"
        processor="XPathEntityProcessor"
        forEach="/items/item"
        transformer="DateFormatTransformer"
        connectionTimeout="120000"
        readTimeout="300000" >
        <field column="info"  xpath="/items/item/@info" />
      </entity>
    </entity>
</document>
</dataConfig>