У меня есть пример данных:
employee_name,user_id,O,C,E,A,N
Yvette Vivien Donovan,YVD0093,38,19,29,15,36
Troy Alvin Craig,TAC0118,34,40,24,15,34
Eden Jocelyn Mcclain,EJM0952,20,37,48,35,34
Alexa Emma Wood,AEW0655,25,20,18,40,38
Celeste Maris Griffith,CMG0936,36,13,18,50,29
Tanek Orson Griffin,TOG0025,40,36,24,19,26
Colton James Lowery,CJL0436,39,41,27,25,28
Baxter Flynn Mcknight,BFM0761,42,32,28,17,22
Olivia Calista Hodges,OCH0195,37,36,39,38,32
Price Zachery Maldonado,PZM0602,24,46,30,18,29
Daryl Delilah Atkinson,DDA0185,17,43,33,18,25
И файл конфигурации logstash как:
input {
file {
path => "/path/psychometric_data.csv"
start_position => "beginning"
}
}
filter {
csv {
separator => ","
autodetect_column_names => true
autogenerate_column_names => true
}
}
output {
amazon_es {
hosts => [ "https://xxx-xxx-es-xxx.xx-xx-1.es.amazonaws.com:443" ]
ssl => true
region => "ap-south-1"
index => "psychometric_data"
}
}
Я ожидаю 1-ю строку (т. е. employee_name, user_id, O, C, E, A, N) в качестве имени поля Elasticsearch (заголовок), но я получаю 3-ю строку (т. е. Трой Элвин Крейг, TAC0118,34,40,24, 15,34) в качестве заголовка следующим образом.
{
"_index": "psychometric_data",
"_type": "_doc",
"_id": "md4hm3YB8",
"_score": 1,
"_source": {
"15": "21",
"24": "17",
"34": "39",
"40": "37",
"@version": "1",
"@timestamp": "2020-12-25T18:20:00.759Z",
"message": "Ishmael Mannix Velazquez,IMV0086,22,37,17,21,39\r",
"path": "/path/psychometric_data.csv",
"Troy Alvin Craig": "Ishmael Mannix Velazquez",
"host": "xx-ThinkPad-xx",
"TAC0118": "IMV0086"
}
}
Что может быть причиной этого?
Если вы установите для autodetect_column_names
значение true, фильтр интерпретирует первую строку, которую он видит, как имена столбцов. Если для pipe.workers задано более одного значения, то возникает гонка за тем, какой поток первым устанавливает имена столбцов. Поскольку разные рабочие процессы обрабатывают разные строки, это означает, что он может не использовать первую строку. Вы должны установить для pipe.workers значение 1.
Кроме того, механизм выполнения Java (включенный по умолчанию) не всегда сохраняет порядок событий. В logstash.yml есть параметр pipe.ordered, который управляет этим. В версии 7.9 сохраняется порядок событий, если для параметра pipe.workers установлено значение 1.
Вы не говорите, какая у вас версия. Для всего от 7.0 (когда java_execution стало значением по умолчанию) до 7.6 исправление состоит в том, чтобы отключить движок java, используя либо pipeline.java_execution: false
в logstash.yml, либо --java_execution false
в командной строке. Для любого выпуска 7.x, начиная с 7.7 и выше, убедитесь, что для параметра pipe.ordered установлено значение auto или true (автоматическое значение по умолчанию в 7.x). В будущих выпусках (возможно, 8.x) pipe.ordered по умолчанию будет иметь значение false.