愚者求师之过,智者从师之长。

logstash无法读取spark on yarn的app的各个container目录下的日志文件

Logstash | 作者 shwtz | 发布于2018年03月13日 | 阅读数:3896

经过调查发现,我这边配置的logstash的file input为从别的服务器上同步过来的yarn的app的日志目录:
/data/log/hadoop/application_xxxxxxxxxx_xxxx/container_xxxxxx_xxxxx_xxxxx/*
 
有3种文件:stderr,stdout,syslog。
 
在logstash机器上,配置文件的目录是/data/logs/hadoop/[node]/apps/app_xxxxx/con_xxxxxx/*
因为每个文件的格式不一样,3个文件对应3个不同的conf。
syslog在conf中路径写为:
path => [
            "/data/logs/hadoop/*/apps/*/*/syslog"
        ]
 
在该服务器上用ll命令可以显示以上目录的日志文件。
而实际运行logstash的时候,同步过来的文件全部都不读取。
 
我测试了很多次,发现如果我自己在logstash的服务器上,手动创建比如/data/logs/hadoop/[node]/apps/app_01/con_01/syslog这样的文件,在文件中追加和同步过来的一样的内容,logstash将会正常读取这个文件的记录。
但是如果创建目录名长度几乎一样,比如
/data/logs/hadoop/data1/apps/application_1518376079245_11087/container_1518376079245_11087_01_000099/syslog
这样很长的文件,在其中追加正常的日志内容,logstash不会读取。
 
我的结论是:目录过长,logstash不读取,因为app id和container id太长了。短的话可以正常读取。
 
不知道怎么解决这个问题,因为我需要在logstash的配置中解析app id和container id,所以必须保留这2个id在目录中:
match => { "path" => "hadoop/%{DATA:node}/apps/%{DATA:app_id}/%{DATA:container_id}/syslog" }
 
但是确实因为id太长,logstash不读取这个文件,要把文件挪到别的目录才行,如何解决呢?
 
也许我的结论是错的,希望大神指正!
已邀请:

shwtz - 学物理想做演员的IT男

赞同来自: lianjie

我自己找到了原因:yarn生成的日志目录权限是711,用root用户同步到logstash服务器也 还是711的目录,用户和用户组都是hadoop用户,这样的话,logstash就不具有读取目录的权限,所以没法读取。
 
一时的解决方法是同步之前将yarn的服务器的日志目录全部改成755的权限。
 
遗留问题:新生成的日志文件目录依然是711的权限,所以用sersync同步日志文件的时候会报错:
inotify_add_watch error: No such file or directory
 
这个错其实一早就有, 我之前一直不知道原因,现在想来,应该就是权限问题,因为我是用root用户同步的。

要回复问题请先登录注册