flume读取json格式的log文件写入hive表,趟坑记录

flume 读取log日志文件,写hive表

注意:

hive创建桶表

flume读取文件,按行读取,默认行最大值为2048个长度,过长会截取。

测试阶段,注意删除写入文件目录(spoolDir)、checkpoint目录、写入的hive表记录,避免历史数据对结果的影响;

 

 

如果不是桶表:异常报错如下

Unexpected end-of-input in VALUE_STRING

 

由于要处理的log日志每条记录是以json形式存储,然后Agent.sink.hive.serializer = JSON 解析json,写入hive表。最开始找到的报错信息是

json解析异常:

[DEBUG - org.apache.hive.hcatalog.data.JsonSerDe.deserialize(JsonSerDe.java:178)] 
org.codehaus.jackson.JsonParseException: 

Unrecognized token 'nWsj1W3Zzy': was expecting 'null', 'true', 'false' or NaN
 at [Source: [email protected]; line: 1, column: 21]

Unexpected end-of-input in VALUE_STRING

failed : Unable to convert byte[] record into Object  :

然后发现日志每行信息被截取了,json格式错误,导致无法解析;最初没有想到是flume截取的每行数据,以为是hive处理的时候过长有什么操作,按错误发生在sink端处理的一直找不到原因

百度多了,量变达到效果,发现了有写flume会截取过长的信息

flume在收集log的时候经常会出现Line length exceeds max (2048), truncating line!,这个一般情况对于一些log的存储没影响,但是遇到需要解析log的情况就有问题了,有时一个json或者其他格式的log被截断了,解析也会出问题,所以在source的属性配置里可以通过参数deserializer.maxLineLength调高默认的2048。

发现位置:  https://www.cnblogs.com/51python/p/10894852.html

然后查flume官方文档,才发现确实:

然后修改配置文件:

再次执行,没有报错了。