C#NEST Bulk api与System.IO.IOException失败

时间:2017-06-22 04:00:40

标签: elasticsearch nest

我正在尝试将数据从SQL批量插入到ElasticSearch索引。下面是我正在使用的代码,总记录数约为150万。我认为这与连接设置有关,但我无法弄明白。有人可以帮助您使用此代码或建议更好的方法吗?

public void InsertReceipts
{
IEnumerable<Receipts> receipts = GetFromDB() // get receipts from SQL DB

const string index = "receipts";
var config = ConfigurationManager.AppSettings["ElasticSearchUri"];
var node = new Uri(config);

var settings = new ConnectionSettings(node).RequestTimeout(TimeSpan.FromMinutes(30));
var client = new ElasticClient(settings);

var bulkIndexer = new BulkDescriptor();

foreach (var receiptBatch in receipts.Batch(20000)) //using MoreLinq for Batch
{
    Parallel.ForEach(receiptBatch, (receipt) =>
    {
        bulkIndexer.Index<OfficeReceipt>(i => i
            .Document(receipt)
            .Id(receipt.TransactionGuid)
            .Index(index));
    });
    var response = client.Bulk(bulkIndexer);

    if (!response.IsValid)
    {
        _logger.LogError(response.ServerError.ToString());

    }

    bulkIndexer = new BulkDescriptor();
}

}

代码工作正常但需要大约10分钟才能完成。当我尝试增加批量大小时,它失败并出现以下错误:

  

无效的低级别呼叫构建的无效NEST响应   POST:/ _bulk

     

无效的批量项:OriginalException:System.Net.WebException:The   底层连接已关闭:a上发生意外错误   发送。 ---&GT; System.IO.IOException:无法将数据写入   传输连接:强制关闭现有连接   远程主机。 ---&GT; System.Net.Sockets.SocketException:现有的   连接被远程主机强行关闭

2 个答案:

答案 0 :(得分:1)

一个好的起点是批量为1,000到5,000份文件,或者,如果您的文件很大,批量甚至更小。

密切关注批量请求的实际大小通常很有用。一千个1KB文件与一千个1MB文件非常不同。开始玩的好体积大小约为5-15MB。

答案 1 :(得分:0)

我有类似的问题。在建立ElasticClient连接之前,通过添加以下代码解决了我的问题:

System.Net.ServicePointManager.Expect100Continue = false;