由于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示例代码的更多相关文章

  1. java对接申通下单接口示例代码

    上面是控制台示例代码 public class Sample{ private final static String URL = "http://order.sto-express.cn: ...

  2. 基于DotNetOpenAuth的OAuth实现示例代码: 获取access token

    1. 场景 根据OAuth 2.0规范,该场景发生于下面的流程图中的(D)(E)节点,根据已经得到的authorization code获取access token. 2. 实现环境 DotNetOp ...

  3. 0038 Java学习笔记-多线程-传统线程间通信、Condition、阻塞队列、《疯狂Java讲义 第三版》进程间通信示例代码存在的一个问题

    调用同步锁的wait().notify().notifyAll()进行线程通信 看这个经典的存取款问题,要求两个线程存款,两个线程取款,账户里有余额的时候只能取款,没余额的时候只能存款,存取款金额相同 ...

  4. ActiveMQ笔记(1):编译、安装、示例代码

    一.编译 虽然ActiveMQ提供了发布版本,但是建议同学们自己下载源代码编译,以后万一有坑,还可以尝试自己改改源码. 1.1 https://github.com/apache/activemq/r ...

  5. C#微信公众平台接入示例代码

    http://mp.weixin.qq.com/wiki/17/2d4265491f12608cd170a95559800f2d.html 这是微信公众平台提供的接入指南.官网只提供了php的示例代码 ...

  6. 编译opengl编程指南第八版示例代码通过

    最近在编译opengl编程指南第八版的示例代码,如下 #include <iostream> #include "vgl.h" #include "LoadS ...

  7. 股票数据调用示例代码php

    <!--?php // +---------------------------------------------------------------------- // | JuhePHP ...

  8. php示例代码之类似于C#中的String.Format方法

    php示例代码之类似于C#中的String.Format方法 原文来自于  http://stackoverflow.com/questions/1241177/c-string-format-equ ...

  9. redis 学习笔记(2)-client端示例代码

    redis提供了几乎所有主流语言的client,java中主要使用二种:Jedis与Redisson 一.Jedis的使用 <dependency> <groupId>redi ...

随机推荐

  1. ALPHA 冲刺(一)

    目录 组员情况 组员1(组长):胡绪佩 组员2:胡青元 组员3:庄卉 组员4:家灿 组员5:凯琳 组员6:丹丹 组员7:家伟 组员8:政演 组员9:黄鸿杰 组员10:刘一好 组员11:何宇恒 展示组内 ...

  2. NSURLSession使用模板和AFNetworking使用模板(REST风格)

    1.NSURLSession使用模板 NSURLSession是苹果ios7后提供的api,用来替换 NSURLConnection会话指的是程序和服务器的通信对象//一.简单会话不可以配合会话(ge ...

  3. 在Visual studio 2010中为C#的“///”注释内容生成XML文档 .

    实际上该方法适合于所有版本的Visual studio,方法很简单,设置一下Visual studio的项目属性和工具选项即可. 1.在菜单栏的“Project”中选择当前项目的“*** Proper ...

  4. 如何通过IP地址分辨公网、私网、内网、外网

    如何通过IP地址分辨公网.私网.内网.外网   内.外网是相对于防火墙而言的,在防火墙内部叫做内网,反之就是外网.   在一定程度上外网等同于公网,内网等同于私网.   地址为如下3个区域就是处于私网 ...

  5. 洛谷P1816 忠诚

    P1816 忠诚 569通过 1.5K提交 题目提供者该用户不存在 标签云端 难度普及+/提高 时空限制1s / 128MB 提交  讨论  题解 最新讨论更多讨论 主席树的常数貌似大于线段树… TL ...

  6. input上传多张图片

    input的file上传多张图片的时候,用ajaxupload这个插件的时候,每次执行完,需要重新生成元素再绑定事件

  7. Xposed初体验

    Xposed初体验 1 测试环境 硬件:小米2s 16GB 电信版 系统:MIUI 4.4.18(开发版) Xposed版本: 2.5 注:Xposed版本号必须大于2.3,MIUI系统版本号也必须大 ...

  8. 深入学习MongoDB

    NoSQL(Not Only SQL)为什么使用NoSQL 对数据库高并发读写 对海量数据的高效存储与访问 对数据库的高可拓展性和高可用性 NoSQL的弱点 数据库事务一致性需求 数据库的写实时性和读 ...

  9. spring boot 运行jsp原理分析

    Spring-boot运行jsp原理分析   结论: 启动server的时候会创建临时目录 在浏览器中访问jsp文件的时候通过内置Tomcat将jsp转换为java,保存在临时目录中 然后编译为cla ...

  10. HDU3538 A sample Hamilton path

    Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission( ...