如何使用ELK堆栈将大JSON文件导入到Docker-swarm集群中?

时间:2019-01-20 17:28:41

标签: json docker elasticsearch kibana

基本上,我想将JSON数据导入到(Logstash-> ElasticSearch->)Kibana中,但是我是一个全新的人,并且陷入了不同的方法,我无法完全理解并得到错误或没有输出。

我得到的是一个文件test.json,其中包含以下格式的Wikipedia数据:

{
"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.3Mb,因为我已经删除了一些最大的示例。

我尝试了curl命令:

  

cat test.json | jq -c'。[] | {“ index”:{}},'。 | curl -XPOST本地主机: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"}
      }
    }
  }
}
';

但是我总是会收到此错误:

  

{“错误”:“不支持Content-Type标头[application / x-www-form-urlencoded]”,“状态”:406}

或者当我使用时:

  

curl localhost:9200 / wiki -H“ Content-type:application / json” -X POST -d @ test.json

我得到:

  

{“错误”:“ uri [/ wiki]和方法[POST]的HTTP方法不正确,允许:[GET,HEAD,DELETE,PUT]”,“状态”:405}

当我将“ wiki”替换为“ _bulk”时,就像所有示例似乎都具有共同点一样,那么我得到:

  

{“错误”:{“ root_cause”:[{“类型”:“ security_exception”,“原因”:“缺少REST请求[/ _bulk]的身份验证令牌”,“标头”:{“ WWW-Authenticate” :“基本领域= \”安全\“ charset = \” UTF-8 \“”}}],“类型”:“ security_exception”,“原因”:“缺少REST请求[/ _bulk]的身份验证令牌”,“标头”:{“ WWW-Authenticate”:“基本领域= \”安全\“字符集= \” UTF-8 \“”}},“状态”:401

我还按照我的理解来复制粘贴并进行了调整,就像这样:Kibana-Logstash-Pipeline中的conf文件,如下所示:

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 }
}

但是当我单击“创建并部署”时,没有任何反应。

因此,我尝试了一些示例,但是就像我说的那样-我不完全理解它们,因此很难将我的数据发送到Kibana。我已经编写了Logstash和ElasticSearch,因为我也想通过使用它们来传递数据。

有人可以向我解释一下,如何在不手动更改文件的情况下直接传递此数据吗?许多回答说,数据无法在我拥有的结构中传递,而只能是“一行,一个输入”。但是我不能用手更改将近40000个数据的整个文件,并且我不想为此编写一个python-script。

也许有工具之类的东西?也许我只是太愚蠢而无法理解语法,并且做错了什么?

感谢您的帮助! 先感谢您!

1 个答案:

答案 0 :(得分:0)

就像@Ian Kemp在评论部分中回答的那样,问题是我使用POST而不是PUT。之后,我收到一条错误消息,提示身份验证失败,因此我用谷歌搜索并得到了最终答案:

  

卷曲弹性:changeme @ localhost:9200 / wiki -H“内容类型:应用程序/ json” -X PUT -d @ test.json

,在文件中带有索引行。 这就是我最终如何将数据保存在Elasticsearch中的结构:) 非常感谢Ian Kemp!