开发者可以通过Processor接口来实现自己的自定义处理逻辑。接口提供了Process和Punctuate方法。

其中:Process方法用于处理接受到的消息

Punctuate方法指定时间间隔周期性的执行,用于处理周期数据:例如某些状态值计算生成 新的流。

Processor接口还提供了init方法,init初始化方法可以将ProcessorContext转存到Procesor实例中,以供Prounctute使用。

可以使用context的schedule方法实现punctute的周期性调用。

将修改后的数据转存到下游处理节点:context.().forward

体检当前处理节点的处理进度:context.commit.

代码实例如下:

  1. public class MyProcessor extends Processor {
  2.  
  3. private ProcessorContext context;
  4.  
  5. private KeyValueStore kvStore;
  6. @Override
  7. @SuppressWarnings("unchecked")
  8. public void init(ProcessorContext context) {
  9. this.context = context;
  10. this.context.schedule(1000);
  11. this.kvStore = (KeyValueStore) context.getStateStore("Counts");
  12. }
  13. @Override
  14. public void process(String dummy, String line) {
  15. String[] words = line.toLowerCase().split(" ");
  16. for (String word : words) {
  17. Integer oldValue = this.kvStore.get(word);
  18. if (oldValue == null) {
  19. this.kvStore.put(word, 1);
  20. } else {
  21. this.kvStore.put(word, oldValue + 1);
  22. }
  23. }
  24. }
  25. @Override
  26. public void punctuate(long timestamp) {
  27. KeyValueIterator iter = this.kvStore.all();
  28. while (iter.hasNext()) {
  29. KeyValue entry = iter.next();
  30. context.forward(entry.key, entry.value.toString());
  31. }
  32. iter.close();
  33. context.commit();
  34. }
  35. @Override
  36. public void close() {
  37. this.kvStore.close();
  38. }
  39. };

  

在上边的代码中:

1、 init方法,定义了每秒调用punctuate方法,将名称为count的状态存储结构中转存到奔processor处理节点中。

2、 在process方法中,每接受到一条消息,将字符串进行拆分,并更新到状态存储中,生成新的流。

3、 在puncuate方法中,迭代本地状态存储并将流提交到下个处理节点进行处理。

1.1    Processor Topology(处理器拓扑)

通过Processor API定义的自定义的处理器,开发人员将使用TopologyBuilder通过连接这些处理器共同构建一个处理器拓扑。(类似于主方法)

首先,所有的源节点命名为“SOURCE”并使用addSource方法添加到拓扑中,主题“src-topic”来提供记录(消息)。

  1. TopologyBuilder builder = new TopologyBuilder();
  2. builder.addSource("SOURCE", "src-topic")
  3. .addProcessor("PROCESS1", MyProcessor1::new /* the ProcessorSupplier that can generate MyProcessor1 */, "SOURCE")
  4. .addProcessor("PROCESS2", MyProcessor2::new /* the ProcessorSupplier that can generate MyProcessor2 */, "PROCESS1")
  5. .addProcessor("PROCESS3", MyProcessor3::new /* the ProcessorSupplier that can generate MyProcessor3 */, "PROCESS1")
  6. .addSink("SINK1", "sink-topic1", "PROCESS1")
  7. .addSink("SINK2", "sink-topic2", "PROCESS2")
  8. .addSink("SINK3", "sink-topic3", "PROCESS3");

3个processor节点,使用addProcessor方法添加;这里的第一个processor是”SOURCE”节点的子节点,但是其他两个处理器的父类。

最后,使用addSink方法将3个sink节点添加到完整的拓扑中。每个管道从不同父类处理器节点输出到不同的topic。

1.2    本地状态存储

请注意,Processor API不仅限于当有消息到达时候调用process()方法,也可以保存记录到本地状态仓库(如汇总或窗口连接)。利用这个特性,开发者可以使用StateStore接口定义一个状态仓库(Kafka Streams库也有一些扩展的接口,如KeyValueStore)。在实际开发中,开发者通常不需要从头开始自定义这样的状态仓库,可以很简单使用Stores工厂来设定状态仓库是持久化的或日志备份等。在下面的例子中,创建一个名为”Counts“的持久化的key-value仓库,key类型String和value类型Long。

  1. StateStoreSupplier countStore = Stores.create("Counts")
  2. .withKeys(Serdes.String())
  3. .withValues(Serdes.Long())
  4. .persistent()
  5. .build();

为了利用这些状态仓库,开发者可以在构建处理器拓扑时使用TopologyBuilder.addStateStore方法来创建本地状态,并将它与需要访问它的处理器节点相关联,或者也可以通过

  1. TopologyBuilder.connectProcessorAndStateStores将创建的状态仓库与现有的处理器节点连接。
  2. TopologyBuilder builder = new TopologyBuilder();
  3. builder.addSource("SOURCE", "src-topic")
  4. .addProcessor("PROCESS1", MyProcessor1::new, "SOURCE")
  5. // create the in-memory state store "COUNTS" associated with processor "PROCESS1"
  6. .addStateStore(Stores.create("COUNTS").withStringKeys().withStringValues().inMemory().build(), "PROCESS1")
  7. .addProcessor("PROCESS2", MyProcessor3::new /* the ProcessorSupplier that can generate MyProcessor3 */, "PROCESS1")
  8. .addProcessor("PROCESS3", MyProcessor3::new /* the ProcessorSupplier that can generate MyProcessor3 */, "PROCESS1")
  9. // connect the state store "COUNTS" with processor "PROCESS2"
  10. .connectProcessorAndStateStores("PROCESS2", "COUNTS");
  11. .addSink("SINK1", "sink-topic1", "PROCESS1")
  12. .addSink("SINK2", "sink-topic2", "PROCESS2")
  13. .addSink("SINK3", "sink-topic3", "PROCESS3");

  

KafkaStream低级别API的更多相关文章

  1. ElasticSearch的lowlevelApi和低级别API

    之前开发使用的其实都是lowLevel的api,所谓lowlevelapi就是操作ES的json字符串要自己去写:所谓highlevel的api就是指将查询的json字符串给对象化,创建一个Searc ...

  2. TensorFlow低阶API(四)—— 图和会话

    简介 TensorFlow使用数据流图将计算表示为独立的指令之间的依赖关系.这可生成低级别的编程模型,在该模型中,您首先定义数据流图,然后创建TensorFlow会话,以便在一组本地和远程设备上运行图 ...

  3. TensorFlow低阶API(一)—— 简介

    简介 本文旨在知道您使用低级别TensorFlow API(TensorFlow Core)开始编程.您可以学习执行以下操作: 管理自己的TensorFlow程序(tf.Graph)和TensorFl ...

  4. spark streaming kafka1.4.1中的低阶api createDirectStream使用总结

    转载:http://blog.csdn.net/ligt0610/article/details/47311771 由于目前每天需要从kafka中消费20亿条左右的消息,集群压力有点大,会导致job不 ...

  5. jeecms 配置可以低级别用户流程

    使用管理员admin登录后台,进入用户—>管理员(本站)à添加,填写用户名.密码等信息,如下图: 需要注意几个权限控制的问题: 1,  等级,值越大等级越高,等级高的管理员可以审核等级低的管理员 ...

  6. 【Azure Redis 缓存 Azure Cache For Redis】Azure Redis由低级别(C)升级到高级别(P)的步骤和注意事项, 及对用户现有应用的潜在影响,是否需要停机时间窗口,以及这个时间窗口需要多少的预估问题

    问题描述 由于Azure Redis的性能在不同级别表现不同,当需要升级/缩放Redis的时候,从使用者的角度,需要知道有那些步骤? 注意事项? 潜在影响?停机事件窗口? 升级预估时间? 解决方案 从 ...

  7. TebsorFlow低阶API(五)—— 保存和恢复

    简介 tf.train.Saver 类提供了保存和恢复模型的方法.通过 tf.saved_model.simple_save 函数可以轻松地保存适合投入使用的模型.Estimator会自动保存和恢复 ...

  8. TensorFlow低阶API(三)—— 变量

    简介 TensorFlow变量是表示程序处理的共享持久状态的最佳方法. 我们使用tf.Variable类操作变量.tf.Variable表示可通过其运行操作来改变其值的张量.与tf.Tensor对象不 ...

  9. KafkaStream-高级别API

    使用Streams DSL构建一个处理器拓扑,开发者可以使用KStreamBuilder类,它是TopologyBuilder的扩展.在Kafka源码的streams/examples包中有一个简单的 ...

随机推荐

  1. Quartz.Net使用教程

    在项目的开发过程中,难免会遇见后需要后台处理的任务,例如定时发送邮件通知.后台处理耗时的数据处理等,这个时候你就需要Quartz.Net了. Quartz.Net是纯净的,它是一个.Net程序集,是非 ...

  2. 初玩Docker

    Docker 和VM的区别 Docker就是类似于一个打包好的环境,相关的服务都安装在里面,可以直接使用的. VM就相当于另外一套独立的系统,独立的IP,虚拟硬件. 要使用就需要单独构建一套才可以. ...

  3. Java基础(一)-- Java对字符串操作大全

    一.Java字符串类基本概念 在JAVA语言中,字符串数据实际上由String类所实现的.Java字符串类分为两类:一类是在程序中不会被改变长度的不变字符串:二类是在程序中会被改变长度的可变字符串.J ...

  4. “独立”OpenVINO R2019_2 版本中的“super_resolution_demo”例子的,解决由于 R2019_1到R2019_2 升级造成的问题

    OpenVINO提供了丰富的例子,为了方便研究和使用,我们需要将这些例子由原始的demo目录中分离出来,也就是“独立”运行,这里我们选择了较为简单的super_resolution_demo来说明问题 ...

  5. React Hooks 你不来了解下?

    前言 最近在看 React 的新语法-- React Hooks,只能一句话概括:React 语法真的是越来越强大,越写代码越少. 强烈推荐还没看 React Hooks 的同学去学习下,这会让你写r ...

  6. 线上问题排查神器 Arthas

    线上问题排查神器 Arthas 之前介绍过 BTrace,线上问题排查神器 BTrace 的使用,也说它是线上问题排查神器.都是神器,但今天这个也很厉害,是不是更厉害不好说,但是使用起来非常简单.如果 ...

  7. iOS面试题整理带答案

    iOS面试题整理带答案       找工作,面试是避免不了的! 而技术开发面试,问一些技术相关的问题是必须的,最新的技术可能人人都趋之若鹜,但有些原理和基础的也希望都有了解. 这里整理了一些iOS相关 ...

  8. TestNG(十二) 参数化测试

    <?xml version="1.0" encoding="utf-8" ?> <suite name = "parameter&q ...

  9. Phpstudy被暴存在隐藏后门-检查方法

    Phpstudy被暴存在隐藏后门-检查方法 一.事件背景 Phpstudy软件是国内的一款免费的PHP调试环境的程序集成包,通过集成Apache.PHP.MySQL.phpMyAdmin.ZendOp ...

  10. [Advanced Python] 11 - Implement a Class

    基础概念:[Python] 08 - Classes --> Objects 进阶概念:[Advanced Python] 11 - Implement a Class 参考资源:廖雪峰,面向对 ...