FIELDDATA Данные слишком велики

Я открываю кибану и выполняю поиск, и я получаю ошибку, где осколки не сработали. Я просмотрел файл elasticsearch.log, и я увидел эту ошибку:

org.elasticsearch.common.breaker.CircuitBreakingException: [FIELDDATA] Data too large, data for [@timestamp] would be larger than limit of [622775500/593.9mb]

Есть ли способ увеличить этот предел в 593.9mb?

Ответ 1

Вы можете увеличить ограничение fielddata > до 75% (по умолчанию 60%) в конфигурационном файле elasticsearch.yml и перезапустить ваш кластер:

indices.breaker.fielddata.limit: 75%

Или, если вы предпочитаете не перезапускать кластер, вы можете изменить настройку динамически, используя:

curl -XPUT localhost:9200/_cluster/settings -d '{
  "persistent" : {
    "indices.breaker.fielddata.limit" : "40%" 
  }
}'

Попробуйте.

Ответ 2

Я тоже сталкиваюсь с этой проблемой. Затем я проверяю память поля данных.

используйте ниже запрос:

GET /_stats/fielddata?fields=*

выходной дисплей:

"logstash-2016.04.02": {
  "primaries": {
    "fielddata": {
      "memory_size_in_bytes": 53009116,
      "evictions": 0,
      "fields": {

      }
    }
  },
  "total": {
    "fielddata": {
      "memory_size_in_bytes": 53009116,
      "evictions": 0,
      "fields": {

      }
    }
  }
},
"logstash-2016.04.29": {
  "primaries": {
    "fielddata": {
      "memory_size_in_bytes":0,
      "evictions": 0,
      "fields": {

      }
    }
  },
  "total": {
    "fielddata": {
      "memory_size_in_bytes":0,
      "evictions": 0,
      "fields": {

      }
    }
  }
},

вы можете видеть мои индексы по имени base datetime, а evictions равны 0. Кроме того, 2016.04.02 память - 53009116, но 2016.04.29 - также 0.

поэтому я могу сделать вывод, что старые данные занимают всю память, поэтому новые данные не могут использовать их, а затем, когда я делаю agg запрос новых данных, это вызывает CircuitBreakingException

Вы можете установить config/asticsearch.yml

indices.fielddata.cache.size:  20%

он может вытеснить данные, когда достигнет предела памяти.

но может быть реальным решением, вы должны добавить свою память в furture. и контролировать использование памяти полевых данных - это хорошие привычки.

более подробно: https://www.elastic.co/guide/en/elasticsearch/guide/current/_limiting_memory_usage.html

Ответ 3

Альтернативное решение для CircuitBreakingException: [FIELDDATA] Data too large ошибка данных - очистка старого/неиспользуемого кэша FIELDDATA.

Я обнаружил, что fielddata.limit распределяется между индексами, поэтому удаление кеша неиспользуемого индекса/поля может решить проблему.

curl -X POST "localhost:9200/MY_INDICE/_cache/clear?fields=foo,bar"

Для получения дополнительной информации https://www.elastic.co/guide/en/elasticsearch/reference/7.x/indices-clearcache.html

Ответ 4

Я думаю, что важно понять, почему это происходит в первую очередь.

В моем случае у меня была эта ошибка, потому что я выполнял агрегации в "analyzed". Если вам действительно нужно, чтобы ваше строковое поле было analyzed, вам следует рассмотреть возможность использования multifields и сделать его analyzed для поиска и not_analyzed для агрегаций.

Ответ 5

Я столкнулся с этим вопросом на днях. В дополнение к проверке памяти fielddata, я бы также рассмотрел возможность проверки JVM и OS-памяти. В моем случае администратор забыл изменить ES_HEAP_SIZE и оставил его на 1gig.

Ответ 6

просто используйте:

ES_JAVA_OPTS="-Xms10g -Xmx10g" ./bin/elasticsearch

так как куча по умолчанию 1G, если ваши данные большие, вы должны установить их больше