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 ...
随机推荐
- Hadoop第三课
1.3Hadoop基础知识 1.3.1术语解释 1.Hadoop1.0 • 第一代Hadoop,由分布式文件系统HDFS 和分布式计算框架MapReduce组成 • HDFS由一个NameNode和多 ...
- 查看sqlserver表空间
exec sp_msforeachtable "exec sp_spaceused '?'"
- [oldboy-django][4python面试]有关yield那些事
1 yield 在使用send, next时候的区别(举例m = yield 5) 无论send,next首先理解m = yield 5 是将表达式"yield 5 "的结果返回给 ...
- [转]Linux 技巧:让进程在后台可靠运行的几种方法
转自: https://www.ibm.com/developerworks/cn/linux/l-cn-nohup/index.html 我们经常会碰到这样的问题,用 telnet/ssh 登录了远 ...
- ALPHA(四)
目录 组员情况 组员1(组长):胡绪佩 组员2:胡青元 组员3:庄卉 组员4:家灿 组员5:凯琳 组员6:丹丹 组员7:何家伟 组员8:政演 组员9:鸿杰 组员10:刘一好 组员:何宇恒 展示组内最新 ...
- 截图神器-snipaste
基础操作 Snipaste 是一个简单但强大的贴图工具,同时也可以执行截屏.标注等功能. 截屏 开始截图 快捷键(默认为 F1) 鼠标左键 单击托盘图标 何谓一次 成功的截图 保存到剪贴板 ( / ...
- input聚焦时,滚动至可视区域
这里的代码来自vux,觉得vux处理得很好,在此记录一下. 当我们在手机上填表单的时候,我们会希望正在填的input或者textarea会自动滚动至可视区域,方便我们边填写边查看内容.以前我的做法是, ...
- [AGC016B] Colorful Hats (结论)
Description 有n个人,每个人都戴着一顶帽子.当然,帽子有不同的颜色. 现在,每个人都告诉你,他看到的所有其他人的帽子共有多少种颜色,请问你有没有符合所有人的描述的情况. Input 第一行 ...
- 多表的时候怎样在MVC VIEW中显示
原文发布时间为:2011-04-01 -- 来源于本人的百度文章 [由搬家工具导入] Linq join query displayed in MVC view Instead of returnin ...
- duilib入门简明教程 -- 界面布局(9) (转)
原文转自:http://www.cnblogs.com/Alberl/p/3343806.html 上一个教程实现的标题栏代码中,并没有看到处理自适应窗口大小的代码,但是窗口大小变化后,按钮的 ...