大批量向Elasticsearch中跑入数据的方式

一、通过Flink向ES中大批量跑入数据

 public static void main(String[] args) throws Exception {

        // 构建Flink环境对象
        StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();

        // Source : 数据的输入
        DataStreamSource<String> source = env.socketTextStream("localhost", 9999);

        // 使用ESBuilder构建输出
        List<HttpHost> hosts = new ArrayList<>();
        hosts.add(new HttpHost("127.0.0.1", 9200, "http"));
        ElasticsearchSink.Builder<String> esBuilder = new ElasticsearchSink.Builder<>(hosts,
                 new ElasticsearchSinkFunction<String>() {

                     @Override
                     public void process(String s, RuntimeContext runtimeContext, RequestIndexer requestIndexer) {
                         Map<String, String> jsonMap = new HashMap<>();
                         jsonMap.put("data", s);

                         IndexRequest indexRequest = Requests.indexRequest();
                         indexRequest.index("flink-index");
                         indexRequest.id("9001");
                         indexRequest.source(jsonMap);

                         requestIndexer.add(indexRequest);
                     }
                 });

        // Sink : 数据的输出
        esBuilder.setBulkFlushMaxActions(1);
        source.addSink(esBuilder.build());

        // 执行操作
        env.execute("flink-es");

    }

二、通过Sparkstreaming向ES中跑入大批量数据

 def main(args: Array[String]): Unit = {

        val sparkConf = new SparkConf().setMaster("local[*]").setAppName("ESTest")
        val ssc = new StreamingContext(sparkConf, Seconds(3))

        val ds: ReceiverInputDStream[String] = ssc.socketTextStream("localhost", 9999)
        ds.foreachRDD(
            rdd => {
                rdd.foreach(
                    data => {
                        val client = new RestHighLevelClient(
                            RestClient.builder(new HttpHost("localhost",9200, "http"))
                        )

                        val ss = data.split(" ")

                        val request = new IndexRequest()
                        request.index("product").id(ss(0))
                        val json =
                            s"""
                              | {  "data" : "${ss(1)}" }
                              |""".stripMargin
                        request.source(json, XContentType.JSON)

                        val response: IndexResponse = client.index(request, RequestOptions.DEFAULT)
                        println(response.getResult)
                        client.close()
                    }
                )
            }
        )

        ssc.start()
        ssc.awaitTermination()
    }

三、通过Kafka向ES中跑入数据

 public static void main(String[] args) throws Exception {
                   BulkRequest bulkRequest = new BulkRequest();
                    //初始化 ack
                    List<Acknowledgment> acks = new LinkedList<>();
                    Message<String> message = messages.poll();
                    DataEsSinker.reduceQueueSize(message.getPayload());

                    Acknowledgment acknowledgment = message.getHeaders().get(KafkaHeaders.ACKNOWLEDGMENT, Acknowledgment.class);

                    Map source = jackSon.readValue(message.getPayload(), Map.class);
                    String id = source.get("_id") == null ? "" : source.get("_id").toString();
                  
                    if (StringUtils.isNotBlank(id) ) {
                            bulkRequest.add(new UpdateRequest(this.indexName, "doc", URLEncoder.encode(id, "utf-8")).doc(source).upsert(source));
                                acks.add(acknowledgment);
                     }
                   if (bulkRequest.numberOfActions() > 0) {  
                     if (bulkResponse.hasFailures()) {
                                    for (Acknowledgment acknowledgment : acks) {
                                        if (acknowledgment != null) {
                                            acknowledgment.acknowledge();
                                        }
                                    }  
                           }         
                     }               
 }                           
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Elasticsearch 是一个分布式的开源搜索和分析引擎,它具有强大的搜索能力和高性能的数据处理能力。关于 Elasticsearch 的搜索量,没有一个具体的固定限制,它可以处理大规模的数据和高并发的搜索请求。 Elasticsearch 的性能和搜索量的处理能力取决于多个因素,包括硬件设备、集群配置、索引设计、查询复杂性等。通过适当的硬件配置、集群优化和索引优化,Elasticsearch 可以扩展到处理大规模的数据和高负载的搜索请求。 以下是一些影响 Elasticsearch 搜索量的关键因素: 1. 硬件:适当的硬件配置,包括足够的内存、磁盘空间和处理器能力,可以提供更好的性能和搜索吞吐量。 2. 集群配置:合理配置 Elasticsearch 集群的节点数量和分片数量,以适应数据量和查询负载。增加集群节点和分片可以提高搜索容量和并发性能。 3. 索引设计:优化索引结构、字段映射和分片策略,可以提高搜索效率和吞吐量。合理设置索引的副本数量,以提高搜索的可用性和负载均衡。 4. 查询优化:编写高效的查询语句,使用合适的查询类型和过滤器,减少不必要的计算和网络传输,可以提高搜索性能。 5. 缓存机制:利用 Elasticsearch 的缓存机制,如字段数据缓存、过滤器缓存和请求缓存,可以减少重复计算,提高搜索效率。 总的来说,Elasticsearch 可以处理大规模的数据和高并发的搜索请求,但要实现高性能和大搜索量的处理能力,需要综合考虑硬件、集群配置、索引设计和查询优化等各方面因素。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值