SparkStreaming和Drools结合的HelloWord版
关于sparkStreaming的测试Drools框架结合版
package com.dinpay.bdp.rcp.service; import java.math.BigDecimal;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Arrays;
import java.util.Date; import org.apache.commons.lang3.StringUtils;
import org.apache.log4j.Level;
import org.apache.log4j.Logger;
import org.apache.spark.SparkConf;
import org.apache.spark.api.java.JavaPairRDD;
import org.apache.spark.api.java.function.FlatMapFunction;
import org.apache.spark.api.java.function.PairFunction;
import org.apache.spark.api.java.function.VoidFunction;
import org.apache.spark.api.java.function.VoidFunction2;
import org.apache.spark.streaming.Durations;
import org.apache.spark.streaming.Time;
import org.apache.spark.streaming.api.java.JavaDStream;
import org.apache.spark.streaming.api.java.JavaPairDStream;
import org.apache.spark.streaming.api.java.JavaReceiverInputDStream;
import org.apache.spark.streaming.api.java.JavaStreamingContext;
import org.kie.api.KieServices;
import org.kie.api.runtime.KieContainer;
import org.kie.api.runtime.KieSession; import com.dinpay.bdp.rcp.metaq.MetaQReceiver;
import com.dinpay.bdp.rcp.streaming.StreamingUtil;
import com.dinpay.bdp.rcp.util.CodisUtil;
import com.dinpay.bdp.rcp.util.Constant;
import com.dinpay.dpp.rcp.po.Order; import redis.clients.jedis.Jedis;
import scala.Tuple2; /**
* 同卡号单日最大交易金额测试
* @author ll-t150
*
*/
public class SparkDroolsTest { public static Logger logger = Logger.getLogger(SparkDroolsTest.class);
public static final DateFormat df = new SimpleDateFormat("yyyyMMdd"); public static void main(String[] args) {
String zkConnect=Constant.METAZK;
String zkRoot="/meta";
String topic=Constant.ORDERTOPIC;
String group=Constant.STREAMGROUP;
//屏蔽日志
Logger.getLogger("org.apache.spark").setLevel(Level.OFF);
logger.info("metaq configuration:"+zkConnect+"--"+topic+"--"+group);
SparkConf sparkConf = new SparkConf().setAppName("SparkDroolsTest").setMaster("local[2]");
JavaStreamingContext ssc = new JavaStreamingContext(sparkConf, Durations.seconds(1));
//从metaq取消息
JavaReceiverInputDStream<Order> lines = ssc.receiverStream(new MetaQReceiver(zkConnect,zkRoot,topic,group)); JavaDStream<Order> words = lines.flatMap(new FlatMapFunction<Order, Order>() {
@Override
public Iterable<Order> call(Order order) throws Exception {
return Arrays.asList(new Order[]{order});
}
}); //同卡号单日交易最大次数 统计包括成功和未成功的订单
JavaPairDStream<String, Integer> cardCntPairs = getCardJavaPair(words);
save2Codis(cardCntPairs);
ssc.start();
ssc.awaitTermination();
ssc.close();
} @SuppressWarnings({ "unchecked", "serial" })
public static <T> JavaPairDStream<String, T> getCardJavaPair(JavaDStream<Order> words){
JavaPairDStream<String, T> pairs = null;
//次数统计
pairs = (JavaPairDStream<String, T>) words.mapToPair(new PairFunction<Order, String, Integer>() {
@Override
public Tuple2<String, Integer> call(Order order) {
Jedis jedis = CodisUtil.getJedisPool().getResource();
String cardCntkey = order.getSystemId()+"_CNT_"+order.getPayerCardNo()+"_"+df.format(new Date());
//拼接key,先到codis里面查找对应的key是否存在,若存在就直接取对应的值,然后取值加1
String value = jedis.get(cardCntkey);
if (StringUtils.isEmpty(value)) {
return new Tuple2<String, Integer>(cardCntkey, 1);
} else {
return new Tuple2<String, Integer>(cardCntkey, Integer.parseInt(value) + 1);
}
}
});
return pairs;
} /**
* 将计算出的数据保存到codis中
* @param pair
*/
@SuppressWarnings("serial")
public static <T> void save2Codis(JavaPairDStream<String, T> pair) {
pair.foreachRDD(new VoidFunction2<JavaPairRDD<String,T>,Time>() {
@Override
public void call(JavaPairRDD<String, T> rdd, Time time) throws Exception {
rdd.foreach(new VoidFunction<Tuple2<String,T>>() {
@Override
public void call(Tuple2<String, T> tp) throws Exception {
Jedis jedis = CodisUtil.getJedisPool().getResource();
jedis.set(tp._1(), String.valueOf(tp._2()));
logger.info(tp._1() + ">>>" + tp._2()+",保存到Codis完成!");
KieServices kieServices = KieServices.Factory.get();
KieContainer kieContainer = kieServices.getKieClasspathContainer();
KieSession kieSession = kieContainer.newKieSession("helloworld");
ChannAmount objectChannel = new ChannAmount();
objectChannel.setAmount(Integer.parseInt(String.valueOf(tp._2())));
objectChannel.setChannel(tp._1());
kieSession.insert(objectChannel);
kieSession.fireAllRules();
if(jedis !=null){
jedis.close();
}
}
});
}
});
} }
关于配置文件的设置
kmodule.xml文件
<?xml version="1.0" encoding="UTF-8"?>
<kmodule xmlns="http://jboss.org/kie/6.0.0/kmodule">
<kbase name="rules" packages="rules">
<ksession name="helloworld"/>
</kbase>
<kbase name="dtables" packages="dtables">
<ksession name="ksession-dtables"/>
</kbase>
<kbase name="process" packages="process">
<ksession name="ksession-process"/>
</kbase>
</kmodule>
riskMonitor.drl内容
package rules; import com.dinpay.bdp.rcp.service.ChannAmount;
//其中m为对象objectChannel 的引用
rule "channel"
when
ChannAmount(amount>2)
then
System.out.println("Drools规则实现:该渠道最近5分钟交易金额超过2次 ");
end
测试OK!
SparkStreaming和Drools结合的HelloWord版的更多相关文章
- C#.NET开源项目、机器学习、商务智能
所以原谅我,不能把所有的都发上来,太杂了,反而不好. 1..NET时间周期处理组件 这个组件很小,主要是对时间日期,特别是处理时间间隔以及时间范围非常方便.虽然.NET自带了时间日期的部分功能,但可能 ...
- 规则引擎 - drools 使用讲解(简单版) - Java
drools规则引擎 项目链接 现状: 运维同学(各种同学)通过后台管理界面直接配置相关规则,这里是通过输入框.下拉框等完成输入的,非常简单: 规则配置完毕后,前端请求后端,此时服务端根据参数(即规则 ...
- Drools的HelloWord例子
添加drools框架运行的依赖 <!--Drools 规则相关 --> <dependency> <groupId>org.drools</groupId&g ...
- Drools规则引擎入门指南(三)——使用Docker部署Workbench
其实本来我也是打算使用Tomcat来部署Workbench的,但是在网上看了几篇文章,超级繁琐的配置.各种版本.实在看不下去了索性就直接使用Docker来部署了.本次部署的版本是最新稳定版,对应dro ...
- Drools 规则学习
Drools 规则学习 在 Drools 当中,一个标准的规则文件就是一个以“.drl”结尾的文本文件,由于它是一个标准的文本文件,所以可以通过一些记事本工具对其进行打开.查看和编辑.规则是放在规则文 ...
- spark发行版笔记9
感谢DT大数据梦工厂支持提供技术支持,DT大数据梦工厂专注于Spark发行版定制. 本期概览: 1 Receiver生命全周期 首先,我们找到数据来源的入口,入口如下 Receiver的设计是极其巧妙 ...
- spark发行版笔记4Spark Streaming事务处理彻底掌握
Spark Streaming事务处理彻底掌握 感谢DT大数据梦工厂支持提供以下内容,DT大数据梦工厂专注于Spark发行版定制. 内容概括: 1Exactly once 2 输出不重复 1 正如银行 ...
- Android环境配置及运行helloWord案例
Android的环境搭建步骤,以及输出一个helloWorder 1:下载Android开发环境 及是: SDK adt-bundle-windows-x86_64-20140702 此时的版 ...
- Java面试宝典2013版(超长版)
一. Java基础部分......................................................................................... ...
随机推荐
- Python获取程序运行目录和脚本目录
Python获取程序运行目录和脚本目录 import os import sys #获取脚本所在目录 print os.path.split( os.path.realpath( sys.argv[0 ...
- BZOJ 1015:[JSOI2008]星球大战starwar(逆向处理+并查集)
[JSOI2008]星球大战starwar 时间限制: 3 Sec 内存限制: 162 MB[题目描述] ...
- FZU Super A^B mod C(欧拉函数降幂)
Problem 1759 Super A^B mod C Accept: 878 Submit: 2870 Time Limit: 1000 mSec Memory Limit : 327 ...
- [HEOI2016/TJOI2016][bzoj4554] 游戏 [建图+最大流]
题面 传送门 思路 看到棋盘摆放和棋子冲突,再加上这么小的数据范围,你能想到什么? 网络流棋盘模型啊! 就是 把源点连到每一行,每一列连到汇点,再在中间...... 等等,这道题每行不一定全部冲突?? ...
- CCC2019游记
好吧其实是清华游记,$CCC2019$ 在中国只有北京和天津举办,要选去加拿大的人很少,估计是最近两国关系有点紧张的缘故吧 但实际上是某些已经被清华钦点的人去预览一下他们未来的栖息所 $13:30$ ...
- 部署私有Docker Registry
安装部署一个私有的Docker Registry是引入.学习和使用Docker这门技术的必经之路之一.尤其是当Docker被所在组织接受,更多人.项目和产品开始接触和使用Docker时,存储和分发自制 ...
- pat 甲级 1135. Is It A Red-Black Tree (30)
1135. Is It A Red-Black Tree (30) 时间限制 400 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Yu ...
- CF 148D Bag of mice【概率DP】
D. Bag of mice time limit per test 2 seconds memory limit per test 256 megabytes Promblem descriptio ...
- BZOJ 3876 支线剧情
支线剧情 [故事背景] 宅男JYY非常喜欢玩RPG游戏,比如仙剑,轩辕剑等等.不过JYY喜欢的并不是战斗场景,而是类似电视剧一般的充满恩怨情仇的剧情.这些游戏往往都有很多的支线剧情,现在JYY想花费最 ...
- httpclient与webapi
System.Net.Http 是微软推出的最新的 HTTP 应用程序的编程接口, 微软称之为“现代化的 HTTP 编程接口”, 主要提供如下内容: 1. 用户通过 HTTP 使用现代化的 Web S ...