繁体   English   中英

如何使用Flink流处理复杂协议的数据流

[英]How to use Flink streaming to process Data stream of Complex Protocols

我正在使用Flink Stream来处理3G网络(GPRS隧道协议)中的数据流量日志。 而且我在用户的用户会话中的信息合成中遇到麻烦。

例如:如何映射开始和结束一个会话。 我不知道是否有Flink流媒体适合处理这样的复杂协议?

p / s:
我们捕获3G网络中SGSN和GGSN之间的数据交换(将GTP协议与GTP-C / U消息一起使用)。 当SGSN发送CreateReq(TEID,Seq,IMSI,TEID_dl,TEID_data_dl)消息并且GGSN响应CreateRsp(TEID_dl,Seq,TEID_ul,TEID_data_ul)消息时,会话开始 建立会话后,从SGSN发送到GGSN的其他GTP-C消息(例如:UpdateReq,DeleteReq)使用TEID_ul,响应消息使用TEID_dl,GTP- U消息使用TEID_data_ul(SGSN-> GGSN)和TEID_data_dl(GGSN-> SGSN )。 GTP-U消息包含诸如AppID(facebook,twitter,web),url,...等信息。
最后,我想处理连续的日志数据流,并映射同一用户(IMSI)的GTP-C消息和GTP-U进行报告。

我已经试过了:

val sessions = createReqs.connect(createRsps).flatMap(new CoFlatMapFunction[CreateReq, CreateRsp, Session] {
  // holds CreateReqs indexed by (tedid_dl,seq)
  private val createReqs = mutable.HashMap.empty[(String, String), CreateReq]
  // holds CreateRsps indexed by (tedid,seq)
  private val createRsps = mutable.HashMap.empty[(String, String), CreateRsp]


  override def flatMap1(req: CreateReq, out: Collector[Session]): Unit = {
    val key = (req.teid_dl, req.header.seqNum)
    val oRsp = createRsps.get(key)
    if (!oRsp.isEmpty) {
      val rsp = oRsp.get
      println("OK")
      out.collect(new Session(rsp.header.time, req.imsi, req.teid_dl, req.teid_ddl, rsp.teid_upl, rsp.teid_dupl, req.rat, req.apn))
      createRsps.remove(key)
    } else {
      createReqs.put(key, req)
    }
  }

  override def flatMap2(rsp: CreateRsp, out: Collector[Session]): Unit = {
    val key = (rsp.header.teid, rsp.header.seqNum)
    val oReq = createReqs.get(key)

    if (!oReq.isEmpty) {
      val req = oReq.get
      out.collect(new Session(rsp.header.time, req.imsi, req.teid_dl, req.teid_ddl, rsp.teid_upl, rsp.teid_dupl, req.rat, req.apn))
      createReqs.remove(key)
    } else {
      createRsps.put(key, rsp)
    }
  }
}).print()


此代码始终返回空结果。 输入流包含同一会话的CreateRsp和CreateReq消息的事实。 它们看起来非常靠近(在1秒内)。 当我调试时, oReq.isEmpty ==每次都是true 我做错了什么?

老实说,这里很难看清电信公司的具体情况,但是如果我理解正确,您至少有3个流,前两个是CreateReqCreateRsp流。

为了检测会话的建立,我将使用ConnectedDataStream抽象在上述两个流之间共享状态。 查看此示例以了解用法或相关的Flink文档

这是您要达到的目标吗?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM