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

【ElasticSearch】索引數(shù)據(jù)mapping嵌套深度過大導致Stackoverflow問題排查

這篇具有很好參考價值的文章主要介紹了【ElasticSearch】索引數(shù)據(jù)mapping嵌套深度過大導致Stackoverflow問題排查。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

現(xiàn)象

集群所有數(shù)據(jù)節(jié)點頻繁因為StackOverflowError的錯誤掛掉,啟動后還會掛掉,StackOverflowError異常棧如下

[2023-12-22T16:03:44,057][ERROR][o.e.b.ElasticsearchUncaughtExceptionHandler] [xr-data-hdp-dn-rtyarn0725] fatal error in thread [elasticsearch[xr-data-hdp-dn-rtyarn0725][write][T#6]], exiting
java.lang.StackOverflowError: null
        at org.elasticsearch.index.mapper.ObjectMapper$TypeParser.parseProperties(ObjectMapper.java:283) ~[elasticsearch-7.9.1.jar:7.9.1]
        at org.elasticsearch.index.mapper.ObjectMapper$TypeParser.parseObjectOrDocumentTypeProperties(ObjectMapper.java:237) ~[elasticsearch-7.9.1.jar:7.9.1]
        at org.elasticsearch.index.mapper.ObjectMapper$TypeParser.parse(ObjectMapper.java:210) ~[elasticsearch-7.9.1.jar:7.9.1]
        at org.elasticsearch.index.mapper.ObjectMapper$TypeParser.parseProperties(ObjectMapper.java:319) ~[elasticsearch-7.9.1.jar:7.9.1]
        at org.elasticsearch.index.mapper.ObjectMapper$TypeParser.parseObjectOrDocumentTypeProperties(ObjectMapper.java:237) ~[elasticsearch-7.9.1.jar:7.9.1]
        at org.elasticsearch.index.mapper.ObjectMapper$TypeParser.parse(ObjectMapper.java:210) ~[elasticsearch-7.9.1.jar:7.9.1]
        at org.elasticsearch.index.mapper.ObjectMapper$TypeParser.parseProperties(ObjectMapper.java:319) ~[elasticsearch-7.9.1.jar:7.9.1]
        at org.elasticsearch.index.mapper.ObjectMapper$TypeParser.parseObjectOrDocumentTypeProperties(ObjectMapper.java:237) ~[elasticsearch-7.9.1.jar:7.9.1]
        at org.elasticsearch.index.mapper.ObjectMapper$TypeParser.parse(ObjectMapper.java:210) ~[elasticsearch-7.9.1.jar:7.9.1]
        at org.elasticsearch.index.mapper.ObjectMapper$TypeParser.parseProperties(ObjectMapper.java:319) ~[elasticsearch-7.9.1.jar:7.9.1]
        at org.elasticsearch.index.mapper.ObjectMapper$TypeParser.parseObjectOrDocumentTypeProperties(ObjectMapper.java:237) ~[elasticsearch-7.9.1.jar:7.9.1]
        at org.elasticsearch.index.mapper.ObjectMapper$TypeParser.parse(ObjectMapper.java:210) ~[elasticsearch-7.9.1.jar:7.9.1]
        at org.elasticsearch.index.mapper.ObjectMapper$TypeParser.parseProperties(ObjectMapper.java:319) ~[elasticsearch-7.9.1.jar:7.9.1]
        at org.elasticsearch.index.mapper.ObjectMapper$TypeParser.parseObjectOrDocumentTypeProperties(ObjectMapper.java:237) ~[elasticsearch-7.9.1.jar:7.9.1]
        at org.elasticsearch.index.mapper.ObjectMapper$TypeParser.parse(ObjectMapper.java:210) ~[elasticsearch-7.9.1.jar:7.9.1]
        at org.elasticsearch.index.mapper.ObjectMapper$TypeParser.parseProperties(ObjectMapper.java:319) ~[elasticsearch-7.9.1.jar:7.9.1]
        at org.elasticsearch.index.mapper.ObjectMapper$TypeParser.parseObjectOrDocumentTypeProperties(ObjectMapper.java:237) ~[elasticsearch-7.9.1.jar:7.9.1]
        at org.elasticsearch.index.mapper.ObjectMapper$TypeParser.parse(ObjectMapper.java:210) ~[elasticsearch-7.9.1.jar:7.9.1]
        at org.elasticsearch.index.mapper.ObjectMapper$TypeParser.parseProperties(ObjectMapper.java:319) ~[elasticsearch-7.9.1.jar:7.9.1]
        at org.elasticsearch.index.mapper.ObjectMapper$TypeParser.parseObjectOrDocumentTypeProperties(ObjectMapper.java:237) ~[elasticsearch-7.9.1.jar:7.9.1]
        at org.elasticsearch.index.mapper.ObjectMapper$TypeParser.parse(ObjectMapper.java:210) ~[elasticsearch-7.9.1.jar:7.9.1]
        at org.elasticsearch.index.mapper.ObjectMapper$TypeParser.parseProperties(ObjectMapper.java:319) ~[elasticsearch-7.9.1.jar:7.9.1]
        at org.elasticsearch.index.mapper.ObjectMapper$TypeParser.parseObjectOrDocumentTypeProperties(ObjectMapper.java:237) ~[elasticsearch-7.9.1.jar:7.9.1]
        ...
        at org.elasticsearch.index.mapper.ObjectMapper$TypeParser.parse(ObjectMapper.java:210) ~[elasticsearch-7.9.1.jar:7.9.1]
        at org.elasticsearch.index.mapper.ObjectMapper$TypeParser.parseProperties(ObjectMapper.java:319) ~[elasticsearch-7.9.1.jar:7.9.1]
        at org.elasticsearch.index.mapper.ObjectMapper$TypeParser.parseObjectOrDocumentTypeProperties(ObjectMapper.java:237) ~[elasticsearch-7.9.1.jar:7.9.1]

處理

通過堆??梢钥闯鍪菍懭刖€程池[write]發(fā)生的Stackoverflow,并且可能是在解析mapping的過程發(fā)生的,通過ObjectMapper類推斷是Object類型數(shù)據(jù)寫入導致的。因此通過拉取集群內(nèi)所有索引的mapping,嘗試找出哪個索引的mapping有Object類型的字段,但結(jié)果沒能找到。
最后,因為這個集群的索引較少,我們通過簡單暴力的方法——二分查找停掉作業(yè)觀察集群狀態(tài),來找到問題索引。

問題排查

問題一

為什么會發(fā)生Stackoverflow?

棧溢出的堆棧發(fā)生在ES服務端處理客戶端的寫入請求時,在開啟dynamic mapping的情況下,如果寫入數(shù)據(jù)包含新的字段配置,需要解析字段配置,解析字段配置的邏輯是遞歸解析配置對應的JSON數(shù)據(jù),當字段類型為嵌套格式(Object/nested)時,遞歸的次數(shù)取決于用戶數(shù)據(jù)的嵌套層數(shù)。問題索引的數(shù)據(jù)嵌套層數(shù)過多導致,遞歸次數(shù)過多,進而導致棧溢出。

驗證:

測試寫入一條多層嵌套的數(shù)據(jù),結(jié)果中的代碼堆棧和現(xiàn)象中發(fā)生StackOverflowError的棧相同,出現(xiàn)了多次遞歸

{

    "o1":{
        "a":{
            "b":{
                "c":{
                    "d":{
                        "e":{
                            "f":{
                                "g":{
                                    "h":{
                                        "j":"ddd"
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}

代碼堆棧:
【ElasticSearch】索引數(shù)據(jù)mapping嵌套深度過大導致Stackoverflow問題排查,elasticsearch,jenkins,大數(shù)據(jù)
查看問題索引確實開啟了dynamic mapping,并且原始日志確實存在包含大量嵌套結(jié)構(gòu)的數(shù)據(jù)

問題二

為什么問題索引的mapping中不包含Object類型的字段?
異常堆棧的觸發(fā)時機為數(shù)據(jù)寫入解析mapping,此時還未將新的mapping更新為索引的mapping,由于解析mapping時發(fā)生了Stackoverflow導致ES進程crash,因此索引mapping沒有更新,自然問題索引的mapping中不包含Object類型的字段。

問題三

ES側(cè)有nested字段的深度限制(index.mapping.depth.limit),為什么沒攔截掉該消息?
該檢查在解析字段配置之后,解析字段時就發(fā)生了棧溢出,詳見下面的代碼

private synchronized Map<String, DocumentMapper> internalMerge(Map<String, CompressedXContent> mappings, MergeReason reason) {
        //...省略無關代碼...

            try {
                documentMapper =
                    documentParser.parse(type, entry.getValue(), applyDefault ? defaultMappingSourceOrLastStored : null); // 數(shù)據(jù)的mapping解析
            } catch (Exception e) {
                throw new MapperParsingException("Failed to parse mapping [{}]: {}", e, entry.getKey(), e.getMessage());
            }
        }

        return internalMerge(defaultMapper, defaultMappingSource, documentMapper, reason);// 這里會檢查mapping
    }

private synchronized Map<String, DocumentMapper> internalMerge(@Nullable DocumentMapper defaultMapper,
                                                                   @Nullable String defaultMappingSource, DocumentMapper mapper,
                                                                   MergeReason reason) {
        //...省略無關代碼...
        boolean hasNested = this.hasNested;
        Map<String, ObjectMapper> fullPathObjectMappers = this.fullPathObjectMappers;

        Map<String, DocumentMapper> results = new LinkedHashMap<>(2);

        if (defaultMapper != null) {
            if (indexSettings.getIndexVersionCreated().onOrAfter(Version.V_7_0_0)) {
                throw new IllegalArgumentException(DEFAULT_MAPPING_ERROR_MESSAGE);
            } else if (reason == MergeReason.MAPPING_UPDATE) { // only log in case of explicit mapping updates
                deprecationLogger.deprecatedAndMaybeLog("default_mapping_not_allowed", DEFAULT_MAPPING_ERROR_MESSAGE);
            }
            assert defaultMapper.type().equals(DEFAULT_MAPPING);
            results.put(DEFAULT_MAPPING, defaultMapper);
        }

            for (ObjectMapper objectMapper : objectMappers) {
            if (reason != MergeReason.MAPPING_RECOVERY) {
                checkTotalFieldsLimit(objectMappers.size() + fieldMappers.size() - metadataMappers.length
                    + fieldAliasMappers.size());
                checkFieldNameSoftLimit(objectMappers, fieldMappers, fieldAliasMappers);
                checkNestedFieldsLimit(fullPathObjectMappers);
                checkDepthLimit(fullPathObjectMappers.keySet()); // 檢查mapping的最大深度是打破閾值,是則拋出IllegalArgumentException
            }

            results.put(newMapper.type(), newMapper);
        }


        return results;
    }

解決方法

官方社區(qū)在v8.6修復了該問題,https://github.com/elastic/elasticsearch/issues/52098,我們使用的版本是ES7,需要升級或者打patch才能解決文章來源地址http://www.zghlxwxcb.cn/news/detail-775774.html

生產(chǎn)環(huán)境建議

  1. 最好不好開啟dynamic mapping功能,不僅影響性能,低版本還可能出現(xiàn)本文的問題
  2. 故障處理時可以考慮臨時增加日志,輔助問題排查。像這次問題如果在mapping解析的部分加上索引名或者字段信息輔助找到問題索引,故障時間將大幅縮短
  3. 版本迭代最好跟上社區(qū),很多問題社區(qū)都解決了
  4. 該問題排查還可以考慮開啟Transport tracer,打印出寫入請求日志,看看發(fā)生棧溢出之前的寫入的索引數(shù)據(jù)情況

到了這里,關于【ElasticSearch】索引數(shù)據(jù)mapping嵌套深度過大導致Stackoverflow問題排查的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!

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

領支付寶紅包贊助服務器費用

相關文章

  • Elasticsearch 創(chuàng)建索引mapping修改、修復

    背景:原始index名字是indexName,mapping設置錯誤,且已經(jīng)有數(shù)據(jù)進去,想要修改mapping結(jié)構(gòu) 返回結(jié)果:表示新建索引成功 下面表示把indexName的數(shù)據(jù)同步到indexName_1

    2024年02月11日
    瀏覽(27)
  • Elasticsearch8.8.0 SpringBoot實戰(zhàn)操作各種案例(索引操作、聚合、復雜查詢、嵌套等)

    Elasticsearch8.8.0 全網(wǎng)最新版教程 從入門到精通 通俗易懂 引入依賴 添加配置文件 application.yaml 導入ca證書到項目中 從任意一個es容器中,拷貝證書到resources目錄下 [外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-EXytUrDp-1691330960034)(media/16912196423122/16

    2024年02月13日
    瀏覽(29)
  • 深入理解Elasticsearch的索引映射(mapping)

    當我們談論Elasticsearch時,索引映射是一個核心概念,它定義了如何存儲和檢索數(shù)據(jù)。在Elasticsearch 7.6及更高版本中,映射提供了一系列強大的功能,使您能夠精確地控制數(shù)據(jù)的結(jié)構(gòu)和行為。本文將詳細介紹映射的關鍵屬性、用途以及如何正確設置和優(yōu)化它。 在Elasticsearch中,

    2024年02月22日
    瀏覽(39)
  • Elasticsearch學習-索引操作及Mapping映射

    在7.X版本前類似于關系型數(shù)據(jù)庫中的數(shù)據(jù)庫概念,8.X版本后刪除了type概念,索引類似于關系型數(shù)據(jù)庫中的表 相當于關系型數(shù)據(jù)庫中的一條數(shù)據(jù),最小單元 每一個節(jié)點就是一個ES實例(一個java進程),一個節(jié)點 != 一臺服務器 多個節(jié)點組成分布式系統(tǒng),ES原生分布式,已啟動一

    2023年04月22日
    瀏覽(23)
  • Elasticsearch索引優(yōu)化指南:分片、副本、mapping和analyzer

    Elasticsearch是一個開源的分布式搜索引擎,它的數(shù)據(jù)存儲和查詢速度非常快。然而,在面對大規(guī)模的數(shù)據(jù)集和高并發(fā)訪問時,Elasticsearch的性能也可能受到一些影響。為了最大程度地提高Elasticsearch的性能,我們需要對索引進行優(yōu)化。本篇博客將介紹Elasticsearch索引優(yōu)化的幾個關鍵

    2024年02月20日
    瀏覽(22)
  • Elasticsearch磁盤占用大于95% 導致索引自動置為只讀的解決方法

    應用系統(tǒng)在更新或者插入elasticsearch的時候報錯 看錯誤信息大意是要操作的索引是只讀的,不能進行插入或刪除。 原因是當Elasticsearch所在磁盤占用大于等于95%時,Elasticsearch會把所有相關索引自動置為只讀。(Elasticsearch官方文檔有介紹) 解決方案有兩種: 1.清理磁盤,使占用

    2024年02月06日
    瀏覽(29)
  • elementui 表單數(shù)據(jù)嵌套過深導致校驗不了問題解決

    在使用 elementui 表單校驗的過程中發(fā)現(xiàn)表單中存在嵌套多個層級的數(shù)據(jù)不能進行校驗。 elementui 中如果需要進行表單校驗,表單項的 prop 和 v-model 綁定的屬性值命名必須要是相同的。而對于多層級的嵌套屬性我們應該怎么表示呢? 只需要將表單對象后的字符串作為 prop 的值即

    2024年01月24日
    瀏覽(24)
  • Elasticsearch(ES)(版本7.x)創(chuàng)建索引報錯:Faile to parse mapping [_doc] Root mapping definition has unsupported

    Elasticsearch(ES)(版本7.x)創(chuàng)建索引報錯:Faile to parse mapping [_doc] Root mapping definition has unsupported

    Elasticsearch(ES)(版本7.x)創(chuàng)建索引報錯: 因es7.0版本之后不再需要type doc,把上面語句中的doc刪掉,再運行就可以創(chuàng)建索引了。 如果還需要type doc則需要增加include_type_name=true即可解決。 示例:

    2024年02月16日
    瀏覽(20)
  • ElasticSearch創(chuàng)建索引報錯:mapper_parsing_exception Root mapping definition has unsupported parameters

    ElasticSearch創(chuàng)建索引報錯:mapper_parsing_exception Root mapping definition has unsupported parameters

    ElasticSearch版本號:5.6.14,這個錯誤和ES版本有一定的關系,還是先交代下版本號,免得有的讀者根據(jù)我的方法操作后無效 錯誤翻譯: mapper_parsing_exception :映射解析異常 Root mapping definition has unsupported parameters :根映射定義包含不受支持的參數(shù) 錯誤映射語句1: 錯誤映射語句

    2024年02月11日
    瀏覽(23)
  • 【數(shù)據(jù)庫】哪些操作會導致索引失效

    【數(shù)據(jù)庫】哪些操作會導致索引失效

    ?? 個人博客: 個人主頁 ?? 個人專欄: 數(shù)據(jù)庫 ???? 功不唐捐,玉汝于成 目錄 前言 正文 結(jié)語 ?我的其他博客 ? 在數(shù)據(jù)庫管理中,索引的有效性對于查詢性能至關重要。然而,索引可能會因為各種操作而失效,從而影響到數(shù)據(jù)庫的性能和穩(wěn)定性。了解導致索引失效的常

    2024年02月19日
    瀏覽(22)

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

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

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

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

二維碼1

領取紅包

二維碼2

領紅包