国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

【已解決】Java 中使用 ES 高級客戶端庫 RestHighLevelClient 清理百萬級規(guī)模歷史數(shù)據(jù)

這篇具有很好參考價值的文章主要介紹了【已解決】Java 中使用 ES 高級客戶端庫 RestHighLevelClient 清理百萬級規(guī)模歷史數(shù)據(jù)。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

??工作中遇到這樣一個需求場景:由于ES數(shù)據(jù)庫中歷史數(shù)據(jù)過多,占用太多的磁盤空間,需要定期地進行清理,在一定程度上可以釋放磁盤空間,減輕磁盤空間壓力。

??在經(jīng)過調(diào)研之后發(fā)現(xiàn),某服務(wù)項目每周產(chǎn)生的數(shù)據(jù)量已經(jīng)達到千萬級別,單日將近能產(chǎn)生兩百萬的數(shù)據(jù)量寫入到 ES 數(shù)據(jù)庫中,平均每個小時最少產(chǎn)生 10w+ 條數(shù)據(jù),加上之前的歷史數(shù)據(jù),目前生產(chǎn)環(huán)境 ES 數(shù)據(jù)量已經(jīng)達到兩億一千四百八十萬的數(shù)據(jù)。并且隨著當(dāng)前業(yè)務(wù)量的爆發(fā)式增長,數(shù)據(jù)增長量急劇飆升,在未來一年內(nèi)每周產(chǎn)生的數(shù)據(jù)量有望達到 3kw-5kw 左右。

【已解決】Java 中使用 ES 高級客戶端庫 RestHighLevelClient 清理百萬級規(guī)模歷史數(shù)據(jù),問題隨筆,# Elasticsearch,Java,java,elasticsearch,restClient
【已解決】Java 中使用 ES 高級客戶端庫 RestHighLevelClient 清理百萬級規(guī)模歷史數(shù)據(jù),問題隨筆,# Elasticsearch,Java,java,elasticsearch,restClient
【已解決】Java 中使用 ES 高級客戶端庫 RestHighLevelClient 清理百萬級規(guī)模歷史數(shù)據(jù),問題隨筆,# Elasticsearch,Java,java,elasticsearch,restClient

??因此,對 ES 數(shù)據(jù)庫中歷史數(shù)據(jù)進行清理勢在必行,為了能夠釋放磁盤空間,并且還要保證業(yè)務(wù)方能夠進行日常問題的排查定位,決定從兩個月前的數(shù)據(jù)開始清理,方案如下:

  • 編寫定時任務(wù),每天凌晨三點清理兩個月前的那一天數(shù)據(jù),之所以選擇凌晨三點是因為在 Grafana 查看了生產(chǎn)環(huán)境的集群監(jiān)控情況,凌晨兩點至四點之間的集群、索引的查詢以及寫入 QPS 都比較低。

【已解決】Java 中使用 ES 高級客戶端庫 RestHighLevelClient 清理百萬級規(guī)模歷史數(shù)據(jù),問題隨筆,# Elasticsearch,Java,java,elasticsearch,restClient

  • 清理一天的數(shù)據(jù)時,根據(jù)時間段進行清理,每個小時清理一次,避免內(nèi)存中存放太多的數(shù)據(jù),導(dǎo)致內(nèi)存溢出。
  • 清理 ES 數(shù)據(jù)時,需要先查詢出數(shù)據(jù),而 ES 默認(rèn)最多只能查詢 1w 條數(shù)據(jù),如果當(dāng)次需要刪除的數(shù)據(jù)量超過 1w 條,普通的查詢操作無法完全刪除數(shù)據(jù)。因此,需要采用滾動查詢的方式,滾動查詢結(jié)果保持時間需要設(shè)置合理,不能太長,否則也可能會導(dǎo)致內(nèi)存溢出。

根據(jù)以上的思路方案,設(shè)計的定時清理ES歷史數(shù)據(jù)代碼如下:

import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.time.DateUtils;
import org.elasticsearch.action.bulk.BulkRequest;
import org.elasticsearch.action.delete.DeleteRequest;
import org.elasticsearch.action.search.ClearScrollRequest;
import org.elasticsearch.action.search.SearchRequest;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.action.search.SearchScrollRequest;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.core.TimeValue;
import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.search.Scroll;
import org.elasticsearch.search.SearchHit;
import org.elasticsearch.search.builder.SearchSourceBuilder;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;

import javax.annotation.Resource;
import java.util.Date;

/**
 * 清理ES歷史數(shù)據(jù)定時任務(wù)
 */
@Component
public class CleanESHistoryDataTask {

    private static final Logger LOGGER = LoggerFactory.getLogger(CleanESHistoryDataTask.class);

    @Resource
    private RestHighLevelClient restHighLevelClient;

    /**
     * 根據(jù)索引名稱刪除當(dāng)前日期兩個月前的那一天的歷史文檔數(shù)據(jù)
     * @param jobContext
     */
    @Scheduled
    public void cleanESHistoryData(JobContext jobContext) {
    	// jobContext為定時任務(wù)中回傳數(shù)據(jù)
        String indexName = jobContext.getData();
        if (StringUtils.isBlank(indexName)) {
            LOGGER.warn("ES索引名稱不能為空!");
            return;
        }
        long startTimeMillis = System.currentTimeMillis();
        String twoMonthsAgoDate = DateTool.format(DateUtils.addMonths(new Date(), -1), DateTool.DF_DAY);
        try {
            String startTimeStr = twoMonthsAgoDate + " 00:00:00";
            // 初始化時間,形如2023-08-06 00:00:00
            Date initialStartTime = DateTool.parse(startTimeStr, DF_FULL);
            // 每次循環(huán)清理一個小時歷史文檔數(shù)據(jù),循環(huán)24次清理完一天的歷史文檔數(shù)據(jù)
            for (int i = 0; i < 24; i++) {
                Date startTime = initialStartTime;
                startTime = DateUtils.addHours(startTime, i);
                Date endTime = DateUtils.addHours(startTime, 1);
                LOGGER.info("正在清理索引:[{}],時間:{} 至 {}的歷史文檔數(shù)據(jù)...", indexName, DateTool.format(startTime, DF_FULL), DateTool.format(endTime, DF_FULL));
                long currentStartTimeMillis = System.currentTimeMillis();
                // 指定操作的索引庫
                SearchRequest searchRequest = new SearchRequest(indexName);
                // 構(gòu)造查詢條件,指定查詢的時間范圍,每次最多寫入1000條數(shù)據(jù)至內(nèi)存,減輕服務(wù)器內(nèi)存壓力
                SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder().query(QueryBuilders.rangeQuery("createTimeStr.keyword")
                                                                                    .from(DateTool.format(startTime, DF_FULL))
                                                                                    .to(DateTool.format(endTime, DF_FULL)))
                                                                                    .size(1000);
                // 設(shè)置滾動查詢結(jié)果在內(nèi)存中的過期時間為1min
                Scroll scroll = new Scroll(TimeValue.timeValueMinutes(1L));
                // 將滾動以及構(gòu)造的查詢條件放入查詢請求
                searchRequest.scroll(scroll).source(searchSourceBuilder);
                SearchResponse searchResponse = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);
                // 記錄要滾動的ID
                String scrollId = searchResponse.getScrollId();
                SearchHit[] hits = searchResponse.getHits().getHits();
                while (hits != null && hits.length > 0) {
                    // 創(chuàng)建批量處理請求對象
                    BulkRequest bulkRequest = new BulkRequest();
                    for (SearchHit hit : hits) {
                        DeleteRequest deleteRequest = new DeleteRequest(indexName, hit.getId());
                        bulkRequest.add(deleteRequest);
                    }
                    // 執(zhí)行批量刪除請求操作
                    restHighLevelClient.bulk(bulkRequest, RequestOptions.DEFAULT);
                    // 構(gòu)造滾動查詢條件,繼續(xù)滾動查詢
                    SearchScrollRequest scrollRequest = new SearchScrollRequest(scrollId);
                    scrollRequest.scroll(scroll);
                    searchResponse = restHighLevelClient.scroll(scrollRequest, RequestOptions.DEFAULT);
                    scrollId = searchResponse.getScrollId();
                    hits = searchResponse.getHits().getHits();
                }
                // 當(dāng)前滾動查詢結(jié)束,清除滾動,釋放服務(wù)器內(nèi)存資源
                ClearScrollRequest clearScrollRequest = new ClearScrollRequest();
                clearScrollRequest.addScrollId(scrollId);
                restHighLevelClient.clearScroll(clearScrollRequest, RequestOptions.DEFAULT);
                LOGGER.info("清理索引:[{}],時間:{} 至 {}的歷史文檔數(shù)據(jù)成功,耗時{}ms", indexName, DateTool.format(startTime, DF_FULL), DateTool.format(endTime, DF_FULL), (System.currentTimeMillis() - currentStartTimeMillis));
            }
            LOGGER.info("[cleanESHistoryData] 定時任務(wù)-清理索引:[{}],時間:{}的歷史文檔數(shù)據(jù)成功,耗時{}ms", indexName, twoMonthsAgoDate, (System.currentTimeMillis() - startTimeMillis));
        } catch (Exception e) {
            LOGGER.error(String.format("[cleanESHistoryData] 定時任務(wù)-清理索引:[%],時間:%的歷史文檔數(shù)據(jù)失敗,耗時%ms", indexName, twoMonthsAgoDate, (System.currentTimeMillis() - startTimeMillis)), e);
        }
    }
}

其中,需要注意以下幾點

  • 在 Java 中對 ES 進行操作,這里使用的是 ES 的高級客戶端組件 RestHighLevelClient 。
  • @Scheduled 注解為自研定時任務(wù)工具注解,外界無法使用,在使用定時任務(wù)時需要自己選擇合適的定時任務(wù)框架。
  • DateTool 工具類為自研工具類,外界同樣無法使用,在以上代碼段中就是用于對 java.util.Date 類型進行轉(zhuǎn)換為字符串,DF_FULLDateTool.DF_DAY 均是常量,它們的值分別為 yyyy-MM-dd HH:mm:ssyyyy-MM-dd。

【已解決】Java 中使用 ES 高級客戶端庫 RestHighLevelClient 清理百萬級規(guī)模歷史數(shù)據(jù),問題隨筆,# Elasticsearch,Java,java,elasticsearch,restClient

??通過觀察監(jiān)控可以發(fā)現(xiàn),在凌晨三點執(zhí)行定時任務(wù)清理 ES 歷史數(shù)據(jù)期間,集群、索引查詢 QPS 以及 CPU 利用率指標(biāo)都明顯飆升。因此,清理 ES 數(shù)據(jù)時一定要避開流量高峰期,避免在流量高峰期清理數(shù)據(jù)時造成資源實例宕機,造成生產(chǎn)事故。文章來源地址http://www.zghlxwxcb.cn/news/detail-632172.html

到了這里,關(guān)于【已解決】Java 中使用 ES 高級客戶端庫 RestHighLevelClient 清理百萬級規(guī)模歷史數(shù)據(jù)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • spring data elasticsearch使用7.x客戶端兼容es 8.x和使用ssl構(gòu)建RestHighLevelClient

    es在7.x中默認(rèn)加入elastic security組件所以java client需要使用ssl連接es server. es 8.x 中廢棄了 RestHighLevelClient ,使用新版的 java api client ,但是spring data elasticsearch還未更新到該版本.所以需要兼容es 8.x 如下是RestHighLevelClient構(gòu)建方法: spring data elasticsearch客戶端依賴(基于spring boot2.7使用最新

    2024年02月13日
    瀏覽(26)
  • Elasticsearch8.x版本中RestHighLevelClient被棄用,新版本中全新的Java客戶端Elasticsearch Java API Client中常用API練習(xí)

    在Es7.15版本之后,es官方將它的高級客戶端RestHighLevelClient標(biāo)記為棄用狀態(tài)。同時推出了全新的java API客戶端Elasticsearch Java API Client,該客戶端也將在Elasticsearch8.0及以后版本中成為官方推薦使用的客戶端。 Elasticsearch Java API Client支持除Vector title search API和Find structure API之外的所有

    2023年04月08日
    瀏覽(24)
  • java用es客戶端創(chuàng)建索引

    先用java創(chuàng)建esClient 創(chuàng)建es索引模板 新建索引 批量插入數(shù)據(jù) 1.先批量生成數(shù)據(jù) 2批量導(dǎo)入方法

    2024年02月11日
    瀏覽(16)
  • es最大相似度檢索(原生與java客戶端)

    原生rest: 對“不好”進行分詞, \\\"operator\\\": \\\"and\\\" 意思是同時滿足。 結(jié)果: java RestHighLevelClient

    2024年02月11日
    瀏覽(25)
  • 【U8+】使用天聯(lián)高級版客戶端登錄用友U8,指定U8服務(wù)器地址。

    【U8+】使用天聯(lián)高級版客戶端登錄用友U8,指定U8服務(wù)器地址。

    【問題描述】 當(dāng)使用U8客戶端電腦作為天聯(lián)高級版軟件服務(wù)器的時候, 即:U8應(yīng)用服務(wù)器和遠程服務(wù)器不是同一臺電腦。 每次新建天高用戶后, 新的天高用戶,登錄天高客戶端后并打開U8登錄界面, 用友U8的登錄窗口服務(wù)器地址即為天高服務(wù)器的計算機名稱, 而不是用友U

    2024年02月13日
    瀏覽(24)
  • Redis的Java客戶端-Java客戶端以及SpringDataRedis的介紹與使用

    Redis的Java客戶端-Java客戶端以及SpringDataRedis的介紹與使用

    Spring Data Redis底層支持同時兼容Jedis和Lettuce兩種不同的Redis客戶端,可以根據(jù)需要任意選擇使用其中的一種。這樣既可以保留現(xiàn)有代碼使用的Jedis方式,也可以通過使用基于Netty的高性能Lettuce客戶端,提升應(yīng)用的性能和吞吐量。 Jedis是一個傳統(tǒng)的Java Redis客戶端,使用BIO進行So

    2024年02月08日
    瀏覽(22)
  • java webSocket服務(wù)端、客戶端、心跳檢測優(yōu)雅解決

    項目分為三個端,項目之間需要webSocket通信。 WebSocketConfig WebSocketServer

    2024年02月17日
    瀏覽(19)
  • es(Elasticsearch)客戶端Elasticsearch-head安裝使用(04Elasticsearch-head安裝篇)

    es(Elasticsearch)客戶端Elasticsearch-head安裝使用(04Elasticsearch-head安裝篇)

    elasticsearch-head是一款專門針對于elasticsearch的客戶端工具,用來展示數(shù)據(jù)。elasticsearch-head是基于JavaScript語言編寫的,可以使用npm部署,npm是Nodejs下的包管理器 安裝方式利用npm和nodejs進行安裝啟動,github中給出的安裝方法也是這種,本文就是以這種方式進行解說 es(Elasticsearc

    2024年01月17日
    瀏覽(33)
  • es相關(guān)的官方客戶端與spring客戶端對比與介紹

    es相關(guān)的官方客戶端與spring客戶端對比與介紹

    es提供的 TransportClient 傳統(tǒng)的客戶端,基于TCP傳輸協(xié)議與Elasticsearch通信。 已經(jīng)被棄用,不推薦使用。 適用于Elasticsearch 5.x及以前的版本 因為Elasticsearch 6.x及以上版本已不再支持TCP Transport協(xié)議,TransportClient無法連接Elasticsearch集群。 RestHighLevelClient 是一個高級的REST客戶端,主要用于與

    2024年02月02日
    瀏覽(24)
  • JAVA使用WebSocket實現(xiàn)多客戶端請求

    工作前提:兩個服務(wù)之間實現(xiàn)聊天通訊,因為介于兩個服務(wù),兩個客戶端 方案1:多個服務(wù)端,多個客戶端,使用redis把用戶數(shù)據(jù)ip進行存儲,交互拿到redis數(shù)據(jù)進行推送 方案2: 一個服務(wù)端,多個客戶端,拿到客戶端的id和需要推送的id進行拼接存儲 此文章使用的是方案2 1. 引

    2024年02月11日
    瀏覽(17)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包