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。
然后查flume官方文档,才发现确实:
然后修改配置文件:
再次执行,没有报错了。