5

javaを使用してelasticsearchバルクAPIを使用したいのですが、バッチサイズをどのように設定できるか疑問に思っています。

現在、私は次のように使用しています:

BulkRequestBuilder bulkRequest = getClient().prepareBulk();
while(hasMore) {
    bulkRequest.add(getClient().prepareIndex(indexName, indexType, artist.getDocId()).setSource(json));
    hasMore = checkHasMore();
}
BulkResponse bResp = bulkRequest.execute().actionGet();
//To check failures
log.info("Has failures? {}", bResp.hasFailures());

バルク/バッチサイズを設定する方法はありますか?

4

2 に答える 2

23

これは主に、ドキュメントのサイズ、クライアントで利用可能なリソース、およびクライアントのタイプ (トランスポート クライアントまたはノード クライアント) によって異なります。

ノード クライアントは、クラスタ上のシャードを認識し、インデックスが作成されるはずのシャードを保持するノードにドキュメントを直接送信します。一方、トランスポートクライアントは、ラウンドロビン方式でノードのリストにリクエストを送信する通常のクライアントです。一括リクエストは 1 つのノードに送信され、インデックス作成時にゲートウェイになります。

Java API を使用しているため、 を参照することをお勧めしますBulkProcessor。これにより、一括でのインデックス作成がはるかに簡単かつ柔軟になります。アクションの最大数、最大サイズ、および最後の一括実行からの最大時間間隔を定義できます。必要に応じて、一括処理が自動的に実行されます。同時一括リクエストの最大数を設定することもできます。

このように作成した後BulkProcessor

BulkProcessor bulkProcessor = BulkProcessor.builder(client, new BulkProcessor.Listener() {
    @Override
    public void beforeBulk(long executionId, BulkRequest request) {
        logger.info("Going to execute new bulk composed of {} actions", request.numberOfActions());
    }

    @Override
    public void afterBulk(long executionId, BulkRequest request, BulkResponse response) {
        logger.info("Executed bulk composed of {} actions", request.numberOfActions());
    }

    @Override
    public void afterBulk(long executionId, BulkRequest request, Throwable failure) {
        logger.warn("Error executing bulk", failure);
    }
    }).setBulkActions(bulkSize).setConcurrentRequests(maxConcurrentBulk).build();

リクエストを追加するだけです:

bulkProcessor.add(indexRequest);

最後に閉じて、まだ実行されていない可能性のある最終的なリクエストをフラッシュします。

bulkProcessor.close();

最後にあなたの質問に答えるために: の良いところBulkProcessorは、賢明なデフォルトがあることです: 5 MB のサイズ、1000 アクション、1 つの同時要求、フラッシュ間隔なし (設定すると便利な場合があります)。

于 2013-06-04T20:36:03.583 に答える