storm源码分析(十)

MPQ Storm库 源码分析 一 MPQ是什么? wei'jihttp://en.wikipedia.org/wiki/MPQ 阅读详情


2021SC@SDUSC

NoneGrouping

不关注并行处理负载均衡策略时使用该方式,目前等同于Shuffle Grouping,另外Storm将会把bolt任务和他的上游提供数据的任务安排在同一个线程下。

  public static class NoneGrouping implements CustomStreamGrouping {
 
        private final Random random;
        private List<Integer> targetTasks;
        private int numTasks;
 
        public NoneGrouper() {
            random = new Random();
        }
 
        @Override
        public void prepare(WorkerTopologyContext context, GlobalStreamId stream, List<Integer> targetTasks) {
            this.targetTasks = targetTasks;
            this.numTasks = targetTasks.size();
        }
 
        @Override
        public List<Integer> chooseTasks(int taskId, List<Object> values) {
            int index = random.nextInt(numTasks);
            return Collections.singletonList(targetTasks.get(index));
        }
    }

这里通过random.nextInt(numTasks)随机取task

AllGrouping

广播发送,对于每一个tuple,所有的bolts都会收到 。

public static class AllGrouping implements CustomStreamGrouping {
 
        private List<Integer> targetTasks;
 
        @Override
        public void prepare(WorkerTopologyContext context, GlobalStreamId stream, List<Integer> targetTasks) {
            this.targetTasks = targetTasks;
        }
 
        @Override
        public List<Integer> chooseTasks(int taskId, List<Object> values) {
            return targetTasks;
        }
    }

这里返回所有的targetTasks。

PartialKeyGrouping

public class PartialKeyGrouping implements CustomStreamGrouping, Serializable {
    private static final long serialVersionUID = -1672360572274911808L;
    private List<Integer> targetTasks;
    private Fields fields = null;
    private Fields outFields = null;

    private AssignmentCreator assignmentCreator;
    private TargetSelector targetSelector;

    public PartialKeyGrouping() {
        this(null);
    }

    public PartialKeyGrouping(Fields fields) {
        this(fields, new RandomTwoTaskAssignmentCreator(), new BalancedTargetSelector());
    }

    public PartialKeyGrouping(Fields fields, AssignmentCreator assignmentCreator) {
        this(fields, assignmentCreator, new BalancedTargetSelector());
    }

    public PartialKeyGrouping(Fields fields, AssignmentCreator assignmentCreator, TargetSelector targetSelector) {
        this.fields = fields;
        this.assignmentCreator = assignmentCreator;
        this.targetSelector = targetSelector;
    }

    @Override
    public void prepare(WorkerTopologyContext context, GlobalStreamId stream, List<Integer> targetTasks) {
        this.targetTasks = targetTasks;
        if (this.fields != null) {
            this.outFields = context.getComponentOutputFields(stream);
        }
    }

    @Override
    public List<Integer> chooseTasks(int taskId, List<Object> values) {
        List<Integer> boltIds = new ArrayList<>(1);
        if (values.size() > 0) {
            final byte[] rawKeyBytes = getKeyBytes(values);

            final int[] taskAssignmentForKey = assignmentCreator.createAssignment(this.targetTasks, rawKeyBytes);
            final int selectedTask = targetSelector.chooseTask(taskAssignmentForKey);

            boltIds.add(selectedTask);
        }
        return boltIds;
    }

    private byte[] getKeyBytes(List<Object> values) {
        byte[] raw;
        if (fields != null) {
            List<Object> selectedFields = outFields.select(fields, values);
            ByteBuffer out = ByteBuffer.allocate(selectedFields.size() * 4);
            for (Object o : selectedFields) {
                if (o instanceof List) {
                    out.putInt(Arrays.deepHashCode(((List) o).toArray()));
                } else if (o instanceof Object[]) {
                    out.putInt(Arrays.deepHashCode((Object[]) o));
                } else if (o instanceof byte[]) {
                    out.putInt(Arrays.hashCode((byte[]) o));
                } else if (o instanceof short[]) {
                    out.putInt(Arrays.hashCode((short[]) o));
                } else if (o instanceof int[]) {
                    out.putInt(Arrays.hashCode((int[]) o));
                } else if (o instanceof long[]) {
                    out.putInt(Arrays.hashCode((long[]) o));
                } else if (o instanceof char[]) {
                    out.putInt(Arrays.hashCode((char[]) o));
                } else if (o instanceof float[]) {
                    out.putInt(Arrays.hashCode((float[]) o));
                } else if (o instanceof double[]) {
                    out.putInt(Arrays.hashCode((double[]) o));
                } else if (o instanceof boolean[]) {
                    out.putInt(Arrays.hashCode((boolean[]) o));
                } else if (o != null) {
                    out.putInt(o.hashCode());
                } else {
                    out.putInt(0);
                }
            }
            raw = out.array();
        } else {
            raw = values.get(0).toString().getBytes(); // assume key is the first field
        }
        return raw;
    }

    /*==================================================
     * Helper Classes
     *==================================================*/

    /**
     * 这个接口负责为给定的键选择目标任务的子集。
     */
    public interface AssignmentCreator extends Serializable {
        int[] createAssignment(List<Integer> targetTasks, byte[] key);
    }

    /**
     * 该接口从任务分配中选择一个元素来发送特定的Tuple。
     */
    public interface TargetSelector extends Serializable {
        Integer chooseTask(int[] assignedTasks);
    }

    /*========== Implementations ==========*/

    /**
     * AssignmentCreator的实现选择两个任意任务。
     */
    public static class RandomTwoTaskAssignmentCreator implements AssignmentCreator {
        /**
         * 通过选择随机任务来创建两个任务分配。
         */
        @Override
        public int[] createAssignment(List<Integer> tasks, byte[] key) {
        
            // 这需要产生一个基于密钥的确定性赋值。
            final long seedForRandom = Arrays.hashCode(key);
            final Random random = new Random(seedForRandom);
            final int choice1 = random.nextInt(tasks.size());
            int choice2 = random.nextInt(tasks.size());
            
            // 确保选项1和选项2不是同一个任务。
            choice2 = choice1 == choice2 ? (choice2 + 1) % tasks.size() : choice2;
            return new int[]{ tasks.get(choice1), tasks.get(choice2) };
        }
    }

    /**
     * A basic implementation of target selection. This strategy chooses the task within the assignment that has received the fewest Tuples
     * overall from this instance of the grouping.
     */
    public static class BalancedTargetSelector implements TargetSelector {
        private Map<Integer, Long> targetTaskStats = Maps.newHashMap();

        /**
         * 选择一个传入的任务,并选择到目前为止选择次数最少的任务。
         */
        @Override
        public Integer chooseTask(int[] assignedTasks) {
            Integer taskIdWithMinLoad = null;
            Long minTaskLoad = Long.MAX_VALUE;

            for (Integer currentTaskId : assignedTasks) {
                final Long currentTaskLoad = targetTaskStats.getOrDefault(currentTaskId, 0L);
                if (currentTaskLoad < minTaskLoad) {
                    minTaskLoad = currentTaskLoad;
                    taskIdWithMinLoad = currentTaskId;
                }
            }

            targetTaskStats.put(taskIdWithMinLoad, targetTaskStats.getOrDefault(taskIdWithMinLoad, 0L) + 1);
            return taskIdWithMinLoad;
        }
    }
}

在prepare的时候,初始化了long[] targetTaskStats用于统计每个task
partialKeyGrouping如果没有指定fields,则默认按outputFields的第一个field来计算。
BalancedTargetSelector根据选中的taskId,然后根据targetTaskStats计算taskIdWithMinLoad返回。
这里通过RandomTwoTaskAssignmentCreator来选中两个taskId,然后选择使用次数小的那个。
getKeyBytes()方法从输入的Tuple中提取键。

Storm原理与代码实例讲解 Storm原理与代码实例讲解 1.背景介绍 1.1 大数据处理的挑战 在当今大数据时代,海量数据的实时处理已成为许多企业面临的重大挑战。传统的批处理框架如Hadoop MapReduce已无法满足实时性要求,因此流式计算框架应运而生。 阅读详情

相关推荐

storm利用ack保证数据的可靠性源码

storm利用ack保证数据的可靠性,发送失败时进行重发,保证数据不丢失。

storm源码分析研究(二)

2021SC@SDUSC spout源码分析(一) 2021SC@SDUSC 文章目录spout源码分析(一)核心概念介绍ISpout.javaShellSpout.java 2021SC@SDUSC 核心概念介绍 1、结构: Spout是storm的核心组件之一,最源头的接口是IComponent。 2、发送: 当Spout从外部获取数据后,向Topology中发出的Tuple可以是可靠的,也可以是不可靠的。Spout可以发射多个流,可以定义多个流(即定义多个stream),也可以使用方法来发射指定的流。

qq_45849855的博客 450

storm源码包 apache-0.9.4

storm 源码包 apache 0.9.4 源码包 可以下载哦

Storm-源码分析汇总

Storm Features Storm 简介 Storm Topology的并发度 Storm - Guaranteeing message processing Storm - Transactional-topologies Twitter Storm – DRPC Storm 多语言支持 Storm Starter Storm starter - Overview ...

weixin_30369041的博客 268

Storm 源码分析

Storm 源码分析 - 李明,王晓鹏

ArcGIS属性表汉字转拼音

接着我安装了一个编辑器“PyCharm Community Edition 2019.3.3\bin\pycharm64.exe”,在里面添加“pypinyin”包,然后将其设置为arcgis的编辑器和调试程序,还是失败;我在10.6的机器上折腾了上面几步,直到两周后脚本突然运行成功,我也不确定是哪一步导致pypinyin包配置成功,因此将心得体会写出来,如果过一段时间,打开10.2的机器运行脚本成功了,再写后续.......,按照“配置方法1:”进行尝试,显示配置失败。

2301_77413856的博客 1295

Storm-源码分析-Topology Submit-Task

mk-task, 比较简单, 因为task只是概念上的结构, 不象其他worker, executor都需要创建进程或线程 所以其核心其实就是mk-task-data, 1. 创建TopologyContext对象, 其实就是把之前的topology对象和worker-data混合到一起, 便于task在执行时可以取到需要的topology信息. 2. 创建task-obje...

weixin_34034261的博客 151

LangChain4j 开发

市场上主流的 Java 调用大模型的工具库有两种:LangChain4j 是一个 面向 Java 的开源框架,用于构建 基于大语言模型(LLMs) 的应用程序。它是 LangChain(Python 生态中非常流行的 LLM 应用框架)的 Java 实现,旨在让 Java 开发者能够轻松地集成和使用各种 LLM 服务,快速开发 智能聊天机器人、智能搜索、文档问答、Agent系统 等 AI 驱动的应用。官网文档:https://docs.langchain4j.dev/。引入依赖(JDK17 及以上): 构建

m0_62943934的博客 2795

storm源码分析(十三)

文章目录TridentTopologygenBoltIdsaddSourceNode()addNode()TridentTopologyBuildersetSpout()setBolt()buildTopology() 2021SC@SDUSC TridentTopology genBoltIds 生成bolt的名称。 private static Map<Group, String> genBoltIds(Collection<Group> groups) { Map&lt

null_wry的博客 312

C++网络编程 - Boost::asio异步网络编程 - 01- boost库源码编译安装

知识的学习在于点滴记录,坚持不懈;知识的学习要有深度和广度,不能只流于表面,坐井观天;知识要善于总结,不仅能够理解,更知道如何表达! 目录 如果需要录屏资料,请私信邮箱shitou3000@qq.com获取。 ...

大秦坑王的专栏 1万+

银河麒麟V10 SP3离线安装Nginx1.21.5全记录(附11个rpm包下载清单)

本文详细记录了在银河麒麟V10 SP3操作系统上离线安装Nginx 1.21.5的全过程,包括11个必备rpm包的下载清单。通过分步骤的实战指南,帮助用户在国产化环境中高效部署Nginx服务,涵盖安装、配置、调优及故障排查等关键环节,特别适合金融、政务等对安全性要求高的场景。

weixin_30872337的博客 606

storm源码分析研究(十)

2021SC@SDUSC Trident的Spout节点分析 2021SC@SDUSC Trident是Storm提供给用户的另外一套接口,它提供了基本的流处理功能以及可靠的消息处理功能,其中对流的操作是Trident的核心。 Trident主要支持两种类型的Spout节点:ITridentSpout以及DRPC Spout。对于Storm中其他基本类型的Spout , 例如IRichSpout和IBatchSpout,Trident进行了接口适配,将它们适配成为ITridentSpout接口并在Topol

qq_45849855的博客 210

C#通过Aforge调用电脑摄像头(附代码)

C#标准库本身不带有能调用电脑摄像头的库,如果利用windows自身的API来实现的话,着实有些麻烦。Aforge这个第三方库能很好的实现调用、处理的功能。 PS:文末给大家分享了完整的项目源码,各位最好先下载下来,对照着来看 1、先看一下效果 2、Aforge介绍 AForge.NET是一个专门为开发者和研究者基于C#框架设计的,这个框架提供了不同的类库和关于类库的资源,还有很多应用程序例子,包括计算机视觉与人工智能,图像处理,神经网络,遗传算法,机器学习,机器人等领域。 3、我使用的开发环境 操作系统

weixin_44996090的博客 1万+

【源码分析】storm拓扑运行全流程源码分析

【源码分析】storm拓扑运行全流程源码分析@(STORM)[storm]源码分析storm拓扑运行全流程源码分析 一拓扑提交流程 一stormpy 1storm jar 2def jar 3exec_storm_class 4get_classpath 二拓扑提交之一 1用户代码调用submitTopology 2StormSubmittersubmitTopologyWithProgressBa

jediael_lu的专栏 3193

3D Slicer中文教程(三)—数据加载及保存方式

1.打开数据与保存数据 (1)打开数据 ——可以将数据拖拽到3D Slicer应用窗口或者从菜单栏工具栏打开。 ——多种方式加载大量数据。 有关DICOM数据,请参阅DICOM模块文档。 对于几乎所有其他(包括场景),您可以使用添加数据对话框。 有关支持的数据格式的列表,请参阅此列表。 请注意,仅部分支持列出的某些格式。 ——对于一些更复杂的格式(特别是DWI),建议首先使用DICOM到n...

weixin_33676492的博客 5536

[逆向实战] 淘宝x5sec滑条验证码slidedata参数逆向与自动化过码方案

本文详细解析了淘宝x5sec滑条验证码的核心参数slidedata的生成机制与逆向过程,提供了Python自动化过码方案。通过分析滑动轨迹加密流程、还原AES加密算法,并设计人类行为模拟轨迹,帮助开发者有效绕过淘宝滑块验证,适用于爬虫开发与自动化测试场景。

weixin_30851867的博客 735

Storm源码分析之四: Trident源码分析

Storm源码分析之四: Trident源码分析@(STORM)[storm]Storm源码分析之四 Trident源码分析 一概述0小结 1简介 2关键类 1Spout的创建 2spout的消息流 3spout调用的整体流程 4spout如何被 加载到拓扑中 二Spout 一Spout的创建 1ItridentSpout 2BatchCoordinator 3Emmitter 4一个示例 二spo

jediael_lu的专栏 2581

ZYNQ PS裸机开发RS485

RS485 是一种通用的通信标准,广泛用于数据采集和控制应用中。它的主要优点之一是它允许将多个 RS485 设备放在同一条总线上,这使得多个节点可以相互连接。RS-485是美国电子工业协会(EIA)在1983年批准了一个新的平衡传输标准(balanced transmission standard),EIA一开始将RS(Recommended Standard)做为标准的前缀,不过后来为了便于识别标准的来源,已将RS改为EIA/TIA。

baidu_34971492的博客 831

storm-kafka源码分析

storm-kafka源码分析@(KAFKA)[kafka, 大数据, storm]storm-kafka源码分析 一概述 一代码结构 二orgapachestormkafka 三orgapachestormkafkatrident 1spout 2state 3metric 四其它说明 1线程与分区 二orgapachestormkafka 一基础类 1Broker 2BrokerHosts 3P

jediael_lu的专栏 4881

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

storm源码分析

文章目录Storm源码分析 (一) 综述一、storm介绍二、storm组件ZookeeperSpoutBoltStream Groupings三、任务分配 2021SC@SDUSC Storm源码分析 (一) 综述 2021SC@SDUSC 一、storm介绍 Storm是一个开源的,分布的,可靠的,容错的数据流处理系统。Storm有很多使用场景:如实时分析,在线机器学习,持续计算,分布式RPC,ETL等等。Storm支持水平扩展,具有高容错性,保证每个消息都会得到处理,而且处理速度很快(在一个小集群中,

null_wry的博客 829

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

storm之ack实现机制及源码分析

一. 前言 最近公司因为内部项目调动,我们组接收一个维护storm的任务,看代码流程都是通过ACK机制来保证从spout发出tuple在后面的各个环节已经全部执行成功。自己也好奇是怎么实现的呢? 毕竟storm程序同时处理很多个tuple,更要命的是一个tuple可能被切分成多个tuple,而且会切分成多少个tuple并不知道(e.g. 根据某个标识符进行split("特殊标识"...

lidaxue_heart的专栏 522

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

storm源码分析之topology提交过程

storm集群上运行的是一个个topology,一个topology是spouts和bolts组成的图。当我们开发完topology程序后将其 打成jar包,然后在shell中执行storm jar xxxxxx.jar xxxxxxxClass就可以将jar包上传到storm集群的nimbus上, 并执行topology。本文主要分析下topology的jar包是如何上传到nimbus上的。

ierbar0604的专栏 3712

storm源码分析(三)

文章目录一、ACLs权限权限维度1.scheme2.id3.permission二、代码分析verifyAcls()方法getTopoAcl()方法 2021SC@SDUSC AclEnforcement类,这是用于执行ZK acl的类。 我们首先介绍一些关于ACLs权限的知识。 一、ACLs权限 权限 1) CREATE: 创建权限,可以在在当前node下创建child node 2) DELETE(d): 删除权限,可以删除当前的node 3) READ: 读权限,可以获取当前node的数据,可以lis

null_wry的博客 482

storm源码分析研究(七)

2021SC@SDUSC bolt源码分析(二) 2021SC@SDUSC JoinBolt源码总体介绍 JoinBolt继承了BaseWindowedBolt,定义了Selector selectorType、LinkedHashMap<String, JoinInfo> joinCriteria、FieldSelector[] outputFields等属性,用于记录关联类型及关联关系 join、leftJoin方法用于设置join关联关系,最后都是调用joinCommon方法,关联关系使用

qq_45849855的博客 1528

Storm入口源码分析

Storm源码入口分析: Storm入口是由Python写的,它负责处理提交命令,通过分析用户提交的命令,调用不同的后台函数来进行处理。 首先在Storm.py当中,由main函数负责执行,一下为main函数代码:def main(): if len(sys.argv) <= 1: print_usage() sys.exit(-1)

My_Njz的博客 1026
上一篇: storm源码分析(九)
下一篇: storm源码分析(十一)
null_wry
博客等级 码龄7年 276粉丝 13原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值