簡體   English   中英

如何使用ELK堆棧將大JSON文件導入到Docker-swarm集群中?

[英]How to import a big JSON-file to a Docker-swarm cluster with ELK stack?

基本上,我想將JSON數據導入到(Logstash-> ElasticSearch->)Kibana中,但是我是一個全新的人,並且陷入了不同的方法,我無法完全理解並得到錯誤或沒有輸出。

我得到的是一個文件test.json,其中包含以下格式的Wikipedia-data:

{
"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命令:

貓test.json | jq -c'。[] | {“ index”:{}},'。 | curl -XPOST本地主機:9200 / _bulk --data-binary @-

curl -s -XPOST本地主機: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本地主機:9200 / wiki -H“內容類型:應用程序/ 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”:“基本realm = \\“ security \\” charset = \\“ UTF-8 \\”“}}],” type“:” security_exception“,” reason“:”缺少REST請求[/ _bulk]的身份驗證令牌“,” header“: {“ 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。

也許有什么工具? 或者,也許我太愚蠢,無法理解語法並且做錯了什么?

任何幫助表示贊賞! 先感謝您!

就像@Ian Kemp在評論部分回答的一樣,問題是我使用POST而不是PUT。 之后,我收到一條錯誤消息,提示身份驗證失敗,因此我用谷歌搜索並得到了最終答案:

curl elastic:changeme @ localhost:9200 / wiki -H“內容類型:application / json” -X PUT -d @ test.json

與文件中的索引行。 這就是我最終如何在Elasticsearch中獲得數據的結構:)非常感謝Ian Kemp!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM