开发者社区 > 大数据与机器学习 > 实时计算 Flink > 正文

flink支持按不同粒度(1min、1hour、1day) 统计直播观看人数,应该怎么设计?

flink支持按不同粒度(1min、1hour、1day) 统计直播观看人数,应该怎么设计?

展开
收起
游客6vdkhpqtie2h2 2022-09-17 10:55:40 652 0
13 条回答
写回答
取消 提交回答
  • 公众号:网络技术联盟站,InfoQ签约作者,阿里云社区签约作者,华为云 云享专家,BOSS直聘 创作王者,腾讯课堂创作领航员,博客+论坛:https://www.wljslmz.cn,工程师导航:https://www.wljslmz.com

    针对这个问题,可以设计如下的实现思路:

    1. 首先,在Flink中使用DataStream API或Table API读取实时直播观看数据。

    2. 然后,使用窗口操作将数据分组并聚合。

      a. 对于1分钟的统计,可以使用TumblingEventTimeWindows或TumblingProcessingTimeWindows窗口,并将窗口长度设置为1分钟。

      b. 对于1小时的统计,可以使用SlidingEventTimeWindows或SlidingProcessingTimeWindows窗口,并将窗口长度设置为1小时,滑动间隔也为1小时。

      c. 对于1天的统计,可以使用DailyEventTimeWindows或DailyProcessingTimeWindows窗口,并将窗口长度设置为1天。

    3. 在窗口结束时,使用聚合函数计算当前时间段内的观看人数,将结果写入相关的存储介质中(例如MySQL、Redis等)。

    4. 在查询窗口内的观看人数时,可以根据时间粒度选择相应的聚合结果。

      a. 如果查询粒度是1分钟,则查询最近1分钟内的观看人数。

      b. 如果查询粒度是1小时,则查询最近1小时内的观看人数。

      c. 如果查询粒度是1天,则查询最近1天内的观看人数。

    可以使用Flink提供的时间类型和窗口操作,实现不同时间粒度下的观看人数统计,同时根据实际情况选择存储介质,对数据进行持久化。

    2023-05-05 21:01:55
    赞同 展开评论 打赏
  • 要实现按不同粒度统计直播观看人数,可以使用 Flink 的 Window 操作。Window 是一种将连续的数据流切割成离散的、有限大小的块的概念,在每个块上运行聚合操作,最终输出聚合结果。

    针对不同粒度的统计需求,可以使用不同类型的 Window。例如:

    • 1min 粒度:使用 TumblingWindow,每次窗口大小为 1 min。
    • 1hour 粒度:使用 TumblingWindow,每次窗口大小为 1 hour。
    • 1day 粒度:使用 DailyWindow,每天的数据会被分为一个窗口。

    下面是一个示例代码,实现对直播观看人数按 1min、1hour、1day 粒度的统计:

    // 输入事件流
    DataStream<Event> inputStream = ...
    // 按直播 ID 分组
    KeyedStream<Event, String> keyedStream = inputStream.keyBy(Event::getLiveId);
    
    // 按 1min 粒度统计观看人数
    keyedStream
      .timeWindow(Time.minutes(1))
      .sum("viewerCount")
      .addSink(...) // 输出结果
    
    // 按 1hour 粒度统计观看人数
    keyedStream
      .timeWindow(Time.hours(1))
      .sum("viewerCount")
      .addSink(...) // 输出结果
    
    // 按 1day 粒度统计观看人数
    keyedStream
      .window(DailyWindow.of(Time.hours(24)))
      .sum("viewerCount")
      .addSink(...) // 输出结果
    
    2023-05-05 18:09:07
    赞同 展开评论 打赏
  • 为了支持按不同粒度统计直播观看人数,可以考虑以下设计:

    1、数据采集:在直播过程中,需要实时采集用户的观看行为数据,包括用户ID、观看时间、直播房间号等信息。

    2、数据处理:将采集的观看行为数据按照不同粒度进行汇总计算,例如对于1min粒度,可以将观看行为按照每分钟进行汇总计算;对于1hour粒度,可以将观看行为按照每小时进行汇总计算。

    3、数据存储:将处理后的统计数据存储到数据库中,支持按不同粒度进行查询和分析。

    4、查询分析:设计相应的查询接口,可以按照不同粒度查询直播观看人数,例如查询某个房间在某一天的观看人数,或者查询某个房间在某个小时的观看人数。

    5、数据可视化:将查询结果可视化展示,方便用户进行数据分析和决策。

    需要注意的是,在设计过程中需要考虑系统的扩展性和性能,以支持大规模的并发访问和数据处理。同时,还需对数据的安全性进行保护,避免数据泄露和滥用。

    2023-05-03 08:05:08
    赞同 展开评论 打赏
  • 针对按不同粒度(1min、1hour、1day) 统计直播观看人数的需求,可以考虑以下设计方案:

    1. 数据获取:通过用户访问直播网页的日志记录,获取用户观看直播的信息,包括观看开始时间、结束时间、用户ID等数据。

    2. 数据处理:针对不同粒度(1min、1hour、1day),可以采用不同的数据处理方式。

    3. 对于1min粒度,可以将每个观看时长不足1min的用户记录为1min,然后按照1min为一个时间窗口,对观看开始时间进行分组,统计每个时间窗口内的观看用户数。

    4. 对于1hour粒度,可以按照1小时为一个时间窗口,对观看开始时间进行分组,统计每个时间窗口内的观看用户数。
    5. 对于1day粒度,可以按照1天为一个时间窗口,对观看开始时间进行分组,统计每个时间窗口内的观看用户数。

    6. 数据存储:将统计得到的数据存储到相应的数据存储系统中,例如关系型数据库、NoSQL数据库等。

    7. 数据查询:为了方便查询和展示统计结果,可以设计相应的API接口或者界面,根据用户选择的粒度,从数据存储系统中查询对应时间段内的观看人数数据,返回给用户。

    8. 数据可视化:为了更加直观地展示统计结果,可以采用数据可视化工具,将统计结果以图表的形式展示给用户,例如直线图、柱状图、饼状图等。

    2023-04-28 20:19:04
    赞同 展开评论 打赏
  • 云端行者觅知音, 技术前沿我独行。 前言探索无边界, 阿里风光引我情。

    你如果想要实现按不同粒度(1min、1hour、1day)统计直播观看人数,可以尝试采用以下系统设计:

    1、数据采集:使用Flink的DataStreamAPI或TableAPI从直播平台的数据源中采集直播观看数据,包括用户ID、直播ID、观看时间等信息。可以使用Flink的窗口函数来对数据进行分组和聚合,以便进行后续的统计计算。

    2、数据存储:将采集到的直播观看数据存储到分布式存储系统中。可以根据需要设置数据的分区和副本数,以提高数据的可靠性和可用性。

    3、统计计算:使用Flink的DataStreamAPI或TableAPI对采集到的直播观看数据进行统计计算,包括按不同粒度(1min、1hour、1day)统计直播观看人数、观看时长、观看次数等指标。可以使用Flink的窗口函数和聚合函数来实现统计计算,同时可以使用Flink的状态管理机制来保存中间结果,以便进行增量计算和容错恢复。

    4、数据展示:将统计计算的结果展示到WebUI或移动端应用中,以便用户查看和分析。可以使用Flink的TableAPI和SQLAPI来实现数据的查询和可视化,同时可以使用第三方的可视化工具来实现数据的展示和分析。

    具体实现方式还需要根据具体场景和需求进行调整和优化。

    2023-04-28 10:22:09
    赞同 展开评论 打赏
  • 天下风云出我辈,一入江湖岁月催,皇图霸业谈笑中,不胜人生一场醉。
    数据源的获取:可以使用 Kafka、RocketMQ 等消息中间件作为实时数据源,也可以使用 Flink 自带的 DataStream API 从 TCP、Socket、文件、Hadoop 等数据源中获取数据。
    
    数据分流:可以根据不同的粒度进行分流,比如将数据按分钟粒度和小时粒度分别写入两个 topic 或者使用不同的 key 进行分流。
    
    数据窗口:在 Flink 中,可以使用窗口(Window)来对流数据进行分组和聚合操作。针对该需求,可以使用 Tumbling Window、Sliding Window 或者 Session Window 等窗口机制对数据进行聚合计算。
    
    系统架构:可以采用 Flink on YARN 的方式,将 Flink 应用程序打包成一个 JAR 文件,然后通过 YARN 提交到 Hadoop 集群中运行。其中,可以根据实际需求动态调整容器数量和分配的资源量,以实现高效利用集群资源。
    
    数据存储:可以将聚合后的结果存储到 HDFS、Cassandra、MySQL 等支持分布式存储的系统中,方便后续的数据分析和查询。
    
    监控和管理:可以通过 Flink Web UI 或者 Flink 命令行工具来监控和管理应用程序,及时处理任何异常情况。
    
    2023-04-27 08:56:14
    赞同 展开评论 打赏
  • 值得去的地方都没有捷径

    针对按不同粒度进行统计直播观看人数,flink可以采用滑动窗口或者分组聚合的方式进行实现。具体设计如下:

    滑动窗口统计:使用tumbling window和sliding window,tumbling window是一段时间内的数据划分成多个区间,每个区间不重叠,用于聚合窗口函数操作。Sliding window也是一个窗口,但是它是可以重叠的,可以让每个元素同时属于不同的窗口,也可以用于聚合窗口函数操作。Flink支持一些状态后端如RocksDB和In-Memory以及stateful operator来保持计算结果,可以使用Aggregate Function对窗口内元素进行聚合操作,最后,将聚合的结果输出到外部系统。 例如,对于1min的统计,可以将每1min的观看人数滑动窗口聚合一次,得到每个时间段内的观看人数,然后可以输出到外部系统进行统计和可视化展示。

    分组聚合统计:可以使用keyBy函数进行分组,将所有观众按照指定粒度(1min,1hour,1day)进行分组,然后使用WindowedStream进行聚合操作所需的时间窗口的定义。之后可以使用Aggregate Function进行聚合操作以得到所有时间段内的观看人数,最后,可以输出到外部系统进行统计和可视化展示。 例如,对于1hour的统计,可以将所有观众按照小时进行分组,然后对每个小时内的观看人数进行聚合,最后输出到外部系统进行统计和可视化展示。

    2023-04-26 15:52:49
    赞同 展开评论 打赏
  • 为了实现按不同粒度统计直播观看人数,可以采用以下设计思路:

    1. 采集直播观看数据:可以使用Flink的DataStream API或者Table API从Kafka、MQ等消息队列中读取直播观看数据,包括用户ID、直播ID、开始观看时间、结束观看时间等信息。

    2. 计算直播观看人数:可以使用Flink的Window API对观看数据进行划分窗口,根据窗口大小(1min、1hour、1day)对观看数据进行分组统计,计算每个窗口内的独立观看用户数。

    3. 存储统计结果:可以使用Flink的Sink API将统计结果输出到MySQL、HBase或者Elasticsearch等存储系统中,以便后续查询和分析。

    具体实现步骤如下:

    1. 定义观看数据的数据结构,包括用户ID、直播ID、开始观看时间、结束观看时间等信息。

    2. 使用DataStream API或者Table API从消息队列中读取观看数据。

    3. 使用Window API对观看数据进行划分窗口,根据窗口大小(1min、1hour、1day)进行分组统计,计算每个窗口内的独立观看用户数。

    4. 使用Sink API将统计结果输出到MySQL、HBase或者Elasticsearch等存储系统中,以便后续查询和分析。

    5. 可以使用Flink SQL对存储的数据进行SQL查询和分析,例如按照时间粒度(1min、1hour、1day)统计直播观看人数的变化趋势,或者按照用户ID、直播ID等维度进行多维度统计和分析。

    另外,对于大规模的直播平台,可能需要考虑分布式部署和高可用性等问题,可以使用Flink的分布式部署模式和HA模式来解决。同时,也需要考虑数据量、统计精度、数据延迟等问题,可以根据实际情况进行调整和优化。

    2023-04-24 23:32:58
    赞同 展开评论 打赏
  • 十分耕耘,一定会有一分收获!

    楼主你好,你可以使用flink自带的窗口和聚合功能来实现不同粒度统计直播观看人数,其中,时间窗口以时间的范围来对数据进行划分,计数窗口以数据条数来对数据进行划分即可。

    2023-04-24 22:51:20
    赞同 1 展开评论 打赏
  • 全栈JAVA领域创作者

    可以通过使用 Flink 的窗口和聚合操作来实现不同粒度的统计直播观看人数。

    首先,你需要将原始的数据流按照特定的 Key(比如房间号)进行分组。然后,你可以根据统计粒度定义不同的窗口,比如使用 TumblingEventTimeWindows 来定义 1 分钟的窗口、使用 TumblingEventTimeWindows 来定义 1 小时的窗口、使用 TumblingEventTimeWindows 来定义 1 天的窗口。

    在窗口定义好之后,可以使用 Flink 提供的聚合函数,比如 sum、count、avg 等,对窗口内的数据进行统计。具体的实现可以参考以下代码:

    Copy code

    // 定义窗口大小和滑动间隔
    TimeWindowSize = 1; // 1 分钟
    TimeWindowSlide = 1; // 1 分钟
    
    // 定义事件时间的 Watermark 生成器
    WatermarkStrategy<MyEvent> watermarkStrategy = WatermarkStrategy
        .<MyEvent>forBoundedOutOfOrderness(Duration.ofSeconds(10))
        .withTimestampAssigner((event, timestamp) -> event.getTimestamp());
    
    // 构建 Flink 程序
    StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
    env.setStreamTimeCharacteristic(TimeCharacteristic.EventTime);
    
    DataStream<MyEvent> events = env.addSource(new MyEventSource())
        .assignTimestampsAndWatermarks(watermarkStrategy)
        .keyBy(event -> event.getRoomId())
        .window(TumblingEventTimeWindows.of(TimeWindowSize))
        .aggregate(new MyAggregateFunction());
    
    // 自定义聚合函数
    public static class MyAggregateFunction implements AggregateFunction<MyEvent, Long, Long> {
        @Override
        public Long createAccumulator() {
            return 0L;
        }
    
        @Override
        public Long add(MyEvent event, Long acc) {
            return acc + 1L;
        }
    
        @Override
        public Long getResult(Long acc) {
            return acc;
        }
    
        @Override
        public Long merge(Long acc1, Long acc2) {
            return acc1 + acc2;
        }
    }
    
    

    上述代码定义了窗口大小为 1 分钟的 TumblingEventTimeWindows,然后使用自定义的 MyAggregateFunction 对窗口内的数据进行统计。其中 MyEventSource 是一个自定义的数据源,可以替换为实际的数据源。

    通过类似上述的代码实现,你可以实现不同粒度的直播观看人数统计。

    2023-04-24 08:02:19
    赞同 展开评论 打赏
  • 热爱开发

    如果您要按不同粒度(1min、1hour、1day)统计直播观看人数,可以考虑使用 Flink 提供的窗口和聚合功能。

    下面是一些可能有用的步骤:

    从直播数据源中读取实时数据流并解析每个事件以获取观众信息(比如观看者 ID、观看时间等)。

    使用 Flink 的窗口函数来划分时间窗口。例如,对于按分钟统计的情况,可以使用 TumblingProcessingTimeWindows.of(Time.minutes(1)) 来定义一个大小为 1 分钟的滚动窗口。

    将窗口内的观众信息进行聚合。例如,您可以使用 count() 函数来计算窗口内总的观众人数。

    如果您需要将聚合结果存储到外部系统或文件中,则可以使用 Flink 的 sink 函数来实现这一点。例如,您可以使用 Elasticsearch 或 Kafka 等存储引擎将聚合结果写入数据库中。

    重复上述步骤,但更改时间窗口的持续时间和聚合函数以适应不同的时间粒度。

    请注意,在实际情况下,您可能还需要处理一些其他细节,例如如何处理延迟事件,如何处理丢失的事件,如何缓解高负载等问题。

    2023-04-23 17:52:43
    赞同 展开评论 打赏
  • 要按不同粒度(1min、1hour、1day)统计直播观看人数,可以采用以下设计方案:

    使用 Flink 的 DataStream API 读取原始直播观看记录数据(例如,每一条记录包含用户 ID、观看时间等信息)。

    对于 1min 的统计粒度,可以使用 Tumbling Window 或 Sliding Window 机制对数据进行窗口操作。例如,使用 Tumbling Window 操作,设置窗口大小为 60 秒,每个窗口内的数据将被聚合为一个数据集,统计该窗口内的观看人数即可。使用 Sliding Window 操作也可以实现同样的效果,但需要在窗口大小和步长等参数上进行合适的设置。

    对于 1hour 和 1day 的统计粒度,可以使用 Flink 的 ProcessFunction 和 StateBackend 实现。ProcessFunction 可以对窗口内的数据进行处理,并将结果存储在 StateBackend 中。例如,使用 ValueState 存储每个小时或每天的观看人数总量,然后在窗口结束时输出结果。

    在实现过程中,需要考虑数据的时效性和准确性。为了保证结果的准确性,可以使用 Flink 的 Checkpoint 和 Savepoint 机制进行故障恢复和数据备份。

    2023-04-23 17:16:54
    赞同 展开评论 打赏
  • 存在即是合理

    为了按不同粒度统计直播观看人数,可以使用Flink的窗口机制。在Flink中,有两种类型的窗口:时间窗口和计数窗口。时间窗口按照时间的范围来对数据进行划分,而计数窗口按照数据条数来对数据进行划分。

    对于这个问题,可以使用时间窗口来实现。具体地,可以将每一次观看直播的事件按照时间窗口进行划分,并将每个时间窗口内的观看人数统计出来。时间窗口的大小可以根据不同的粒度进行设置,例如1min、1hour、1day。

    
    DataStream<LiveEvent> events = ...; // 读取直播事件流
    
    // 按照1min的时间窗口进行划分,统计每个窗口内的观看人数
    DataStream<Tuple2<Long, Integer>> viewCount = events
        .keyBy(LiveEvent::getLiveId) // 根据直播ID进行分区
        .window(TumblingEventTimeWindows.of(Time.minutes(1))) // 1min的时间窗口
        .apply(new WindowFunction<LiveEvent, Tuple2<Long, Integer>, Tuple, TimeWindow>() {
            @Override
            public void apply(Tuple key, TimeWindow window, Iterable<LiveEvent> events, Collector<Tuple2<Long, Integer>> out) {
                long liveId = ((Tuple1<Long>) key).f0;
                int count = 0;
                for (LiveEvent event : events) {
                    if (event.getType() == EventType.VIEW) {
                        count++;
                    }
                }
                out.collect(new Tuple2<>(liveId, count));
            }
        });
    
    
    

    代码中,首先按照直播ID进行分区,然后使用TumblingEventTimeWindows将数据按照1min的时间窗口进行划分。然后使用WindowFunction对每个窗口内的数据进行处理,统计出每个窗口内的观看人数。最后将每个窗口内的观看人数输出到DataStream中。

    如果需要统计不同粒度的直播观看人数,只需要修改TumblingEventTimeWindows的参数即可,例如使用TumblingEventTimeWindows.of(Time.hours(1))来统计每小时的观看人数。

    2023-04-23 17:16:59
    赞同 展开评论 打赏
滑动查看更多

实时计算Flink版是阿里云提供的全托管Serverless Flink云服务,基于 Apache Flink 构建的企业级、高性能实时大数据处理系统。提供全托管版 Flink 集群和引擎,提高作业开发运维效率。

相关产品

  • 实时计算 Flink版
  • 相关电子书

    更多
    Flink CDC Meetup PPT - 龚中强 立即下载
    Flink CDC Meetup PPT - 王赫 立即下载
    Flink CDC Meetup PPT - 覃立辉 立即下载