Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/366.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在flink流媒体中使用grok_Java_Serialization_Apache Flink_Grok_Flink Streaming - Fatal编程技术网

Java 在flink流媒体中使用grok

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>() {

Flink管道如下所示:

  • 阅读卡夫卡主题中的消息(字符串)
  • 通过grok转换为json格式进行模式匹配
  • 从json提取的字段上的时间窗口聚合
  • 下面是使用grok进行模式匹配的代码

        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序列化程序,或者自己实现(反)序列化。
    ——我对如何实现同样的操作有点困惑。