Java 在flink流媒体中使用grok
Flink管道如下所示:Java 在flink流媒体中使用grok,java,serialization,apache-flink,grok,flink-streaming,Java,Serialization,Apache Flink,Grok,Flink Streaming,Flink管道如下所示: 阅读卡夫卡主题中的消息(字符串) 通过grok转换为json格式进行模式匹配 从json提取的字段上的时间窗口聚合 下面是使用grok进行模式匹配的代码 SingleOutputStreamOperator<JSONObject> mainStream = messageStream.rebalance() .map(new MapFunction<String, JSONObject>() {
SingleOutputStreamOperator<JSONObject> mainStream = messageStream.rebalance()
.map(new MapFunction<String, JSONObject>() {
private static final long serialVersionUID = 6;
@Override
public JSONObject map(String value) throws Exception {
JSONObject logJson = new JSONObject();
grok.compile(pattern); //pattern is some pattern defined in the class
Match gm = grok.match(value);
gm.captures();
logJson.putAll(gm.toMap());
return logJson;
}})
SingleOutputStreamOperator主流=messageStream.rebalance()
.map(新的映射函数(){
私有静态最终长serialVersionUID=6;
@凌驾
公共JSONObject映射(字符串值)引发异常{
JSONObject logJson=新的JSONObject();
grok.compile(pattern);//pattern是类中定义的某种模式
匹配gm=总匹配(值);
通用汽车公司();
logJson.putAll(gm.toMap());
返回logJson;
}})
在上面的代码中,在map函数内部编写grok.compile(pattern)
工作正常。不这样做会导致以下错误
MapFunction的实现不可序列化
原因:java.io.NotSerializableException:com.google.code.regexp.Pattern
是否有任何方法可以在地图之外删除grok.compile。根据我的理解,不需要编译包含每条消息的模式,如果消息数量变得相当大,可能会造成瓶颈
附言:我已经进口了oi.thekraken.grok.api.grok的包装
编辑:
我查看了grok实现,grok类实现了Serializable。
您的代码没有显示局部变量grok的来源,但是: Flink要求所有操作符都可以序列化,因为它们可能在集群中移动。这也适用于操作符的所有成员。你能发布一个完整的非工作示例吗?这样可以更容易地查看序列化可能失败的位置 有关flink序列化的更多信息,请访问flink文档 及 基本上,如果需要不可直接序列化的运算符成员,可以为自定义类型注册kryo序列化程序,或者自己实现(反)序列化
顺便说一句:我认为您试图减少模式的编译次数是正确的您的代码没有显示局部变量grok的来源,但是: Flink要求所有操作符都可以序列化,因为它们可能在集群中移动。这也适用于操作符的所有成员。你能发布一个完整的非工作示例吗?这样可以更容易地查看序列化可能失败的位置 有关flink序列化的更多信息,请访问flink文档 及 基本上,如果需要不可直接序列化的运算符成员,可以为自定义类型注册kryo序列化程序,或者自己实现(反)序列化
顺便说一句:我认为您尝试减少模式编译次数是正确的。
基本上,如果您需要不可直接序列化的运算符成员,您可以为自定义类型注册一个kryo序列化程序,或者自己实现(反)序列化。
--我对如何做这件事有点困惑。基本上,如果需要不可直接序列化的运算符成员,您可以为自定义类型注册kryo序列化程序,或者自己实现(反)序列化。
——我对如何实现同样的操作有点困惑。