aggregator

------------------

聚合动作;聚合操作可以是基于batch、stream、partiton

[聚合方式-分区聚合]

partitionAggregate

  分区聚合;基于分区进行聚合运算;作用于分区而不是batch。

  mystream.partitionAggregate(new Fields("x"), new Count(), new Fields("count"));

[聚合方式-batch聚合]

aggregate

  批次聚合;先将同一batch的所有分区的tuple进行global再分区,将其汇集到一个分区中,再进行聚合运算。

  .aggregate(new Fields("a"), new Count(), new Fields("count"));   // 批次聚合

  聚合函数

    [ReducerAggregator]

      init();

      reduce();

    Aggregator

    CombinerAggregator

import org.apache.storm.trident.operation.ReducerAggregator;
import org.apache.storm.trident.tuple.TridentTuple; /**
* 自定义sum聚合函数
*/
public class SumReducerAggregator implements ReducerAggregator<Integer> { private static final long serialVersionUID = 1L; @Override
public Integer init() {
return 0;
} @Override
public Integer reduce(Integer curr, TridentTuple tuple) {
return curr + tuple.getInteger(0) + tuple.getInteger(1);
} }

分区聚合

import net.baiqu.shop.report.trident.demo01.PrintFunction;
import org.apache.storm.Config;
import org.apache.storm.LocalCluster;
import org.apache.storm.trident.Stream;
import org.apache.storm.trident.TridentTopology;
import org.apache.storm.trident.testing.FixedBatchSpout;
import org.apache.storm.tuple.Fields;
import org.apache.storm.tuple.Values; public class TridentTopologyApp4 { public static void main(String[] args) {
// 创建topology
TridentTopology topology = new TridentTopology(); // 创建spout
FixedBatchSpout testSpout = new FixedBatchSpout(new Fields("a", "b"), 4,
new Values(1, 2),
new Values(2, 3),
new Values(3, 4),
new Values(4, 5)); // 创建流
Stream stream = topology.newStream("testSpout", testSpout);
stream.partitionAggregate(new Fields("a", "b"), new SumReducerAggregator(), new Fields("sum"))
.shuffle().each(new Fields("sum"), new PrintFunction(), new Fields("result")); // 本地提交
LocalCluster cluster = new LocalCluster();
cluster.submitTopology("TridentDemo4", new Config(), topology.build());
} }

[ReducerAggregator]

  init();

  reduce();

  public interface ReducerAggregator<T> extends Serializable {

    T init();

    T reduce(T curr, TridentTuple tuple);

  }

[Aggregator]

  描述同ReducerAggregator.

  public interface Aggregator<T> extends Operation {

    // 开始聚合之间调用,主要用于保存状态。共下面的两个方法使用   

    T init(Object batchId, TridentCollector collector);

    // 迭代batch的每个tuple, 处理每个tuple后更新state的状态。

    void aggreate(T val, TridentTuple tuple, TridentCollector collector);

    // 所有tuple处理完成后调用,返回单个tuple给每个batch。

    void complete(T val, TridentCollector collector);

  }

CombinerAggregator

import org.apache.storm.trident.operation.BaseAggregator;
import org.apache.storm.trident.operation.TridentCollector;
import org.apache.storm.trident.tuple.TridentTuple;
import org.apache.storm.tuple.Values; import java.io.Serializable; /**
* 批次求和函数
*/
public class SumAggregator extends BaseAggregator<SumAggregator.State> { private static final long serialVersionUID = 1L; static class State implements Serializable {
private static final long serialVersionUID = 1L;
int sum = 0;
} @Override
public SumAggregator.State init(Object batchId, TridentCollector collector) {
return new State();
} @Override
public void aggregate(SumAggregator.State state, TridentTuple tuple, TridentCollector collector) {
state.sum = state.sum + tuple.getInteger(0) + tuple.getInteger(1);
} @Override
public void complete(SumAggregator.State state, TridentCollector collector) {
collector.emit(new Values(state.sum));
} }

批次聚合

package net.baiqu.shop.report.trident.demo04;

import net.baiqu.shop.report.trident.demo01.PrintFunction;
import org.apache.storm.Config;
import org.apache.storm.LocalCluster;
import org.apache.storm.trident.Stream;
import org.apache.storm.trident.TridentTopology;
import org.apache.storm.trident.testing.FixedBatchSpout;
import org.apache.storm.tuple.Fields;
import org.apache.storm.tuple.Values; public class TridentTopologyApp4 { public static void main(String[] args) {
// 创建topology
TridentTopology topology = new TridentTopology(); // 创建spout
FixedBatchSpout testSpout = new FixedBatchSpout(new Fields("a", "b"), 4,
new Values(1, 2),
new Values(2, 3),
new Values(3, 4),
new Values(4, 5)); // 创建流
Stream stream = topology.newStream("testSpout", testSpout);
stream.aggregate(new Fields("a", "b"), new SumAggregator(), new Fields("sum"))
.shuffle().each(new Fields("sum"), new PrintFunction(), new Fields("result")); // 本地提交
LocalCluster cluster = new LocalCluster();
cluster.submitTopology("TridentDemo4", new Config(), topology.build());
} }

运行结果

PrintFunction:
PrintFunction:
PrintFunction:
......

平均值批次聚合函数

import org.apache.storm.trident.operation.BaseAggregator;
import org.apache.storm.trident.operation.TridentCollector;
import org.apache.storm.trident.tuple.TridentTuple;
import org.apache.storm.tuple.Values; import java.io.Serializable; /**
* 批次求平均值函数
*/
public class AvgAggregator extends BaseAggregator<AvgAggregator.State> { private static final long serialVersionUID = 1L; static class State implements Serializable {
private static final long serialVersionUID = 1L;
// 元组值的总和
float sum = 0;
// 元组个数
int count = 0;
} /**
* 初始化状态
*/
@Override
public AvgAggregator.State init(Object batchId, TridentCollector collector) {
return new State();
} /**
* 在state变量中维护状态
*/
@Override
public void aggregate(AvgAggregator.State state, TridentTuple tuple, TridentCollector collector) {
state.count = state.count + 2;
state.sum = state.sum + tuple.getInteger(0) + tuple.getInteger(1);
} /**
* 处理完成所有元组之后,返回一个具有单个值的tuple
*/
@Override
public void complete(AvgAggregator.State state, TridentCollector collector) {
collector.emit(new Values(state.sum / state.count));
} }

批次聚合求平均值

import net.baiqu.shop.report.trident.demo01.PrintFunction;
import org.apache.storm.Config;
import org.apache.storm.LocalCluster;
import org.apache.storm.trident.Stream;
import org.apache.storm.trident.TridentTopology;
import org.apache.storm.trident.testing.FixedBatchSpout;
import org.apache.storm.tuple.Fields;
import org.apache.storm.tuple.Values; public class TridentTopologyApp4 { public static void main(String[] args) {
// 创建topology
TridentTopology topology = new TridentTopology(); // 创建spout
FixedBatchSpout testSpout = new FixedBatchSpout(new Fields("a", "b"), 4,
new Values(1, 2),
new Values(2, 3),
new Values(3, 4),
new Values(4, 5)); // 创建流
Stream stream = topology.newStream("testSpout", testSpout);
stream.aggregate(new Fields("a", "b"), new AvgAggregator(), new Fields("avg"))
.shuffle().each(new Fields("avg"), new PrintFunction(), new Fields("result")); // 本地提交
LocalCluster cluster = new LocalCluster();
cluster.submitTopology("TridentDemo4", new Config(), topology.build());
} }

[CombinerAggregator]

  在每个partition运行分区聚合,然后再进行global再分区将同一对batch的所有tuple分到一个partition中,最后再这一个partition中进行聚合运算,并产生结果进行输出。

  该种方式的网络流量占用少于前两种方式。

  public interface CombinerAggregator<T> extents Serializable {

    // 在每个tuple上运行,并接受字段值

    T init(TridentTuple tuple);

    // 合成tuple的值,并输出一个值的tuple

    T combine(T val1, T vak2);

    // 如果分区不含有tuple,调用该方法.

    T zero();

  }

合成聚合函数

import clojure.lang.Numbers;
import org.apache.storm.trident.operation.CombinerAggregator;
import org.apache.storm.trident.tuple.TridentTuple; /**
* 合成聚合函数
*/
public class SumCombinerAggregator implements CombinerAggregator<Number> { private static final long serialVersionUID = 1L; @Override
public Number init(TridentTuple tuple) {
return (Number) tuple.getValue(0);
} @Override
public Number combine(Number val1, Number val2) {
return Numbers.add(val1, val2);
} @Override
public Number zero() {
return 0;
} }

topology

import net.baiqu.shop.report.trident.demo01.PrintFunction;
import org.apache.storm.Config;
import org.apache.storm.LocalCluster;
import org.apache.storm.trident.Stream;
import org.apache.storm.trident.TridentTopology;
import org.apache.storm.trident.testing.FixedBatchSpout;
import org.apache.storm.tuple.Fields;
import org.apache.storm.tuple.Values; public class TridentTopologyApp4 { public static void main(String[] args) {
// 创建topology
TridentTopology topology = new TridentTopology(); // 创建spout
FixedBatchSpout testSpout = new FixedBatchSpout(new Fields("a", "b"), 4,
new Values(1, 2),
new Values(2, 3),
new Values(3, 4),
new Values(4, 5)); // 创建流
Stream stream = topology.newStream("testSpout", testSpout);
stream.aggregate(new Fields("a", "b"), new SumCombinerAggregator(), new Fields("sum"))
.shuffle().each(new Fields("sum"), new PrintFunction(), new Fields("result")); // 本地提交
LocalCluster cluster = new LocalCluster();
cluster.submitTopology("TridentDemo4", new Config(), topology.build());
} }

输出结果

PrintFunction:
PrintFunction:
PrintFunction:
......

Trident学习笔记(二)的更多相关文章

  1. WPF的Binding学习笔记(二)

    原文: http://www.cnblogs.com/pasoraku/archive/2012/10/25/2738428.htmlWPF的Binding学习笔记(二) 上次学了点点Binding的 ...

  2. AJax 学习笔记二(onreadystatechange的作用)

    AJax 学习笔记二(onreadystatechange的作用) 当发送一个请求后,客户端无法确定什么时候会完成这个请求,所以需要用事件机制来捕获请求的状态XMLHttpRequest对象提供了on ...

  3. [Firefly引擎][学习笔记二][已完结]卡牌游戏开发模型的设计

    源地址:http://bbs.9miao.com/thread-44603-1-1.html 在此补充一下Socket的验证机制:socket登陆验证.会采用session会话超时的机制做心跳接口验证 ...

  4. JMX学习笔记(二)-Notification

    Notification通知,也可理解为消息,有通知,必然有发送通知的广播,JMX这里采用了一种订阅的方式,类似于观察者模式,注册一个观察者到广播里,当有通知时,广播通过调用观察者,逐一通知. 这里写 ...

  5. java之jvm学习笔记二(类装载器的体系结构)

    java的class只在需要的时候才内转载入内存,并由java虚拟机的执行引擎来执行,而执行引擎从总的来说主要的执行方式分为四种, 第一种,一次性解释代码,也就是当字节码转载到内存后,每次需要都会重新 ...

  6. Java IO学习笔记二

    Java IO学习笔记二 流的概念 在程序中所有的数据都是以流的方式进行传输或保存的,程序需要数据的时候要使用输入流读取数据,而当程序需要将一些数据保存起来的时候,就要使用输出流完成. 程序中的输入输 ...

  7. 《SQL必知必会》学习笔记二)

    <SQL必知必会>学习笔记(二) 咱们接着上一篇的内容继续.这一篇主要回顾子查询,联合查询,复制表这三类内容. 上一部分基本上都是简单的Select查询,即从单个数据库表中检索数据的单条语 ...

  8. NumPy学习笔记 二

    NumPy学习笔记 二 <NumPy学习笔记>系列将记录学习NumPy过程中的动手笔记,前期的参考书是<Python数据分析基础教程 NumPy学习指南>第二版.<数学分 ...

  9. Learning ROS for Robotics Programming Second Edition学习笔记(二) indigo tools

    中文译著已经出版,详情请参考:http://blog.csdn.net/ZhangRelay/article/category/6506865 Learning ROS for Robotics Pr ...

  10. Redis学习笔记二 (BitMap算法分析与BitCount语法)

    Redis学习笔记二 一.BitMap是什么 就是通过一个bit位来表示某个元素对应的值或者状态,其中的key就是对应元素本身.我们知道8个bit可以组成一个Byte,所以bitmap本身会极大的节省 ...

随机推荐

  1. SonarQube代码质量管理平台介绍与搭建

    前 言 1.SonarQube的介绍 SonarQube是一个管理代码质量的开放平台. 可以从七个维度检测代码质量(为什么要用SonarQube): (1) 复杂度分布(complexity):代码复 ...

  2. Windows server R2 2008上部署gogs git

      所需的环境 1.     安装mysql                       安装路径:F:\MySQL Server 5.7 2.     安装gogs                  ...

  3. CentOS6下DHCP服务(二)简单配置案例及故障排查

    1.预分配网络参数如下:linux服务器:eth0 IP为192.168.8.250  做为局域网DHCP服务器局域网网段设置为192.168.8.0/24:内部计算机的router为192.168. ...

  4. Altium_Designer如何快速寻找元件和封装

    初学Altium碰到最多的问题就是:不知道元件放在哪个库中.这里我收集了DXP2004常用元件库下常见的元件.使用时,只需在libary中选择相应元件库后,输入英文的前几个字母就可看到相应的元件了.通 ...

  5. *205. Isomorphic Strings (string & map idea)

    Given two strings s and t, determine if they are isomorphic. Two strings are isomorphic if the chara ...

  6. IOS GCD(线程的 串行、并发 基本使用)

    什么是GCD 全称是Grand Central Dispatch,可译为“牛逼的中枢调度器” 纯C语言,提供了非常多强大的函数 GCD的优势 GCD是苹果公司为多核的并行运算提出的解决方案 GCD会自 ...

  7. des的根据key进行加密和解密方法

    DES加密: public static string DESEncode(string content, string key) { DESCryptoServiceProvider des = n ...

  8. 指定类型的成员XX”不支持实体LINQ。只有初始化,成员单位,和实体导航性能的支持。

    The specified type member 'DeleteFlag' is not supported in LINQ to Entities. Only initializers, enti ...

  9. POJ-2377 Bad Cowtractors---最大生成树

    题目链接: https://vjudge.net/problem/POJ-2377 题目大意: 给一个图,求最大生成树权值,如果不连通输出-1 思路: kruskal算法变形,sort按边从大到小排序 ...

  10. 虚连接 tcp

    由TCP 建立的连接叫做虚连接(virtual connection),这是因为它们是由软件实现的,底层的系统并不对连接提供硬件或软件支持,只是两台机器上的TCP 软件模块通过交换消息来实现逻辑...