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官方文檔,才發現確實:

然後修改配置文件:

再次執行,沒有報錯了。