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. SAP ECC6.0-中建信息版

    平台: SUSE Enterprise Server 类型: 虚拟机镜像 软件包: sap ecc 6.0 ehp7 sps10 commercial erp sap 服务优惠价: 按服务商许可协议 ...

  2. failed: No module named 'catkin_pkg' Make sure that you have installed "catkin_pkg"

    https://stackoverflow.com/questions/43024337/why-this-error-when-i-try-to-create-workspaces-in-ros# ...

  3. Selenium入门系列5 默认不显示的下拉列表元素操作

    本节课程的下拉框是那种默认隐藏,当鼠标移到菜单上下拉框才显示的.如果直接getelement会报错,提示元素不可见: so,得先让下拉列表显示出来再获取元素 用到的新知识: is_display()  ...

  4. 返回json格式 不忽略null字段

    返回json格式 不忽略null字段  发布于 353天前  作者 king666  271 次浏览  复制  上一个帖子  下一个帖子  标签: json 如题,一个实体的某个字段如果为null,在 ...

  5. Uva 11732 strcmp()函数

    题目链接:https://vjudge.net/contest/158125#problem/A 题意: 系统中,strcmp函数是这样执行的,给定 n 个字符串,求两两比较时,strcmp函数要比较 ...

  6. NYOJ(680),摘枇杷,(暴力,或者二分搜索)

    题目链接:http://acm.nyist.net/JudgeOnline/problem.php?pid=680 很巧妙的一个题目,就是看你的逆向思维,result 一定是max(a[i])~sum ...

  7. vuejs组件参数校验

    父组件向子组件传递一些参数,那么子组件有权对这些参数进行一个校验,这个就是组件参数校验 需求:父组件传递过来的必须是个字符串,这个要怎么去校验呢 <div id='root'> <c ...

  8. python 将表格多个列数据放到同一个单元格中

      表格模板: 目的将卡片1到卡片5的所有数据组合起来到一个单元格中如下入F列中(工作中为了避免手动复制粘贴),其余不变,因为数据太多 自己一个一个复制工作效率太低,所以写这个脚本是为了方便自己有需要 ...

  9. python 合并字符串

    [root@chenbj python]# cat name.py #!/usr/bin/env python # _*_ coding:utf-8 _*_ first_name = "ch ...

  10. Linux 启动、停止、重启tomcat工具(Shell脚本)

    1.   启动 #!/bin/bash pids=`ps -ef | grep java | grep -w tomcat | awk '{print $2}'` #pids=`ps -ef | gr ...