MetaQ对接SparkStreaming示例代码
由于JavaReceiverInputDStream<String> lines = ssc.receiverStream(Receiver<T> receiver) 中 没有直接对接MetaQ的工具,当然可以实用使用spark streaming已经有的工具进行转接,这里不建议,所以可以继承Receiver类重写onStart()方法
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.concurrent.Executor; import org.apache.spark.storage.StorageLevel;
import org.apache.spark.streaming.receiver.Receiver;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import com.dinpay.bdp.rcp.domain.Order;
import com.taobao.metamorphosis.Message;
import com.taobao.metamorphosis.client.MessageSessionFactory;
import com.taobao.metamorphosis.client.MetaClientConfig;
import com.taobao.metamorphosis.client.MetaMessageSessionFactory;
import com.taobao.metamorphosis.client.consumer.ConsumerConfig;
import com.taobao.metamorphosis.client.consumer.MessageConsumer;
import com.taobao.metamorphosis.client.consumer.MessageListener;
import com.taobao.metamorphosis.utils.ZkUtils.ZKConfig; public abstract class MetaQReceiver<T> extends Receiver<T>{
private static final long serialVersionUID = -3240967436204273248L;
Logger logger=LoggerFactory.getLogger(MetaQReceiver.class);
private static final DateFormat df = new SimpleDateFormat("yyyyMMdd"); private String zkConnect;
private String zkRoot;
private String topic;
private String group; public MetaQReceiver(String zkConnect,String zkRoot,String topic,String group) {
super(StorageLevel.MEMORY_ONLY());
this.zkConnect=zkConnect;
this.zkRoot=zkRoot;
this.topic=topic;
this.group=group; } @Override
public void onStart() {
try{
final MetaClientConfig metaClientConfig = new MetaClientConfig();
final ZKConfig zkConfig = new ZKConfig();
zkConfig.zkConnect = this.zkConnect;// "127.0.0.1:2181";
zkConfig.zkRoot = this.zkRoot;// "/meta";
metaClientConfig.setZkConfig(zkConfig);
final MessageSessionFactory sessionFactory = new MetaMessageSessionFactory(
metaClientConfig);
ConsumerConfig consumerConfig = new ConsumerConfig(group);
// 默认最大获取延迟为5秒,这里设置成100毫秒,请根据实际应用要求做设置。
consumerConfig.setMaxDelayFetchTimeInMills(100);
final MessageConsumer consumer = sessionFactory
.createConsumer(consumerConfig);
// subscribe topic
consumer.subscribe(topic, 1024 * 1024, new MessageListener() {
@Override
public void recieveMessages(final Message message) {
try{
//T t=message2Object(new String(message.getData(),"utf-8"));
logger.info("Receive message " + new String(message.getData()));
String orderJson = new String(message.getData());
Order order = ParameterDataUtil.getObject(orderJson, Order.class);
String cardNo = order.getCard_no();
String yyyyMMdd = df.format(new Date());
String payclassId = order.getPayclass_id();
String cntKey = "DK_CNT_" + cardNo + "_" + payclassId + "_" + yyyyMMdd;
logger.info(cntKey);
System.out.println(cntKey);
T result = (T) cntKey;
if(result!=null){
store(result);
}
}catch(Exception e){
logger.error("message2Object error",e);
}
}
@Override
public Executor getExecutor() {
return null;
}
});
consumer.completeSubscribe();
}catch(Exception e){
throw new RuntimeException("metaq error",e);
}
} @Override
public void onStop() {
} //public abstract T message2Object(String message) throws Exception;
}
下面该段代码可以减掉,若有需要转Object可以在此进行处理
public class MetaQReceiverStreaming extends MetaQReceiver<String>{
private static final long serialVersionUID = -2290689243756756929L;
public MetaQReceiverStreaming(String zkConnect, String zkRoot, String topic, String group) {
super(zkConnect, zkRoot, topic, group);
}
/*@Override
public String message2Object(String message) throws Exception {
return message;
}*/
}
接下来通过spark streaming进行metaq的消息处理
ort java.util.Arrays;
import java.util.List; import org.apache.log4j.Level;
import org.apache.log4j.Logger;
import org.apache.spark.SparkConf;
import org.apache.spark.api.java.function.FlatMapFunction;
import org.apache.spark.api.java.function.Function2;
import org.apache.spark.api.java.function.PairFunction;
import org.apache.spark.streaming.Durations;
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 com.dinpay.bdp.rcp.util.Constant;
import com.dinpay.bdp.rcp.util.MetaQReceiverStreaming;
import com.google.common.base.Optional;
import com.sun.xml.bind.v2.runtime.reflect.opt.Const; import scala.Tuple2;
/**
* @author ll
*/
public class MetaqStreamingCount { public static void main(String[] args) {
String zkConnect=Constant.METAZK;
String zkRoot="/meta";
String topic=Constant.METATOPIC;
String group=Constant.METAGROUP; //屏蔽日志
Logger.getLogger("org.apache.spark").setLevel(Level.OFF);
SparkConf sparkConf = new SparkConf().setAppName("MetaqStreamingCount").setMaster("local[2]");
JavaStreamingContext ssc = new JavaStreamingContext(sparkConf, Durations.seconds(1)); JavaReceiverInputDStream<String> lines = ssc.receiverStream(new MetaQReceiverStreaming(zkConnect,zkRoot,topic,group)); JavaDStream<String> words = lines.flatMap(new FlatMapFunction<String, String>() { @Override
public Iterable<String> call(String line) throws Exception {
return Arrays.asList(line.split(" "));
}
}); JavaPairDStream<String, Integer> pairs = words.mapToPair(new PairFunction<String, String, Integer>() {
@Override
public Tuple2<String, Integer> call(String word) {
return new Tuple2<>(word, 1);
}
}); JavaPairDStream<String, Integer> wordsCount = pairs.updateStateByKey(new Function2<List<Integer>, Optional<Integer>,
Optional<Integer>>() {//对相同的Key,进行Value的累计(包括Local和Reducer级别同时Reduce) @Override
public Optional<Integer> call(List<Integer> values, Optional<Integer> state){
//第一个参数就是key传进来的数据,第二个参数是已经有的数据
Integer updateValue = 0;//如果第一次,state没有,updateValue为0,如果有就获取
if(state.isPresent()){
updateValue = state.get();
}
//遍历batch传进来的数据可以一直加,随着时间的流式会不断的累加相同key的value结果
for (Integer value : values) {
updateValue += value;
}
return Optional.of(updateValue);//返回更新的值
}
}); wordsCount.print();
//需要将结果保存到Codis中
ssc.checkpoint("checkpoint");
ssc.start();
ssc.awaitTermination();
ssc.close(); }
}
MetaQ对接SparkStreaming示例代码的更多相关文章
- java对接申通下单接口示例代码
上面是控制台示例代码 public class Sample{ private final static String URL = "http://order.sto-express.cn: ...
- 基于DotNetOpenAuth的OAuth实现示例代码: 获取access token
1. 场景 根据OAuth 2.0规范,该场景发生于下面的流程图中的(D)(E)节点,根据已经得到的authorization code获取access token. 2. 实现环境 DotNetOp ...
- 0038 Java学习笔记-多线程-传统线程间通信、Condition、阻塞队列、《疯狂Java讲义 第三版》进程间通信示例代码存在的一个问题
调用同步锁的wait().notify().notifyAll()进行线程通信 看这个经典的存取款问题,要求两个线程存款,两个线程取款,账户里有余额的时候只能取款,没余额的时候只能存款,存取款金额相同 ...
- ActiveMQ笔记(1):编译、安装、示例代码
一.编译 虽然ActiveMQ提供了发布版本,但是建议同学们自己下载源代码编译,以后万一有坑,还可以尝试自己改改源码. 1.1 https://github.com/apache/activemq/r ...
- C#微信公众平台接入示例代码
http://mp.weixin.qq.com/wiki/17/2d4265491f12608cd170a95559800f2d.html 这是微信公众平台提供的接入指南.官网只提供了php的示例代码 ...
- 编译opengl编程指南第八版示例代码通过
最近在编译opengl编程指南第八版的示例代码,如下 #include <iostream> #include "vgl.h" #include "LoadS ...
- 股票数据调用示例代码php
<!--?php // +---------------------------------------------------------------------- // | JuhePHP ...
- php示例代码之类似于C#中的String.Format方法
php示例代码之类似于C#中的String.Format方法 原文来自于 http://stackoverflow.com/questions/1241177/c-string-format-equ ...
- redis 学习笔记(2)-client端示例代码
redis提供了几乎所有主流语言的client,java中主要使用二种:Jedis与Redisson 一.Jedis的使用 <dependency> <groupId>redi ...
随机推荐
- manjaro安装anaconda出错
出错信息: ==> Creating package "anaconda"... -> Generating .PKGINFO file... -> Gene ...
- 实战小项目之嵌入式linux图像采集与传输
项目简介 本次编程实战主要是围绕嵌入式linux v4l2采集框架展开,包括以下几个部分: v4l2视频采集 IPU转码 framebuffer显示 自定义UDP简单协议进行传输 上位机软件 ...
- [oldboy-django][3作业汇总]相亲网
1 相亲网需求 1相亲网需求 a.登录, 基于session, 装饰器 b.数据库表: 男生表 id, username, password 女生表 id, username, password 约会 ...
- VC++中PostMessage、SendMessage和PeekMessage之间的区别
1, PostMessage只把消息放入队列,不管其他程序是否处理都返回,然后继续执行,这是个异步消息投放函数.而SendMessage必须等待其他程序处理消息完了之后才返回,继续执行,这是个同步消息 ...
- 【转】UGUI文本字体颜色和大小等代码修改
http://blog.csdn.net/alayeshi/article/details/51842195 由于项目需求用UGUI在同个文本中显示出颜色和大小都不同的文字,我上网找个很久并没有见到相 ...
- [cocos2dx enhancement] CCPlatformMacros.h
为了更好的调试Log,优化CCLOG格式 path: cocos2dx/platform/CCPlatformMacros.h line 218: #define CCLOGERROR(format, ...
- 指定某个git的版本代码拉取新的分支
在本地找到一个目录,执行 git clone http://gitlab.xxxxx.com/xxxxx/xxxxx.git cd xxxxx/ git log //找到对应版本的SHA值 例如2b1 ...
- 游戏(game)
游戏(game) 题目描述 这个游戏是这样的,你有一个初始序列S ,你每次可以选择一段任意长度的连续区间,把他们+1 再膜k,给定目标序列,你需要尝试用尽量少的操作次数将初始序列变为目标序列.作为一名 ...
- 2017-3-01 test
三道好像都是HDU上的题QAQ 题目名称都没改,差评 T1:http://acm.hdu.edu.cn/showproblem.php?pid=5073 被卡精度了QAQ 先排一发序,然后发现最后未动 ...
- 一个javascript继承和使用的例子
继承可以帮助我们实现代码的重用,把对象的属性写入构造函数,对象的方法写入原型后,以下例子演示继承的使用: 示例的css和js在后 父实例,得到一个间隔1s的轮播: <!DOCTYPE html& ...