Optimización elástica del rendimiento de la búsqueda
En el capítulo CRUD, ya sabemos cómo funciona la escritura de datos en ES. Los lectores a quienes les gusta hacerlo ellos mismos pueden estar ansiosos por escribir sus propios programas y comenzar a escribir datos en es para probarlos. En este momento, encontrará que la velocidad de ejecución del programa es muy normal. Incluso si el servicio ES se está ejecutando en esta máquina, puede escribir cientos de datos en un segundo.
Esta velocidad obviamente no es el límite de ES. De hecho, cada dato tiene que pasar por una solicitud HTTP POST completa y ESINDING, lo que supone una gran pérdida de rendimiento. Por lo tanto, ES diseñó un método de envío por lotes. Se llama interfaz mget en lectura de datos e interfaz por lotes en cambio de datos. Mget se utiliza generalmente para obtener conjuntos de resultados intermedios en lotes entre nodos es durante las búsquedas. Para los usuarios de Elastic Stack, la interfaz por lotes es más común.
La interfaz por lotes adopta un formato de acumulación de datos relativamente simple. El ejemplo es el siguiente:
El formato consiste en agregar un meta JSON descriptivo a cada dato JSON para indicar el tipo de operación. la siguiente fila de datos, información del índice de atribución, etc.
La razón por la que se utiliza este formato en lugar del formato de matriz JSON general es porque el nodo ES que recibe la solicitud por lotes puede procesar directamente el JSON corto línea por línea sin la necesidad de un análisis completo de la matriz JSON, por lo que Determine a qué nodo de datos se reenvía la siguiente fila de datos JSON. De esta manera, se puede reutilizar un espacio de búfer de red de tamaño de memoria fijo y la JVM ahorra una gran cantidad de GC.
De hecho, logstash, rsyslog y spark a nivel de producto utilizan interfaces por lotes para la escritura de datos de forma predeterminada. Para los lectores que planean escribir sus propios programas, se recomienda utilizar las bibliotecas Search::Elasticsearch::Bulk de Perl o elasticsearch.helpers.* de Python.
Al configurar datos por lotes, normalmente es necesario prestar atención al tamaño del lote solicitado.
Aquí hay una contradicción en los detalles. Sabemos que las solicitudes HTTP pueden enviar datos continuamente con el código de estado HTTP 100 Continuar. Sin embargo, para la longitud del contenido del cuerpo de la solicitud HTTP recibida por el nodo ES, se calcula en función del tamaño completo. Entonces, primero asegúrese de que los datos del lote no excedan el progreso de records/elastic/elasticsearch/pull/21626.
(Fin de este artículo)
El texto está compilado por la guía autorizada de ELKstack.