Как импортировать большой JSON-файл в кластер Docker-swarm со стеком ELK? - PullRequest
0 голосов
/ 20 января 2019

В основном я хочу импортировать JSON-данные в (Logstash-> ElasticSearch->) Kibana, но я совершенно новичок и застрял в различных методах, которые я не до конца понимаю, и получаю ошибки или не выводлю.

У меня есть файл test.json, содержащий данные из Википедии в следующем формате:

{
"results": [
    {
        "curr": "Ohio_\"Heartbeat_Bill\"",
        "n": 43,
        "prev": "other-external",
        "type": "external"
    },
    {
        "curr": "Ohio_\"Heartbeat_Bill\"",
        "n": 1569,
        "prev": "other-search",
        "type": "external"
    },
    {
        "curr": "Ohio_\"Heartbeat_Bill\"",
        "n": 11,
        "prev": "other-internal",
        "type": "external"
    },
...

И так далее.Файл размером 1,3 МБ, потому что я удалил некоторые из самых больших примеров.

Я попробовал команду curl:

cat test.json |jq -c '. [] |{"индекс": {}}, .'|curl -XPOST localhost: 9200 / _bulk --data-binary @ -

и

curl -s -XPOST localhost: 9200 / _bulk --data-binary @test.json

и

написать "{" index ": {}}" в начале документа

Я такжепробовал:

curl -XPUT http://localhost:9200/wiki -d '
{
  "mappings" : {
    "_default_" : {
      "properties" : {
        "curr" : {"type": "string"},
        "n" : {"type": "integer"},
        "prev" : {"type": "string"},
        "type" : {"type": "string"}
      }
    }
  }
}
';

Но я всегда получаю эту ошибку:

{"error": "заголовок Content-Type [application / x-www-form-urlencoded] не являетсяподдерживается "," status ": 406}

Или когда я использую:

curl localhost: 9200 / wiki -H" Тип содержимого: application / json "-X POST -d @ test.json

Я получаю:

{"error": "Неверный HTTP-метод для uri [/ wiki] и метод [POST],позволено: [GET, HEAD, DELETE, PUT] "," status ": 405}

И когда я заменяю" wiki "на" _bulk ", как и во всех примерах, кажется, есть что-то общее,тогда я получаю:

{"error": {"root_cause": [{"type": "security_exception", "reason": "отсутствует токен аутентификации для запроса REST [/ _bulk»] "," header ": {" WWW-Authenticate ":" Basic realm = \ "security \" charset = \ "UTF-8 \" "}}]," type ":" security_exception "," reason ":"отсутствует токен аутентификации для запроса REST [/ _bulk] "," header ": {" WWW-Authenticate ":" Basic realm = \ "security \" charset = \ "UTF-8 \" "}}," status ": 401

У меня также есть скопированный и скорректированный, насколько я понял, файл conf в Kibana-Logstash-Pipeline, например:

input 
{
    file 
    {
        codec => multiline
        {
            pattern=> '^\{'
            negate=> true
            what=> previous
        }
        path => ["/home/user/docker-elastic/examples/pretty.json"]
        start_position => "beginning"
        sincedb_path => "/dev/null"
        exclude => "*.gz"
    }
}

filter 
{
    mutate
    {
        replace => [ "message", "%{message}}" ]
        gsub => [ 'message','\n','']
    }
    if [message] =~ /^{.*}$/ 
    {
        json { source => message }
    }
}

output
{ 
  elasticsearch {
        protocol => "http"
        codec => json
        host => "localhost"
        index => "wiki_json"
        embedded => true
    }

    stdout { codec => rubydebug }
}

Но когда я нажимаю «создать и развернуть», ничего не происходит.

Итак, я попробовал некоторые примеры, но, как я уже сказал, я не до конца их понимаю и поэтому испытываю проблемы с передачей своих данных в Кибану.Я написал Logstash и ElasticSearch, потому что я бы тоже хотел передать данные, используя их.

Может кто-нибудь объяснить мне, как я могу передать эти данные напрямую, без изменения файла вручную?Во многих ответах говорилось, что данные не могут быть переданы в структуре, которую я имею, но должны быть «одна строка, один вход» - только.Но я не могу вручную изменить весь файл, содержащий почти 40000 данных, и я не хотел бы писать для него скрипт на python ..

Может быть, есть инструмент или что-то еще?Или, может быть, я просто слишком глуп, чтобы понять синтаксис, и делаю что-то не так?

Любая помощь приветствуется!Заранее спасибо!

1 Ответ

0 голосов
/ 22 января 2019

Как ответил @Ian Kemp в разделе комментариев, проблема заключалась в том, что я использовал POST, а не PUT. После этого я получил сообщение о том, что аутентификация не удалась, поэтому я погуглил и получил окончательный ответ:

упругая скручиваемость: changeme @ localhost: 9200 / wiki -H "Тип контента: application / json" -X PUT -d @ test.json

с индексной строкой в ​​файле. Это структура того, как я, наконец, получил данные для Elasticsearch :) СПАСИБО ВАМ, Ян Кемп!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...