Flink Streaming:由控制流控制的数据流

时间:2017-01-06 17:31:46

标签: apache-flink flink-streaming

我有一个问题是这个问题的变体:Flink: how to store state and use in another stream?

我有两个流:

  1. string fil = @"‪D:\\vish1_vish.txt"; FileStream fs = new FileStream(File, FileMode.Create,FileAccess.Write);
  2. val ipStream: DataStream[IPAddress] = ???
  3. 我想找出哪个包使用哪个路径。通常可以通过以下方式完成:

    val routeStream: DataStream[RoutingTable] = ???

    这里的问题是我无法真正在这里键入流,因为这需要完整的表和ip地址(并且键必须被隔离计算)。

    对于val ip = IPAddress("10.10.10.10") val table = RoutingTable(Seq("10.10.10.0/24", "5.5.5.0/24")) val route = table.lookup(ip) // == "10.10.10.0/24" 中的每个元素,我需要最新的ipStream元素。现在我正在使用一个黑客,所有这些都是非并行处理的:

    routeStream

    这听起来像广播策略的用例。但是,routeStream将更新,并且不会在文件中修复。问题仍然存在:有没有办法拥有两个流,其中一个流包含其他流的更改控制数据?

1 个答案:

答案 0 :(得分:2)

既然我解决了这个问题,我也可以在这里写一个答案:)

我按这样键入了两个流:

  1. 使用网络路由的第一个字节
  2. 键入RoutingTable流
  3. IPAddress也被地址的第一个字节
  4. 键入

    这是在IP包通常在网络中使用相同的/ 8前缀进行路由的情况下工作的,这可以假设大多数流量。

    然后,通过使有状态orderState可以将路由表状态构建为密钥。收到新的IP包时,请在路由表中进行查找。现在有两种可能的情况:

    1. 未找到匹配的路线。我们可以将这个包存放在这里,但是丢弃它也可以。
    2. 如果找到路由,则输出[IPAddress,RoutingTableEntry]的元组。
    3. 这样,我们有两个流,其中一个流改变了另一个流的控制数据。