测试Storm的多源头锚定

本文介绍了一个使用Apache Storm实现的基本流处理案例。该案例通过Spout发送数据,经过Bolt进行处理,展示了如何在Storm中配置拓扑、设置消息确认机制等关键步骤。此外,还分析了当某个消息处理失败时,Storm是如何回溯并重新处理这些消息的。

过程,

Spout 发送msgid 1-10

一级Bolt, msgid1的tuple做为基本组合tuple, 其他8个和一组合, 然后发送给二级Bolt, 同时单个msgid对应的tuple都ack一次,msgid1对象tuple, acker将会跟踪8个二级bolt处理情况.

二级Bolt,发送ack fail(模拟处理失败)

结果:在spout fail下出现msg1-9都失败的情况 .

拓扑代码

package storm.starter;

import backtype.storm.Config;
import backtype.storm.LocalCluster;
import backtype.storm.LocalDRPC;
import backtype.storm.StormSubmitter;
import backtype.storm.drpc.DRPCSpout;
import backtype.storm.task.OutputCollector;
import backtype.storm.task.ShellBolt;
import backtype.storm.task.TopologyContext;
import backtype.storm.topology.BasicOutputCollector;
import backtype.storm.topology.IRichBolt;
import backtype.storm.topology.OutputFieldsDeclarer;
import backtype.storm.topology.TopologyBuilder;
import backtype.storm.topology.base.BaseBasicBolt;
import backtype.storm.tuple.Fields;
import backtype.storm.tuple.Tuple;
import backtype.storm.tuple.Values;
import storm.starter.spout.RandomSentenceSpout;

import java.lang.management.ManagementFactory;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.apache.log4j.Logger;
import org.apache.log4j.PropertyConfigurator;

/**
 * This topology demonstrates Storm's stream groupings and multilang
 * capabilities.
 */
public class WordCountTopology {
	public static String GetThreadName() {
		Thread thread = Thread.currentThread();
		return thread.getName();
	}

	public static final Logger logger = Logger
			.getLogger(WordCountTopology.class);

	// 切分单词 一级bolt
	/*
	 * public static class SplitSentence extends ShellBolt implements IRichBolt
	 * { public SplitSentence() { super("python", "splitsentence.py");
	 * logger.error(GetThreadName() + "SplitSentence create"); }
	 * 
	 * // 定义字段发送
	 * 
	 * @Override public void declareOutputFields(OutputFieldsDeclarer declarer)
	 * { declarer.declare(new Fields("word")); logger.error(GetThreadName() +
	 * "declarer.declare(new Fields(word))"); }
	 * 
	 * @Override public Map<String, Object> getComponentConfiguration() {
	 * logger.error("getComponentConfiguration"); return null; } }
	 */
	public static class SplitSentence implements IRichBolt {
		private OutputCollector _collector;
		
		int num = 0;
		@Override
		public void prepare(Map stormConf, TopologyContext context,
				OutputCollector collector) {
			_collector = collector;
		}
		
		private Tuple tuple1;
		@Override
		public void execute(Tuple tuple) {
			String sentence = tuple.getString(0);
		    if(sentence.equals("a")) {
		    	tuple1 = tuple;
		    }
		    else{
		    	List<Tuple> anchors = new ArrayList<Tuple>();
		    	anchors.add(tuple1);
		    	anchors.add(tuple);
		    	_collector.emit(anchors, new Values(sentence + "a"));
		    	_collector.ack(tuple);
		    	_collector.ack(tuple1);
		    }
			
//			for (String word : sentence.split(" ")){
//				_collector.emit(tuple, new Values(word));
//			}
//			num++;
			
			System.out.println("Bolt Thread " + Thread.currentThread().getName() + "recve : " + sentence);	
			System.out.println( num + " bolt recev:" + tuple.getMessageId().getAnchorsToIds());			
		}

		@Override
		public void cleanup() {
		}

		@Override
		public void declareOutputFields(OutputFieldsDeclarer declarer) {
			declarer.declare(new Fields("word"));
		}

		@Override
		public Map<String, Object> getComponentConfiguration() {
			// TODO Auto-generated method stub
			return null;
		}
	}
	
	public static class CountCount1 implements IRichBolt {
		Map<String, Integer> counts = new HashMap<String, Integer>();
		private OutputCollector _collector;
		int num = 0;

		@Override
		public void execute(Tuple tuple) {
			String word = tuple.getString(0);
			//logger.error(this.toString() + "word = " + word);
			Integer count = counts.get(word);
			if (count == null)
				count = 0;
			
			count++;
			counts.put(word, count); 
			num++;
			
			_collector.fail(tuple);
			//_collector.ack(tuple);
			
		   //_collector.emit(tuple, new Values(word, count));
		}

		@Override
		public void declareOutputFields(OutputFieldsDeclarer declarer) {
			// logger.error("declareOutputFields :");
			declarer.declare(new Fields("result", "count"));
		}

		@Override
		public void prepare(Map stormConf, TopologyContext context,
				OutputCollector collector) {
			// TODO Auto-generated method stub
			_collector = collector;
		}

		@Override
		public void cleanup() {
			// TODO Auto-generated method stub
			
		}

		@Override
		public Map<String, Object> getComponentConfiguration() {
			// TODO Auto-generated method stub
			return null;
		}
	}
	
	
	public static class WordCount extends BaseBasicBolt {
		private OutputCollector _collector;
		Map<String, Integer> counts = new HashMap<String, Integer>();

		@Override
		public void execute(Tuple tuple, BasicOutputCollector collector) {
			String word = tuple.getString(0);
			//logger.error(this.toString() + "word = " + word);
			Integer count = counts.get(word);
			if (count == null)
				count = 0;
			count++;
			counts.put(word, count); // <key, list<value, count> >
			//logger.error(this.toString() + "count = " + count);
			collector.emit(new Values(word, count));
		}

		@Override
		public void declareOutputFields(OutputFieldsDeclarer declarer) {
			// logger.error("declareOutputFields :");
			declarer.declare(new Fields("result", "count"));
		}
	}

	public static class WordCount1 extends BaseBasicBolt {
		Map<String, Integer> counts = new HashMap<String, Integer>();

		@Override
		public void execute(Tuple tuple, BasicOutputCollector collector) {
			// logger.error("WordCount1");
			// tuple.getFields()[0];
			if (tuple.getFields().contains("result")) {
				String count = (String) tuple.getValueByField("result");
				// tuple.getValueByField(field)
				long countl = -0;// = Long.valueOf(count);
				// logger.error(this.toString() + " key  = resultkey " + count);
			}

			if (tuple.getFields().contains("count")) {
				Integer count = (Integer) tuple.getValueByField("count");
				// tuple.getValueByField(field)
				long countl = -0;// = Long.valueOf(count);
				//logger.error(this.toString() + " key  = count " + count);
			}

			// String word = tuple.getString(0);
			// logger.error(this.toString() +"word = " + word);
			// Integer count = counts.get(word);
			// if (count == null)
			// count = 0;
			// count++;
			// counts.put(word, count);
			// logger.error(this.toString() + "count = " + count);
			// collector.emit(new Values(word, count));
		}

		@Override
		public void declareOutputFields(OutputFieldsDeclarer declarer) {
			// logger.error("declareOutputFields :");
			declarer.declare(new Fields("word1", "count1"));
		}
	}

	public static void main(String[] args) throws Exception {
		TopologyBuilder builder = new TopologyBuilder();

		PropertyConfigurator
				.configure("/home/hadoop/code1/Kafka/src/Log4j.properties");
		
	    // parallelism_hint 代表是executor数量, setNumTasks 代表Tasks数量
		builder.setSpout("spout", new RandomSentenceSpout(), 5).setNumTasks(2);

        builder.setBolt("split", new SplitSentence(), 8).setNumTasks(1).shuffleGrouping("spout");
		builder.setBolt("count", new CountCount1(), 12).fieldsGrouping("split",
				new Fields("word"));
//		builder.setBolt("WordCount1", new WordCount1(), 1).fieldsGrouping(
//				"count", new Fields("result", "count"));

		Config conf = new Config();
		conf.setDebug(true);
                //  这个设置一个spout task上面最多有多少个没有处理(ack/fail)的tuple,防止tuple队列过大, 只对可靠任务起作用 conf.setMaxSpoutPending(2); conf.setMessageTimeoutSecs(5); // 消息处理延时 conf.setNumAckers(2); // 消息处理acker System.out.println("args.length = " + args.length); if (args != null && args.length > 0) { conf.setNumWorkers(5); // 设置工作进程 StormSubmitter.submitTopology(args[0], conf, builder.createTopology()); } else { // 每个组件的最大executor数 conf.setMaxTaskParallelism(1); conf.setDebug(true); LocalCluster cluster = new LocalCluster(); cluster.submitTopology("word-count", conf, builder.createTopology()); String str = "testdrpc"; // drpc.execute("testdrpc", str); Thread.sleep(1088000); cluster.shutdown(); } } }

 spout代码

package storm.starter.spout;

import backtype.storm.spout.SpoutOutputCollector;
import backtype.storm.task.TopologyContext;
import backtype.storm.topology.OutputFieldsDeclarer;
import backtype.storm.topology.base.BaseRichSpout;
import backtype.storm.tuple.Fields;
import backtype.storm.tuple.Values;
import backtype.storm.utils.Utils;

import java.util.Map;
import java.util.Random;

import org.apache.log4j.Logger;

import storm.starter.WordCountTopology;


// IRichSpout 
public class RandomSentenceSpout extends BaseRichSpout { 
	SpoutOutputCollector _collector;
	Random _rand;

	public static final Logger logger = Logger
			.getLogger(RandomSentenceSpout.class);

	@Override
	public void open(Map conf, TopologyContext context,
			SpoutOutputCollector collector) {
		_collector = collector;
		_rand = new Random();

		WordCountTopology.logger.error(this.toString()
				+ "RandomSentenceSpout is create");
	}

	private int num = 0;

	private String gettmstr() {
		StringBuilder tmp = new StringBuilder();
		for (int i = 0; i <= num; i++)
			tmp.append("a");
		num++;
		return tmp.toString();
	}

	@Override
	public void nextTuple() {
		Utils.sleep(200);
		// String[] sentences = new String[]{ "the cow jumped over the moon",
		// "an apple a day keeps the doctor away",
		// "four score and seven years ago", "snow white and the seven dwarfs",
		// "i am at two with nature" };
		String[] sentences = new String[] { "A" };

		String sentence = gettmstr(); // sentences[_rand.nextInt(sentences.length)];
		if (num < 10) {
			_collector.emit(new Values(sentence), new Integer(num));
			// logger.error(this.toString() + "send sentence = " + sentence);
		   // System.out.println(Thread.currentThread().getName() + " Spout ");
		}
	}

	@Override
	public void ack(Object id) {
		logger.error(this.toString() + "spout ack =" + (Integer)id);
	}

	@Override
	public void fail(Object id) {
		logger.error("spout fail =" + (Integer)id);
	}

	@Override
	public void declareOutputFields(OutputFieldsDeclarer declarer) {
		declarer.declare(new Fields("word"));
	}

}

 运行结果

2014-10-03 21:17:31,149 ERROR (storm.starter.spout.RandomSentenceSpout:71) - spout fail =1
2014-10-03 21:17:31,351 ERROR (storm.starter.spout.RandomSentenceSpout:71) - spout fail =2
Bolt Thread Thread-22recve : aaa
0 bolt recev:{-3139141336114052337=7131499433188364504}
2014-10-03 21:17:31,552 ERROR (storm.starter.spout.RandomSentenceSpout:71) - spout fail =3
Bolt Thread Thread-22recve : aaaa
0 bolt recev:{-4497680640148241887=-615828348570847097}
2014-10-03 21:17:31,754 ERROR (storm.starter.spout.RandomSentenceSpout:71) - spout fail =4
Bolt Thread Thread-22recve : aaaaa
0 bolt recev:{-8878772617767839827=-7708082520013359311}
2014-10-03 21:17:31,957 ERROR (storm.starter.spout.RandomSentenceSpout:71) - spout fail =5
Bolt Thread Thread-22recve : aaaaaa
0 bolt recev:{-3995020874692495577=-5070846720162762196}
2014-10-03 21:17:32,160 ERROR (storm.starter.spout.RandomSentenceSpout:71) - spout fail =6
Bolt Thread Thread-22recve : aaaaaaa
0 bolt recev:{-5994700617723404155=-3738685841476816404}
2014-10-03 21:17:32,362 ERROR (storm.starter.spout.RandomSentenceSpout:71) - spout fail =7
Bolt Thread Thread-22recve : aaaaaaaa
0 bolt recev:{-2308734827213127682=-5719708045753233056}
2014-10-03 21:17:32,563 ERROR (storm.starter.spout.RandomSentenceSpout:71) - spout fail =8
Bolt Thread Thread-22recve : aaaaaaaaa
0 bolt recev:{-3718844156917119468=-6359724009048981605}
2014-10-03 21:17:32,766 ERROR (storm.starter.spout.RandomSentenceSpout:71) - spout fail =9

 

转载于:https://www.cnblogs.com/chengxin1982/p/4005359.html

标题SpringBoot智能在线预约挂号系统研究AI更换标题第1章引言介绍智能在线预约挂号系统的研究背景、意义、国内外研究现状及论文创新点。1.1研究背景与意义阐述智能在线预约挂号系统对提升医疗服务效率的重要性。1.2国内外研究现状分析国内外智能在线预约挂号系统的研究与应用情况。1.3研究方法及创新点概述本文采用的技术路线、研究方法及主要创新点。第2章相关理论总结智能在线预约挂号系统相关理论,包括系统架构、开发技术等。2.1系统架构设计理论介绍系统架构设计的基本原则和常用方法。2.2SpringBoot开发框架理论阐述SpringBoot框架的特点、优势及其在系统开发中的应用。2.3数据库设计与管理理论介绍数据库设计原则、数据模型及数据库管理系统。2.4网络安全与数据保护理论讨论网络安全威胁、数据保护技术及其在系统中的应用。第3章SpringBoot智能在线预约挂号系统设计详细介绍系统的设计方案,包括功能模块划分、数据库设计等。3.1系统功能模块设计划分系统功能模块,如用户管理、挂号管理、医生排班等。3.2数据库设计与实现设计数据库表结构,确定字段类型、主键及外键关系。3.3用户界面设计设计用户友好的界面,提升用户体验。3.4系统安全设计阐述系统安全策略,包括用户认证、数据加密等。第4章系统实现与测试介绍系统的实现过程,包括编码、测试及优化等。4.1系统编码实现采用SpringBoot框架进行系统编码实现。4.2系统测试方法介绍系统测试的方法、步骤及测试用例设计。4.3系统性能测试与分析对系统进行性能测试,分析测试结果并提出优化建议。4.4系统优化与改进根据测试结果对系统进行优化和改进,提升系统性能。第5章研究结果呈现系统实现后的效果,包括功能实现、性能提升等。5.1系统功能实现效果展示系统各功能模块的实现效果,如挂号成功界面等。5.2系统性能提升效果对比优化前后的系统性能
在金融行业中,对信用风险的判断是核心环节之一,其结果对机构的信贷政策和风险控制策略有直接影响。本文将围绕如何借助机器学习方法,尤其是Sklearn工具包,建立用于判断信用状况的预测系统。文中将涵盖逻辑回归、支持向量机等常见方法,并通过实际操作流程进行说明。 一、机器学习基本概念 机器学习属于人工智能的子领域,其基本理念是通过数据自动学习规律,而非依赖人工设定规则。在信贷分析中,该技术可用于挖掘历史数据中的潜在规律,进而对未来的信用表现进行预测。 二、Sklearn工具包概述 Sklearn(Scikit-learn)是Python语言中广泛使用的机器学习模块,提供种数据处理和建模功能。它简化了数据清洗、特征提取、模型构建、验证与优化等流程,是数据科学项目中的常用工具。 三、逻辑回归模型 逻辑回归是一种常用于分类任务的线性模型,特别适用于二类问题。在信用评估中,该模型可用于判断借款人是否可能违约。其通过逻辑函数将输出映射为0到1之间的概率值,从而表示违约的可能性。 四、支持向量机模型 支持向量机是一种用于监督学习的算法,适用于数据维度高、样本量小的情况。在信用分析中,该方法能够通过寻找最佳分割面,区分违约与非违约客户。通过选用不同核函数,可应对复杂的非线性关系,提升预测精度。 五、数据预处理步骤 在建模前,需对原始数据进行清理与转换,包括处理缺失值、识别异常点、标准化数值、筛选有效特征等。对于信用评分,常见的输入变量包括收入水平、负债比例、信用历史记录、职业稳定性等。预处理有助于减少噪声干扰,增强模型的适应性。 六、模型构建与验证 借助Sklearn,可以将数据集划分为训练集和测试集,并通过交叉验证调整参数以提升模型性能。常用评估指标包括准确率、召回率、F1值以及AUC-ROC曲线。在处理不平衡数据时,更应关注模型的召回率与特异性。 七、集成学习方法 为提升模型预测能力,可采用集成策略,如结合个模型的预测结果。这有助于降低单一模型的偏差与方差,增强整体预测的稳定性与准确性。 综上,基于机器学习的信用评估系统可通过Sklearn中的种算法,结合合理的数据处理与模型优化,实现对借款人信用状况的精准判断。在实际应用中,需持续调整模型以适应市场变化,保障预测结果的长期有效性。 资源来源于网络分享,仅用于学习交流使用,请勿用于商业,如有侵权请联系我删除!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值