Storm专题二:Storm Trident API 使用具体解释
一、概述
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvc3VpZmVuZzMwNTE=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">
- Apply Locally:本地操作,全部操作应用在本地节点数据上,不会产生网络传输
- Repartitioning:数据流重定向,单纯的改变数据流向。不会改变数据内容,这部分会有网络传输
- Aggragation:聚合操作,会有网络传输
- Grouped streams上的操作
- Merge和Join
输出的新字段值会被追加到原始输入tuple的后面,假设一个function不输出tuple,那就意味这这个tuple被过滤掉了,以下举例说明:
- 定义一个Function:
public class MyFunction extends BaseFunction {
@Override
public void execute(TridentTuple tuple, TridentCollector collector) {
for ( int i = 0; i < tuple.getInteger(0); i++) {
collector.emit( new Values(i));
}
}
}
- 比方我们处理一个“mystream”的数据流,它有三个字段各自是[“a”, “b”, “c”] ,数据流中tuple的内容是:
2, 3] [4, 1, 6] [3, 0, 8]
- 我们执行我们的Function:
java mystream.each(new Fields("b"), new MyFunction(), new Fields("d")));
- 终于执行结果会是每一个tuple有四个字段[“a”, “b”, “c”, “d”]。每一个tuple的内容变成了:
2, 3, 0] [1, 2, 3, 1] [4, 1, 6, 0]
- Filters非常easy,接收一个tuple并决定是否保留这个tuple。
举个样例,定义一个Filter:
public class MyFilter extends BaseFilter {
public boolean isKeep(TridentTuple tuple) {
return tuple.getInteger(0) == 1 && tuple.getInteger(1) == 2;
}
}
- 如果我们的tuples有这个几个字段 [“a”,
“b”, “c”]:
- 然后执行我们的Filter:
java mystream.each(new Fields("b", "a"), new MyFilter())。
- 则终于得到的tuple是 :
1, 1]
- 定义一个累加的PartitionAggregate:
java mystream.partitionAggregate(new Fields("b"), new Sum(), new Fields("sum"));
- 如果我们的Stream包括两个字段 [“a”,
“b”],各个Partition的tuple内容是:
Partition 0: [“a”, 1] [“b”, 2]
Partition 1: [“a”, 3] [“c”, 8]
- 输出的内容仅仅有一个字段“sum”,值是:
Partition 0: [3]
Partition 1: [11]
and Aggregator.
public interface CombinerAggregator <T> extends Serializable {
T init(TridentTuple tuple);
T combine(T val1, T val2);
T zero();
}
- 定义一个CombinerAggregator实现来计数:
public class CombinerCount implements CombinerAggregator<Integer>{
@Override
public Integer init(TridentTuple tuple) {
return 1;
}
@Override
public Integer combine(Integer val1, Integer val2) { return val1 + val2;
}
@Override
public Integer zero() {
return 0;
}
}
public interface ReducerAggregator <T> extends Serializable {
T init();
T reduce(T curr, TridentTuple tuple);
}
- 定义一个ReducerAggregator接口实现技术器的样例:
public class ReducerCount implements ReducerAggregator<Long>{
@Override
public Long init() {
return 0L;
}
@Override
public Long reduce(Long curr, TridentTuple tuple) {
return curr + 1;
}
}
最后一个是Aggregator接口,它是最通用的聚合器,它的形式例如以下:
public interface Aggregator<T> extends Operation {
T init(Object batchId, TridentCollector collector);
void aggregate(T val, TridentTuple tuple, TridentCollector collector);
void complete(T val, TridentCollector collector);
}
- init:在处理数据之前被调用,它的返回值会作为一个状态值传递给aggregate和complete方法
- aggregate:用来处理每个输入的tuple,它能够更新状态值也能够发射tuple
- complete:当全部tuple都被处理完毕后被调用
以下举例说明:
- 定义一个实现来完毕一个计数器:
public class CountAgg extends BaseAggregator<CountState>{
static class CountState { long count = 0; }
@Override
public CountState init(Object batchId, TridentCollector collector) {
return new CountState();
}
@Override
public void aggregate(CountState val, TridentTuple tuple, TridentCollector collector) {
val. count+=1;
}
@Override
public void complete(CountState val, TridentCollector collector) {
collector.emit( new Values(val. count));
}
}
有时候我们须要同一时候运行多个聚合器。这在Trident中被称作chaining,用法例如以下:
java mystream.chainedAgg() .partitionAggregate(new Count(), new Fields("count")) .partitionAggregate(new Fields("b"), new Sum(), new Fields("sum")) .chainEnd();
这点代码会在每一个Partition上执行count和sum函数,终于输出一个tuple:[“count”, “sum”]
projection:投影操作
投影操作作用是仅保留Stream指定字段的数据,比方有一个Stream包括例如以下字段: [“a”, “b”, “c”, “d”]
执行例如以下代码:
java mystream.project(new Fields("b", "d"))
则输出的流仅包括 [“b”, “d”]字段。
2.2 Repartitioning重定向操作
重定向操作是怎样在各个任务间对tuples进行分区。分区的数量也有可能改变重定向的结果。 重定向须要网络传输,以下介绍下重定向函数:
- shuffle:通过随机分配算法来均衡tuple到各个分区
- broadcast:每一个tuple都被广播到全部的分区。这样的方式在drcp时很实用。比方在每一个分区上做stateQuery
- partitionBy:依据指定的字段列表进行划分,详细做法是用指定字段列表的hash值对分区个数做取模运算,确保同样字段列表的数据被划分到同一个分区
- global:全部的tuple都被发送到一个分区,这个分区用来处理整个Stream
- batchGlobal:一个Batch中的全部tuple都被发送到同一个分区,不同的Batch会去往不同的分区
- Partition:通过一个自己定义的分区函数来进行分区,这个自己定义函数实现了 backtype.storm.grouping.CustomStreamGrouping
Trident有aggregate和 persistentAggregate方法来做聚合操作。aggregate是独立的执行在Stream的每一个Batch上的,而persistentAggregate则是执行在Stream的全部Batch上并把运算结果存储在state source中。
执行aggregate方法做全局聚合。 当你用到 ReducerAggregator或Aggregator时,Stream首先被重定向到一个分区中。然后当中的聚合函数便在这个分区上执行。当你用到CombinerAggregator时,Trident会首先在每一个分区上做局部聚合。然后把局部聚合后的结果重定向到一个分区。因此使用CombinerAggregator会更高效。可能的话我们须要优先考虑使用它。
以下举个样例来说明怎样用aggregate进行全局计数:java mystream.aggregate(new Count(), new Fields("count"));和paritionAggregate一样,aggregators的聚合也能够串联起来。可是假设你把一个 CombinerAggregator和一个非CombinerAggregator串联在一起,Trident是无法完毕局部聚合优化的。
2.4 grouped streams
GroupBy操作是依据特定的字段对流进行重定向的,还有,在一个分区内部,每一个同样字段的tuple也会被Group到一起,以下这幅图描写叙述了这个场景:
假设你在grouped Stream上面执行aggregators,聚合操作会执行在每一个Group中而不是整个Batch。 persistentAggregate也能执行在GroupedSteam上,只是结果会被保存在MapState中。当中的key便是分组的字段。 当然。aggregators在GroupedStreams上也能够串联。
2.5 Merge和Joins:
api的最后一部分便是怎样把各种流汇聚到一起。最简单的方式就是把这些流汇聚成一个流。我们能够这么做:java topology.merge(stream1, stream2, stream3);还有一种合并流的方式就是join。
一个标准的join就像是一个sql,必须有标准的输入,因此,join仅仅针对符合条件的Stream。
join应用在来自Spout的每个小Batch中。join时候的tuple会包括:
1. join的字段,如Stream1中的key和Stream2中的x
2. 全部非join的字段,依据传入join方法的顺序,a和b分别代表steam1的val1和val2,c代表Stream2的val1
当join的是来源于不同Spout的stream时。这些Spout在发射数据时须要同步,一个Batch所包括的tuple会来自各个Spout。
关于Trident State 相关内容请參考【Trident State具体解释】
关于TridentAPI实践方面,请參考【Trident API实践】
Storm专题二:Storm Trident API 使用具体解释的更多相关文章
- Storm系列二: Storm拓扑设计
Storm系列二: Storm拓扑设计 在本篇中,我们就来根据一个案例,看看如何去设计一个拓扑, 如何分解问题以适应Storm架构,同时对Storm拓扑内部的并行机制会有一个基本的了解. 本章代码都在 ...
- Storm(二)CentOS7.5搭建Storm1.2.2集群
一.Storm的下载 官网下载地址:http://storm.apache.org/downloads.html 这里下载最新的版本storm1.2.2,进入之后选择一个镜像下载 二.Storm伪分布 ...
- Storm介绍(二)
作者:Jack47 转载请保留作者和原文出处 欢迎关注我的微信公众账号程序员杰克,两边的文章会同步,也可以添加我的RSS订阅源. 本文是Storm系列之一,主要介绍Storm的架构设计,推荐读者在阅读 ...
- Storm简介——初始Storm
一.什么是Storm Strom是由Twitter开源的类似于Hadoop的实时数据处理框架.Strom是分布式流式数据处理系统,强大的分布式集群管理.便捷的针对流式数据的编程模型.高容错保障这些都是 ...
- 1 storm基本概念 + storm编程规范及demo编写
本博文的主要内容有 .Storm的单机模式安装 .Storm的分布式安装(3节点) .No space left on device .storm工程的eclipse的java编写 http:// ...
- Storm 01之 Storm基本概念及第一个demo
2.1 Storm基本概念 在运行一个Storm任务之前,需要了解一些概念: Topologies :[tə'pɑ:lədʒɪ]拓扑结构 Streams Spouts:[spaʊt]喷出; 喷射; 滔 ...
- 百度网盘生成二维码api
分享出自精神,灵感来自大脑,在百度云网盘分享每一个文件,都会在页面生成一个二维码扫描的图片: 我就进一步看了该图片的地址: 发现没有,圈圈内是不是有点眼熟,就跟其他二维码api接口一样,只要盗用这段东 ...
- 实时数据处理环境搭建flume+kafka+storm:4.storm安装配置
1.解压 apache-storm-0.9.3.tar.gz 2.修改配置文件 conf/storm.yaml --zk地址 storm.zookeeper.servers: - " ...
- 【算法系列学习三】[kuangbin带你飞]专题二 搜索进阶 之 A-Eight 反向bfs打表和康拓展开
[kuangbin带你飞]专题二 搜索进阶 之 A-Eight 这是一道经典的八数码问题.首先,简单介绍一下八数码问题: 八数码问题也称为九宫问题.在3×3的棋盘,摆有八个棋子,每个棋子上标有1至8的 ...
随机推荐
- 有n个整数,使其前面各数顺序向后移n-m个位置,最后m个数变成最前面的m个数
题目:有n个整数,使其前面各数顺序向后移n-m个位置,最后m个数变成最前面的m个数 public class 第三十六题数组向后移m个位置 { public static void main(Stri ...
- 爬虫app信息抓取之apk反编译抓取
之前也抓过一些app,数据都比较好取,也没有研究的太深,毕竟还有android 模拟器+ appium 的方法.直到遇见了一款app ,具体名字就不说了,它安装在模拟器上竟然打不开 !!第一次遇见上网 ...
- Ubuntu16.04进入无限登录状态的解决办法
具体来说就是,输入密码之后又到了登录界面,无限循环(也许可能不能输入密码,这种状态我没有测试) 此方案仅适用于安装过NVIDIA显卡驱动的系统并且在登录界面会发现分辨率变了 如果你没有安装过NVIDI ...
- Codeforces 5D Follow Traffic Rules
[题意概述] 某个物体要从A途经B到达C,在通过B的时候速度不能超过vd. 它的加速度为a,最大速度为vm:AB之间距离为d,AC之间距离为L: 问物体最少花多少时间到达C. [题解] 分情况讨论. ...
- Android开发——流量统计
1. 获取应用UID 在设备的proc目录下我们可以看到一些比较熟悉的目录/文件,比如data,system,cpuinfo(获取CPU信息)等,其中uid_stat的各个以应用Uid命名的目录下,便 ...
- cxLookupCombobox的多字段模糊匹配
查了网上很多资料,懒人输入:通过程序使用过滤对话达到自己的目的: 用到cxFilter单元: cbb_DoctorOrder.Properties.View.DataController.Filter ...
- PC硬件以及引导加载器
PC 硬件 本文介绍供 x86 运行的个人计算机(PC)硬件平台. PC 是指遵守一定工业标准的计算机,它的目标是使得不同厂家生产的机器都能够运行一定范围内的软件.这些标准随时时间迁移不断变化,因此9 ...
- HDU-2509-Be the Winner,博弈题~~水过~~
Be the Winner Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) ht ...
- [codevs2495]水叮当的舞步
[codevs2495]水叮当的舞步 试题描述 水叮当得到了一块五颜六色的格子形地毯作为生日礼物,更加特别的是,地毯上格子的颜色还能随着踩踏而改变. 为了讨好她的偶像虹猫,水叮当决定在地毯上跳一支轻盈 ...
- POJ 2553 The Bottom of a Graph 【scc tarjan】
图论之强连通复习开始- - 题目大意:给你一个有向图,要你求出这样的点集:从这个点出发能到达的点,一定能回到这个点 思路:强连通分量里的显然都可以互相到达 那就一起考虑,缩点后如果一个点有出边,一定不 ...