×

Samza 入门

Samza 你好Samza 下载Samza 功能预览

Samza 详细介绍

Samza 背景Samza 概念Samza 结构

Samza 与其他流处理项目比较

Samza 比较介绍Samza MUPD8Samza 与 StormSamza 与 Spark Streaming

Samza API

Samza API概述

Samza 核心

Samza ContainerSamza 流Samza 序列化Samza 定期检查Samza 状态管理Samza 窗口功能Samza 协调器流Samza 事件循环Samza 指标Samza JMX

Samza 作业部署

Samza JobRunnerSamza 配置Samza 打包Samza YARN工作Samza 记录Samza 再处理Samza Web UI和REST APISamza 分离框架和作业部署

Samza YARN

Samza Application MasterSamza YARN执行隔离Samza 主机关联和 YARNSamza YARN资源本地化Samza YARN安全Samza 写入HDFSSamza 从HDFS文件读取

Samza 相关操作

Samza 安全Samza Kafka自动创建主题

Samza REST服务

Samza REST服务概观Samza REST服务资源Samza REST服务监视器

Samza 附录

附录一 工作资源附录二 任务资源附录三 远程调试附录四 从HDFS部署Samza工作附录五 部署Samza Job到CDH附录六 在多节点YARN中运行附录七 在没有联网的情况下运行附录八 Samza REST入门附录九 Async API和多线程指南附录十 代码附录十一 Samza配置参考

Samza窗口功能


有时,流处理作业需要定期执行某些操作,无论作业正在处理多少个传入消息。例如,假设您要报告每分钟的页面浏览次数。为此,您每次看到页面查看事件时都会增加一个计数器。每分钟一次,将当前计数器值发送到输出流,并将计数器复位为零。

Samza 的窗口功能为任务以常规时间间隔提供了一种方式,例如每分钟一次。要启用窗口,您只需要在作业配置中设置一个属性:

# Call the window() method every 60 seconds
task.window.ms=60000

接下来,您的流任务需要实现WindowableTask接口。此接口定义了一个由 Samza 在您配置的常规间隔中调用的 window()方法。

例如,您将如何实现基本的每分钟事件计数器:

public class EventCounterTask implements StreamTask, WindowableTask {

  public static final SystemStream OUTPUT_STREAM =
    new SystemStream("kafka", "events-per-minute");

  private int eventsSeen = 0;

  public void process(IncomingMessageEnvelope envelope,
                      MessageCollector collector,
                      TaskCoordinator coordinator) {
    eventsSeen++;
  }

  public void window(MessageCollector collector,
                     TaskCoordinator coordinator) {
    collector.send(new OutgoingMessageEnvelope(OUTPUT_STREAM, eventsSeen));
    eventsSeen = 0;
  }
}

如果需要向输出流发送消息,可以使用传递给 window()方法的MessageCollector对象。请仅使用该 MessageCollector 对象发送消息,并且不要在调用 window()之外使用它。

请注意,Samza 使用单线程执行,因此 window()调用永远不会与 process()调用同时发生。这样做的优点在于您不需要担心代码中的线程安全性(不需要同步任何内容),但如果您的process()方法需要很长时间才能返回,则 window()调用可能会被延迟的缺点。


分类导航

关注微信下载离线手册

bootwiki移动版 bootwiki
(群号:472910771)