私の現在のタスクは、何百万ものドキュメントをSolrにロードするための最良のアプローチを見つけることです。データファイルは、csv形式のDBからのエクスポートです。
現在、ファイルを小さなファイルに分割し、curlを使用してこの小さなファイルを投稿するときにスクリプトを作成することを考えています。
大量のデータを投稿すると、ほとんどの場合、リクエストがタイムアウトすることに気づきました。
私はデータインポーターを調べています、そしてそれは良いオプションのようです
他のアイデアは高く評価されています
ありがとう
データベースがすでにソリューションの一部になっていない限り、ソリューションをさらに複雑にすることはありません。 SOLR FAQ を引用すると、セッションタイムアウトを発行しているのはサーブレットコンテナです。
私が見ているように、あなたにはいくつかのオプションがあります(私の好みの順序で):
コンテナのタイムアウトを増やします。 (埋め込みJettyインスタンスを使用している場合は、「maxIdleTime」パラメーター)。
私はあなたがたまにそのような大きなファイルにインデックスを付けるだけだと思いますか?一時的にタイムアウトを増やすのが最も簡単なオプションかもしれません。
これがその仕事をする簡単なUNIXスクリプトです(ファイルを500,000行のチャンクに分割します):
split -d -l 500000 data.csv split_files.
for file in `ls split_files.*`
do
curl 'http://localhost:8983/solr/update/csv?fieldnames=id,name,category&commit=true' -H 'Content-type:text/plain; charset=utf-8' --data-binary @$file
done
次のGroovyスクリプトは、opencsvとsolrjを使用してCSVファイルを解析し、500,000行ごとにSolrに変更をコミットします。
import au.com.bytecode.opencsv.CSVReader
import org.Apache.solr.client.solrj.SolrServer
import org.Apache.solr.client.solrj.impl.CommonsHttpSolrServer
import org.Apache.solr.common.SolrInputDocument
@Grapes([
@Grab(group='net.sf.opencsv', module='opencsv', version='2.3'),
@Grab(group='org.Apache.solr', module='solr-solrj', version='3.5.0'),
@Grab(group='ch.qos.logback', module='logback-classic', version='1.0.0'),
])
SolrServer server = new CommonsHttpSolrServer("http://localhost:8983/solr/");
new File("data.csv").withReader { reader ->
CSVReader csv = new CSVReader(reader)
String[] result
Integer count = 1
Integer chunkSize = 500000
while (result = csv.readNext()) {
SolrInputDocument doc = new SolrInputDocument();
doc.addField("id", result[0])
doc.addField("name_s", result[1])
doc.addField("category_s", result[2])
server.add(doc)
if (count.mod(chunkSize) == 0) {
server.commit()
}
count++
}
server.commit()
}
SOLR 4.0(現在ベータ版)では、ローカルディレクトリからのCSVをUpdateHandlerを使用して直接インポートできます。からの例の変更 SOLR Wiki
curl http://localhost:8983/solr/update?stream.file=exampledocs/books.csv&stream.contentType=text/csv;charset=utf-8
また、これによりファイルがローカルの場所からストリーミングされるため、ファイルをチャンク化してPOST HTTP経由で送信する必要はありません。
上記の回答は、単一のマシンからの取り込み戦略を非常によく説明しています。
ビッグデータインフラストラクチャが整っていて、分散データ取り込みパイプラインを実装したい場合は、さらにいくつかのオプションがあります。
Hive- solrコネクタ 、 spark- solrコネクタ 。
PS:
StandardDirectoryFactory
を使用します。solrconfig.xml
ファイルのautoCommit
およびautoSoftCommit
構成を調整してください。SolrServerException:このリクエストを処理するために利用できるライブSolrServerがありません
間違いなく、最初にこれらを通常のデータベースにロードするだけです。 CSVを処理するためのあらゆる種類のツールがあります(たとえば、 postgres'COPY )ので、簡単なはずです。 Data Import Handler の使用も非常に簡単なので、これはデータをロードするための最も摩擦のない方法のようです。不要なネットワーク/ HTTPオーバーヘッドが発生しないため、この方法も高速になります。