通过带有scala的logstash将数据批量插入elasticsearch

通过带有scala的logstash将数据批量插入elasticsearch,scala,logstash,bulk,Scala,Logstash,Bulk,我需要通过scala代码定期向elasticsearch插入大量数据。在谷歌搜索时,我发现使用logstash可以提高插入率,但logstash没有任何java库或Api可调用,所以我尝试通过http客户端连接到它。我不知道使用http协议发送大数据是一种好方法,或者使用其他方法(例如使用代理、队列、redis等)更好 我知道logstash的最新版本(6.X,7.X)支持使用持久性队列,因此它可以是使用logstash队列的另一种解决方案,但也可以通过http或tcp协议 还请注意,可靠性是我

我需要通过scala代码定期向elasticsearch插入大量数据。在谷歌搜索时,我发现使用logstash可以提高插入率,但logstash没有任何java库或Api可调用,所以我尝试通过http客户端连接到它。我不知道使用http协议发送大数据是一种好方法,或者使用其他方法(例如使用代理、队列、redis等)更好

我知道logstash的最新版本(6.X,7.X)支持使用持久性队列,因此它可以是使用logstash队列的另一种解决方案,但也可以通过http或tcp协议

还请注意,可靠性是我的首要任务,因为数据不能丢失,应该有一种机制在代码中返回响应,以便处理成功或失败

如果有任何想法,我将不胜感激

更新


似乎使用http是健壮的,并且有基于http的确认机制,但是如果采用这种方法,scala中的哪个http客户端LIB更合适,因为我需要按键值格式顺序发送大容量数据,并以无阻塞方式处理响应?

这听起来可能有些过分,但在scala代码和logstash之间引入缓冲层可能会很有帮助,因为您可以摆脱繁重的http调用并依赖轻量级协议运输

考虑在scala代码和logstash之间添加Kafka,以便对消息进行排队。Logstash可以使用TCP传输和批量插入ElasticSearch可靠地处理来自Kafka的消息。另一方面,您可以将scala代码生成(批处理)中的消息放入Kafka,以使整个管道高效工作


这样的话,如果你没有一个音量,比如说10000 MSGs/SEC,那么你也可以考虑通过调整线程和使用多个LogStuh进程来摆弄LogStasHTTP输入插件。这是为了降低在体系结构中添加另一个移动块(Kafka)的复杂性。

我建议您考虑将其与Akka相结合。谢谢,我在scala代码和logstash的多个实例之间使用了Redis的多个实例(作为您提到的缓冲层)还添加了一个负载平衡器,每次在Redis实例之间切换,然后在logstash输入插件中添加了线程数和批处理大小的配置,似乎可以正常工作