这里我遇到一个问题,我从Kafka源接收消息,并编写一个拦截器从kafka消息(json格式)中提取两个字段(dataSoure和businessType)。这里我使用的是gson.fromJson()。但问题是我得到了以下错误。
在这里,我想知道当Flume事件超过极限时Flume会截断它吗?如果是,如何将其设置为更大的值。因为我的kafka消息总是很长,大约60K字节。
期待回复。提前谢谢!
2015-12-09 11:48:05,665(PollableSourceRunner-KafkaSource-apply) [错误 - org.apache.flume.source.kafka.KafkaSource.process(KafkaSource.java:153)] KafkaSource EXCEPTION,{} com.google.gson.JsonSyntaxException: com.google.gson.stream.MalformedJsonException:未终止的字符串at 第1行第4096行 在com.google.gson.Gson.fromJson(Gson.java:809) 在com.google.gson.Gson.fromJson(Gson.java:761) 在com.google.gson.Gson.fromJson(Gson.java:710) at com.xxx.flume.interceptor.JsonLogTypeInterceptor.intercept(JsonLogTypeInterceptor.java:43) at com.xxx.flume.interceptor.JsonLogTypeInterceptor.intercept(JsonLogTypeInterceptor.java:61) at org.apache.flume.interceptor.InterceptorChain.intercept(InterceptorChain.java:62) 在org.apache.flume.channel.ChannelProcessor.processEventBatch(ChannelProcessor.java:146) 在org.apache.flume.source.kafka.KafkaSource.process(KafkaSource.java:130)
答案 0 :(得分:0)
最后,我通过调试源代码找到了根本原因。 因为我试图将event.getBody()转换为使用Gson的映射,这是不正确的,因为event.getBody()是一个byte [],而不是一个无法转换的String。正确的代码应如下所示:
String body = new String(event.getBody(), "UTF-8");
Map<String, Object> map = gson.fromJson(body, new TypeToken<Map<String, Object>>() {}.getType());