在测试代码中发现taildir不支持windows。且要上传很多小文件并记录文件名字。
使其支持windows很多大佬已经做到,我也是站在巨人的肩膀上,copy他们的。
这里记录修改taildir使其支持windows路径
- 在不断的了解flume机制的同时发现了根本问题,hdfs路径不支持冒号作为路径
因为我们获取到的fileHeaderKey 是绝对路径,所以是有冒号的
fileHeader 设置为 true ,可以将日志文件的绝对路径存储在事件的header中;
fileHeaderKey 目前来说不需要设置,它指定了存储在header中路径的key 名(header中是以key-value对存储),默认为 file。
例如:Event: { headers:{timestamp=1452581700000, file=D:flume32-FGD1SAN-5-25UNIT1.log} body: 32 30 31 36 2F 30 31 2F 31 32 20 31 34 3A 35 35 2016/01/12 14:55 }
因为hdfsSink可以直接从事件的header中读取字串作为hdfs文件名的一部分,可以通过将日志文件名添加至header中来实现。
通过debug flume的源码 (ReliableTaildirEventReader) 发现fileHeaderKey返回的是绝对路径的所有,那我们只需要把D:去掉就行了,以及把“”转换成“/”。
修改后代码
Map
if (annotateFileName || (headers != null && !headers.isEmpty())) {
for (Event event : events) {
if (headers != null && !headers.isEmpty()) {
event.getHeaders().putAll(headers);
}
if (annotateFileName) {
//源码
// event.getHeaders().put(fileNameHeader,
// currentFile.getPath();
//修改后
event.getHeaders().put(fileNameHeader,
currentFile.getPath().substring(2).replaceAll("\\", "/"));
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)