大数据离线分析平台 JavaSDK数据收集引擎编写
JavaSDK设计规则
JavaSDK提供两个事件触发方法,分别为onChargeSuccess和onChargeRefund。我们在java sdk中通过一个单独的线程来发送线程数据,这样可以减少对业务系统的延时性。
SDK测试
启动集群上的hdfs+nginx+flume进程,通过模拟数据的发送然后将数据发送到nginx服务器中,查看最终是否在hdfs中有数据的写入。
命令:
start-dfs.sh: 启动hdfs命令
su root:切换用户
service nginx restart: 启动nginx进程
启动flume进程:
进入flume安装根目录,执行命令:
flume-ng agent --conf ./conf/ --conf-file ./conf/test2.conf --name agent &
工程目录结构

AnalyticsEngineSDK如下:
package com.kk.ae.sdk; import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.logging.Level;
import java.util.logging.Logger; /*
* 分析引擎sdk java服务器数据收集
* */
public class AnalyticsEngineSDK { //日志记录对象
private static final Logger log=Logger.getGlobal();
//请求url的主体部分
public static final String accessUrl="http://hadoop-001:8090/kkImg.gif";
public static final String platformName="java_server";
public static final String sdkName="jdk";
private static final String version = "1";
/**
* 触发订单支付成功事件,发送事件数据到服务器
*
* @param orderId
* 订单支付id
* @param memberIdd
* 订单支付会员id
* @return 如果发送数据成功(加入到发送队列中),那么返回true;否则返回false(参数异常&添加到发送队列失败).
* @throws InterruptedException
*/
public static boolean chargeSuccess(String orderId,String memberId) throws InterruptedException { if (orderId!=null&&!orderId.isEmpty()&&memberId!=null&&!memberId.isEmpty()) {
Map<String, String> map=new HashMap<String,String>();
map.put("u_mid", memberId);
map.put("oid", orderId);
map.put("c_time", String.valueOf(System.currentTimeMillis()));
map.put("ver", version);
map.put("en", "e_cs");
map.put("p1", platformName);
map.put("sdk", sdkName); //创建url
String url= buildUrl(map);
// 发送url&将url加入到队列
SendDataMonitor.addSendUrl(url);
System.out.println(url);
return true;
} else {
log.log(Level.WARNING, "订单id和会员id不能为空");
return false;
} }
/**
* 触发订单退款事件,发送退款数据到服务器
*
* @param orderId
* 退款订单id
* @param memberIdd
* 退款会员id
* @return 如果发送数据成功,返回true。否则返回false。
* @throws InterruptedException
*/
public static boolean chargeRefund(String orderId,String memberId) throws InterruptedException {
if (orderId!=null&&!orderId.isEmpty()&&memberId!=null&&!memberId.isEmpty()) {
Map<String, String> map=new HashMap<String,String>();
map.put("u_mid", memberId);
map.put("oid", orderId);
map.put("c_time", String.valueOf(System.currentTimeMillis()));
map.put("ver", version);
map.put("en", "e_cr");
map.put("p1", platformName);
map.put("sdk", sdkName); //创建url
String url= buildUrl(map);
// 发送url&将url加入到队列
SendDataMonitor.addSendUrl(url);
System.out.println(url);
return true;
} else {
log.log(Level.WARNING, "订单id和会员id不能为空");
return false;
} }
private static String buildUrl(Map<String, String> map) { StringBuffer stringBuffer=new StringBuffer();
stringBuffer.append(accessUrl).append("?");
for(Map.Entry<String, String> entry:map.entrySet()) {
if (entry.getKey()!=null&&!entry.getKey().isEmpty()&&entry.getValue()!=null&&!entry.getValue().isEmpty()) {
{
try {
stringBuffer.append(entry.getKey().trim()).append("=").append(URLEncoder.encode(entry.getValue().trim(),"utf-8")).append("&");
} catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} }
} }
return stringBuffer.substring(0, stringBuffer.length() - 1);
} }
SendDataMonitor 如下:
package com.kk.ae.sdk; import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.ProtocolException;
import java.net.URL;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.logging.Level;
import java.util.logging.Logger; /**
* 发送url数据的监控者,用于启动一个单独的线程来发送数据
*
* @author gerry
*
*/
public class SendDataMonitor {
//收集日志
public static final Logger log=Logger.getGlobal();
// 队列,用户存储发送url
public static final BlockingQueue<String> queue=new LinkedBlockingQueue<String>();
//用于单例的一个类对象
private static SendDataMonitor monitor=null; private SendDataMonitor() {
// 私有构造方法,进行单列模式的创建
} public static SendDataMonitor getMonitor() {
if (monitor==null) {
synchronized (SendDataMonitor.class) {
if (monitor==null) {
monitor=new SendDataMonitor();
Thread thread=new Thread(new Runnable() { @Override
public void run() {
// TODO Auto-generated method stub
SendDataMonitor.monitor.run(); }
});
thread.start();
}
}
}
return monitor;
} protected void run() {
while (true) {
try {
String url=this.queue.take();
// 正式的发送url
HttpRequestUtil.sendData(url);
} catch (Throwable e) {
log.log(Level.WARNING, "发送url异常", e);
}
}
} public static void setMonitor(SendDataMonitor monitor) {
SendDataMonitor.monitor = monitor; } /**
* 添加一个url到队列中去
*
* @param url
* @throws InterruptedException
*/
public static void addSendUrl(String url) throws InterruptedException {
getMonitor().queue.put(url); }
/**
* 内部类,用户发送数据的http工具类
*
* @author gerry
*
*/
public static class HttpRequestUtil{
/**
* 具体发送url的方法
*
* @param url
* @throws IOException
*/
public static void sendData(String url) throws IOException {
HttpURLConnection con=null;
BufferedReader bf=null;
try {
URL obj=new URL(url);
con=(HttpURLConnection) obj.openConnection();
// 设置连接参数
con.setConnectTimeout(5000);//连接过期时间
con.setReadTimeout(5000);//读取数据过期时间
con.setRequestMethod("GET");//设置请求类型为get
System.out.println("发送url:" + url);
// 发送连接请求
bf=new BufferedReader(new InputStreamReader(con.getInputStream())); } finally {
try {
if (bf!=null) {
bf.close(); }
} catch (Throwable e) {
// TODO: handle exception }
try {
con.disconnect();
} catch (Throwable e) {
// TODO: handle exception
}
}
} } }
测试类:
package com.kk.ae.sdk;
public class Test {
public static void main(String[] args) {
try {
AnalyticsEngineSDK.chargeSuccess("order3516", "0958");
AnalyticsEngineSDK.chargeRefund("kk3", "9009");
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
大数据离线分析平台 JavaSDK数据收集引擎编写的更多相关文章
- 大数据离线分析平台 用户数据Etl
Etl目标 解析我们收集的日志数据,将解析后的数据保存到hbase中.这里选择hbase来存储数据的主要原因就是: hbase的宽表结构设计适合我们的这样多种数据格式的数据存储(不同event有不同 ...
- 大数据离线分析平台 JSSDK数据收集引擎编写
JsSDK设计规则在js sdk中我们需要收集launch.pageview.chargeRequest和eventDuration四种数据,所以我们需要在js中写入四个方法来分别收集这些数据,另外我 ...
- mapReduce 大数据离线分析
数据分析一般分为两种,一种是在线一种是离线 流程: 一般都是对于日志文件的采集和分析 场景实例(某个电商网站产生的用户访问日志(access.log)进行离线处理与分析的过程) 1.需求: 基于Map ...
- 大快DKH大数据智能分析平台监控参数说明
2018年国内大数据公司50强榜单排名已经公布了出来,大快以黑马之姿闯入50强,并摘得多项桂冠.Hanlp自然语言处理技术也荣膺了“2018中国数据星技术”奖.对这份榜单感兴趣的可以找一下看看.本篇承 ...
- 快速构建大数据存储分析平台-ELK平台安装
一.概述 ELK是由Elastic公司开发的Elasticsearch.Logstash.Kibana三款开源软件的缩写(但不限于这三款软件). 为什么使用ELK? 在目前流行的微服务架构中,一个大型 ...
- 从Excel读取数据,然后分析相似的数据,多线程处理(多线程比较相似的字符串,统计出相似的数量及字符串)
之前的jar包有问题,现已修改. 需要的jar包,已修改 自己去Maven中央仓库下载jar包. excel数据: 直接上代码. 程序再度优化了一遍.之后如果想再度精准,可能需要建模,最近没空继续做了 ...
- 分布式大数据系统离线分析技术解决方案(spark2.x)
一.sark2.x新型的架构系统
- 基于Hadoop技术实现的离线电商分析平台(Flume、Hadoop、Hbase、SpringMVC、highcharts)
离线数据分析平台是一种利用hadoop集群开发工具的一种方式,主要作用是帮助公司对网站的应用有一个比较好的了解.尤其是在电商.旅游.银行.证券.游戏等领域有非常广泛,因为这些领域对数据和用户的特性把握 ...
- snmp数据包分析
今天看了一下snmp数据包的报文格式,用wireshark抓了两个数据包来分析. 先说说snmp get-request的书报包格式吧,get-next-request,get-response,se ...
随机推荐
- snmp 简单网管协议
snmpget是取具体的OID的值.(适用于OID值是一个叶子节点的情况) snmpwalk snmpwalk — Fetch all the SNMP objects from an agent & ...
- TrueCrypt 7.1a Hashes
Here are the SHA256, SHA1, and MD5 hashes of all TrueCrypt version 7.1a files. The signature of the ...
- 【err】VIDEOIO ERROR: V4L: index 0 is not correct!Unable to connect to camera
前言 新到手一块板子,程序编译成功之后,运行出现错误,不能连接到摄像头. 问题 VIDEOIO ERROR: V4L: index is not correct! Unable to connect ...
- MongDB篇,第一章:数据库知识1
MongDB 数据库知识1 程序 = 数据结构 + 算法 数据存储阶段 1,文件管理阶段 (.txt .doc .xls) 优点: 数据可以长期保存:可以存储大量的数据:使用简单 缺点 ...
- 在Maven项目中,指定使用阿里云仓库下载jar包
Maven项目中,在pom.xml的</project>标签之前加入一下标签,指定使用阿里云仓库下载jar包. <!-- 使用aliyun maven --> <repo ...
- NCPC 2016:简单题解
A .Artwork pro:给定N*M的白色格子,然后Q次黑棒,输出每次加黑棒后白色连通块的数量.(N,M<1e3, Q<1e4) sol:倒着离线做,并查集即可. (在线做法:http ...
- HihoCoder - 1807:好的数字串 (KMP DP)
Sample Input 6 1212 Sample Output 298 给定一个数字字符串S,如果一个数字字符串(只包含0-9,可以有前导0)中出现且只出现1次S,我们就称这个字符串是好的. 例如 ...
- 2018.4.3 配置AD服务器步骤
net ads命令表 配置AD服务器步骤:1. 安装rpm依赖包yum -y install pam_krb5* krb5-libs* krb5-workstation* krb5-devel* kr ...
- CSU 1588 合并果子
Description 现在有n堆果子,第i堆有ai个果子.现在要把这些果子合并成一堆,每次合并的代价是两堆果子的总果子数.求合并所有果子的最小代价. Input 第一行包含一个整数T(T<=5 ...
- Windows server 2008 R2 安装指引
1.虚拟机实验安装win server 2008 R2 企业版, 安装环境: 虚拟机版本:VM 14 本地系统:win 7 64 位 专业版 打开VM14,新建虚拟机,选择自定义高级(此处也可以选择典 ...