FLINK + Redisのリアルタイム早期警戒

 

人口の配当をカットしたようにゆっくりと、インターネット製品ますます熾烈に戦って、私たちは、ユーザーをつかむために最初のインセンティブと他の政策ショッピング、新しいインセンティブを通じてプルに興味深い見出しや他のメーカー、戦いの多くは、市場の可能性について楽観的に沈み始め、育ちます。他のメーカーは、それぞれが続いているにもユーザーを引き付けるためのインセンティブと他のポリシーを読み、新しいインセンティブを描画することによって、そのよう今日のヘッドラインスピードバージョン、テンセントニュースエクストリーム・エディションとして、製品の独自の高速版を立ち上げました。

APPのこのタイプのため、リアルタイムのリスク管理が不可欠であり、より一般的なシナリオは、抗浮気ブラシインタフェースリアルタイムリスク管理です。ブラシインタフェースは不正行為ブラック生産され、APPに対する各種操作、一般に背景のインターフェースに対応して、ユーザは、ブラック収率が新しいAPPをクラッキングして得られる場合APPデータは、背景へのインターフェースによって報告される動作しますユーザーインターフェースを向上させる、彼らは利益のために偽のデータを構築着陸APPステップバックトーンインターフェイスに直接スキップすることができるようになります。ビジネスのこのタイプのために、私たちはFLINK + Redisのことでリアルタイムアンチブラシ機能のインターフェースを実現することができます。データフロー図を以下に示します。

 

 

 

インタフェースは、一般的にサーバー側を送信するために着陸を越えAPP操作、直接データ転送インタフェースをブラシに浮気され、これらのユーザーはAPPには存在しませんが、ログ内で報告し、その後、我々はFLINKはRedisのは、新しいユーザーを書き込み、APPリアルタイムに報告し、その後することができます比較のためにユーザにRedisのアップレポートインターフェイスサーバ側ユーザブラシRedisのユーザーインターフェースがない場合、それが判断されます。

この需要のために、それは、ミリ秒の遅延を達成することができ、リアルタイムの計算エンジンが必要な場合がありますそれ以外の場合は、ユーザーの誤判定の原因となりますし、ユーザーエクスペリエンスに影響を与えます。このような理由から、私たちは、リアルタイム計算エンジンとしてFLINKを選択しました。

コードの主なロジックは以下の通り:

//配置flink运行环境
val env = StreamExecutionEnvironment.getExecutionEnvironment
//val env = StreamExecutionEnvironment.createLocalEnvironment()
env.enableCheckpointing(1000 * 60 * 5)
env.getCheckpointConfig.setCheckpointingMode(CheckpointingMode.AT_LEAST_ONCE)
env.getCheckpointConfig.setMinPauseBetweenCheckpoints(1000 * 60 * 3)
env.getCheckpointConfig.setMaxConcurrentCheckpoints(1)
env.setStateBackend(new FsStateBackend(checkPointPath))
env.getConfig.setLatencyTrackingInterval(1000)
env.getConfig.registerTypeWithKryoSerializer(classOf[Log], classOf[ProtobufSerializer])
env.setStreamTimeCharacteristic(EventTime)
env.setParallelism(parallel)
env.getConfig.setLatencyTrackingInterval(1000)

//kafka source,实时消费kafka中日志解析出用户id
val stream = env.addSource(new FlinkKafkaConsumer010[Array[Log]](topic, new LogDeserializationSchema(), properties))
val data = stream.flatMap(x => x)
  .map(log =>{
    val userid = log.getUid.getUuid
    val current_time = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())
    (userid,current_time)
  }).filter(record=>{
  val userid = record._1
  var flag = false
  if(userid != null && !"".equals(userid)){
    flag = true
  }
  flag
})

//redis sink,将APP上报日志的用户id写入redis供server端匹配
data.addSink(new RedisSink[(String, String)](getJedisClusterConfig, new RedisSinkMapper))
env.execute("newsinfo_active_userid_to_redis")

より重要なポイントの一つ。

1 构造kafka source

val stream = env.addSource(new FlinkKafkaConsumer010[Array[Log]](topic, new LogDeserializationSchema(), properties))

すべてのシリアル化されたデータは、APP一般で報告された、我々は抗シーケンスメソッドを定義する必要があり、LogDeserializationSchemaは抗シーケンス法のいるProtobufタイプです。

//将kafka中的数据解析为google protobuf 的Log,一个message可能包含多条Log
class LogDeserializationSchema extends AbstractDeserializationSchema[Array[Log]] {
  override def deserialize(message: Array[Byte]): Array[Log] = {
    val data = ArrayBuffer[Log]()
    val input = new ByteArrayInputStream(message)
    while (input.available() > 0) {
      try {
        data += Log.parseDelimitedFrom(input)
      } catch {
        case _: Throwable =>
      }
    }
    input.close()
    data.toArray
  }
}

2つのRedisのシンク

ここでは、オンラインオープンソースの依存ライブラリをFLINK-コネクタは、Redisのです。
詳細は、以下を参照してください。http://bahir.apache.org/docs/flink/current/flink-streaming-redis

Mavenの依存性は、以下の

<dependency>
    <groupId>org.apache.bahir</groupId>
    <artifactId>flink-connector-redis_2.11</artifactId>
    <version>1.1-SNAPSHOT</version>
</dependency>

シンクRedisのクラスのRedisにデータを送信するためのインタフェースを提供します。受信機は、通信の異なるタイプの3つの異なる方法Redisの環境を使用することができる:
単一のサーバRedisの
Redisのクラスタが
センチネルRedisの

RedisのSinkコアクラスはRedisMappeは、我々は独自のオペレーティングRedisのクラスが実装このインタフェースの3つのメソッドを書くときに以下のように、使用したいというのインタフェースです。

class RedisExampleMapper extends RedisMapper[(String, String)]{
  override def getCommandDescription: RedisCommandDescription = {
    new RedisCommandDescription(RedisCommand.HSET, "HASH_NAME")
  }

  override def getKeyFromData(data: (String, String)): String = data._1

  override def getValueFromData(data: (String, String)): String = data._2
}
val conf = new FlinkJedisPoolConfig.Builder().setHost("127.0.0.1").build()
stream.addSink(new RedisSink[(String, String)](conf, new RedisExampleMapper))

そしてRedisCommand対応関係設定データ構造タイプを使用して構造をRedisの。

おすすめ

転載: www.cnblogs.com/pengblog2020/p/12172540.html