logstash导入数据到Elasticsearch踩过的坑详解

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/LJFPHP/article/details/89340807

一、前言

      这篇主要记录在导入数据时候踩到的坑,这些坑总共花费我小一天的时间,记录一下。

二、正文

1、logstash显示在导入数据,ES也成功新建了索引,但是没数据

      最开始遇到的是这个坑,logstash的输入框就僵住了,博主以为在导入数据呢,等了半天,ES竟然什么数据都没,气够呛。改动配置什么的依然无效,最后还是看日志吧。

(1) 查看logstash的导入进度,发现每次都是导入一条就没了。

默认位置:logstash-6.2.4\data\plugins\inputs\file

(2) 查看ES的日志:/logs/elasticsearch.log

1)错误1:

	 Field [_type] is a metadata field and cannot be added inside a document. Use the index API request parameters.
	是_type字段的问题,更改_type为type,重新导入
	
2)错误2:

	[2019-04-09T15:30:49,233][DEBUG][o.e.a.b.TransportShardBulkAction] [test_access][2] failed to execute bulk item (index) BulkShardRequest [[test_access][2]] containing [32] requestsorg.elasticsearch.index.mapper.MapperParsingException: Field [_id] is a metadata field and cannot be added inside a document. Use the index API request parameters.

      后面一句的意思是,文档中不能包含_id字段,这个字段是ES的元数据字段。这里我们可使用id来代替试试。就这样看着ES的错误日志,有错就改,改着改着就能成功导入了。

2、ES中没有相关索引,导致不能导入数据的话

      我自己本地设置过这个东西,所以没注意,不过如果真的碰到这种情况,按下面的代码设置即可。网上看到一段话,对于ES来说,5.0以上需要设置自动创建index。所以设置ES:

PUT /_cluster/settings
{
    "persistent" : {
        "action": {
          "auto_create_index": "true"
        }
    }
}

kibanatools里面输入这个执行就好了。

3、除了导入错误的原因,导致导入失败之外,还有个可能,就是logstash默认不处理一天前的文件。

参考:https://blog.csdn.net/zhaoyangjian724/article/details/52274656
解决方案:
(1) 配置中,在inputfile处新增: ignore_older => 87400
(2) 修改我们要导入的数据,输入空行,或者新增一些数据,让文件的修改时间变成最新的

4、由于sincedb文件而引起的导入失败问题

      有时候导入失败的可能性是这个管道已经在一个点运行,从而生成一个sincedb 文件。这将导致针对同一文件的每次后续运行得出结论已经处理了数据。

方案:

sincedb_path => "/dev/null"
OR
#for Windows
sincedb_path => "NUL"

      这将禁用sincedb机制,并应在start_position: beginning每次运行时重新处理整个文件(因为您已添加)。这部分是看需求的,如果需要查看自己定义的sincedb_path文件来知道导入进度,那么最好还是不要禁用这个设置

================= Logstash 7.0 ==================================

1、logstash就停留在:

Successfully started Logstash API endpoint {:port=>9600}

首先按照之前的方案解决,发现没有作用,可能是logstash7.0的和之前的不一样吧。
(1) 如果你也出现相同的情况,那么请注意了,命令行显示success,代表stdin{}正在工作,那么此时,你要保证,你的配置文件的路径:
path => "E:\files\xx\xx.json" ,把反斜杠全部改成正斜杠, path => "E:/files/xx/xx.json" 然后删除sincedb文件,重新导入。你会发现,导入成功了,日
这个时候,我们打开elasticsearch-head,就会发现该索引下已经成功导入了数据,我的天。
(2) 需要注意,导入的文件也要有访问权限,如果文件无权限访问,那么自然logstash也无法读取导入
参考:https://discuss.elastic.co/t/stuck-at-successfully-started-logstash-api-endpoint-port-9600/155023

关于logstash的坑,我会持续补充在这篇博客。不说了,都是泪。

end

猜你喜欢

转载自blog.csdn.net/LJFPHP/article/details/89340807