irms模拟数据生成及数据分析

一、数据准备

1、每天生成随机一个文本,每小时向文本中追加2次数据,每次10万条

随机数据生成:

2,32  * * * *  bash /mnt/jediael/irms/signalGenerator/signalGenerator.sh >> /home/jediael/sg.log 2>&1

类:SignalGenerator

2、每天将前一天生成的数据文本导入HDFS

32 0 * * * bash /mnt/jediael/irms/signalGenerator/copySignalToHdfs.sh >>/home/jediael/sg.log 2>&1

二、数据分析

1、每天执行一次数据分析,将结果输出到hdfs文本中。

42 0 * * * bash /mnt/jediael/irms/signalparser/signalParser.sh >>/home/jediael/sg.log 2>&1

类:SignalParser

程序文件:

/mnt/jediael/irms/signalGenerator/signalGenerator.sh

#!/bin/bash
export JAVA_HOME=/usr/java/jdk1.7.0_51
export PATH=$JAVA_HOME/bin:$PATH
export CLASSPATH=$CLASSPATH:/mnt/jediael/irms/signalGenerator/
java SignalGenerator 

/mnt/jediael/irms/signalGenerator/copySignalToHdfs.sh

#!/bin/bash
export JAVA_HOME=/usr/java/jdk1.7.0_51
PATH=/mnt/jediael/hadoop-1.2.1/bin/:/mnt/jediael/hbase-0.94.26/bin:/mnt/jediael/tomcat-7.0.54/bin:$JAVA_HOME/bin:$PATH
hadoop fs -copyFromLocal /mnt/jediael/irms/signalGenerator/`date -d "-1 day" +%Y%m%d`.txt /irms/signal >> sg.log

/mnt/jediael/irms/signalparser/signalParser.sh

#!/bin/bash

export JAVA_HOME=/usr/java/jdk1.7.0_51
PATH=/mnt/jediael/hadoop-1.2.1/bin/:/mnt/jediael/hbase-0.94.26/bin:/mnt/jediael/tomcat-7.0.54/bin:$JAVA_HOME/bin:$PATH
hadoop jar signalgenerator.jar  /irms/signal/`date -d "-1 day" +%Y%m%d`.txt  /irms/result/`date -d "-1 day" +%Y%m%d`

SignalGenerator.java

package com.gmcc.irms.util;

import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.text.SimpleDateFormat;
import java.util.Random;

//此类用于模拟生成信令数据,每次生成100000条

public class SignalGenerator {
	// 业务类型,如呼入、呼出、发短信、收短信、上网、WLAN等
	private int activeType = 0;

	private String getNextSign() {
		String sign = "";
		Random rand = new Random();
		activeType = rand.nextInt(6);
		// 主叫号码
		String callNum = "1390222" + rand.nextInt(9) + rand.nextInt(9)
				+ rand.nextInt(9) + rand.nextInt(9);
		// 被叫号码
		String beCallNum = "1390222" + rand.nextInt(9) + rand.nextInt(9)
				+ rand.nextInt(9) + rand.nextInt(9);
		// 时长、或者是流量
		String callDuration = "";
		for (int i = 0; i < 16; i++) {
			callDuration += rand.nextInt(9);
		}
		sign = activeType + callNum + beCallNum + callDuration;
		for (int i = 0; i < 800; i++) {
			sign += rand.nextInt(9);
		}
		return sign;

	}

	public static void main(String[] args) throws IOException {

		SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
		long time = System.currentTimeMillis();
		String fileName = sdf.format(time) + ".txt";
		OutputStream os = new FileOutputStream(fileName, true);
		SignalGenerator sg = new SignalGenerator();
		String newline = System.getProperty("line.separator");

		for (int i = 0; i < 100000; i++) {
			os.write((sg.getNextSign() + newline).getBytes());

		}
		os.flush();
		os.close();

	}

}

SignalParser.java

package com.gmcc.irms.signal;

import java.io.IOException;

import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.Mapper;
import org.apache.hadoop.mapreduce.Reducer;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;

public class SignalParser {
	public static void main(String[] args) throws Exception {

		Job job = new Job();
		job.setJarByClass(SignalParser.class);
		job.setJobName("signal parser");
		FileInputFormat.addInputPath(job, new Path(args[0]));
		FileOutputFormat.setOutputPath(job, new Path(args[1]));
		job.setMapperClass(SignalParserMapper.class);
		job.setReducerClass(SignalParserReducer.class);
		job.setOutputKeyClass(Text.class);
		job.setOutputValueClass(Text.class);
		System.exit(job.waitForCompletion(true) ? 0 : 1);
	}
}

class SignalParserMapper extends Mapper<LongWritable, Text, Text, Text> {

	@Override
	public void map(LongWritable key, Text value, Context context)
			throws IOException, InterruptedException {
		String line = value.toString();
		// 业务类型
		String activeType = line.substring(0, 1);
		// 主叫电话号码
		String customer = line.substring(1, 12);
		// 通话时长、web时长、wlan时长
		int duration = Integer.parseInt(line.substring(23, 30));

		context.write(new Text(customer),new Text(activeType + "," + duration));

	}
}

class SignalParserReducer extends Reducer<Text, Text, Text, Text> {
	@Override
	public void reduce(Text key, Iterable<Text> values, Context context)
			throws IOException, InterruptedException {
		//总通话时长
		int sumCallDuration = 0;
		//通话次数
		int callTimes = 0;
		//发送短信次数
		int smsTimes = 0;
		//上网总时长
		int sumWebDuration = 0;
		//上网次数
		int webTimes = 0;
		//WLAN总时长
		int sumWlanDuration = 0;
		//WLAN次数
		int wlanTimes = 0;

		String[] valueArray = null;
		int activeType = -1;
		int duration = -1;
		for (Text value:values){

			valueArray = value.toString().split(",");
			System.out.println(valueArray[0]+" a "+valueArray[1]);
			activeType = Integer.parseInt(valueArray[0]);
			duration = Integer.parseInt(valueArray[1]);
			if(activeType == 0){
				//呼出
				sumCallDuration += duration;
				callTimes++;
			}else if(activeType == 2){
				//发sms
				smsTimes++;
			}else if(activeType == 4){
				//上网
				sumWebDuration += duration;
				webTimes ++;
			}else if(activeType == 5){
				//WLAN
				sumWlanDuration += duration;
				wlanTimes ++;
			}else{

			}
		}

		context.write(key, new Text(sumCallDuration + "\t" + callTimes + "\t" +smsTimes+"\t" + sumWebDuration+"\t" + webTimes+"\t" + sumWebDuration+"\t" + webTimes));
	}
}
时间: 2024-11-11 16:47:02

irms模拟数据生成及数据分析的相关文章

[Oracle]快速生成大量模拟数据的方法

快速生成大量模拟数据的方法: create table TEST(id integer, TEST_NUMBER NUMBER(18,6)); insert into TEST select i+j, i+j   from  (          with DATA2(j) as (                            select 0 j from DUAL                              union all                     

lazy-mock ,一个生成后端模拟数据的懒人工具

lazy-mock ??lazy-mock 是基于koa2构建的,使用lowdb持久化数据到JSON文件.只需要简单的配置就可以实现和json-server差不多的功能,但是比json-server更加灵活,后期可配置性更强,完全可以模拟真实后端业务逻辑. ??lazy-mock默认包含了jwt实现的登录与登出,实现了基于RBAC模型的通用权限控制逻辑.具体可查看vue-quasar-admin. Clone git clone https://github.com/wjkang/lazy-mo

转:Swagger2自动生成接口文档和Mock模拟数据

转自:https://www.cnblogs.com/vipstone/p/9841716.html 一.简介 在当下这个前后端分离的技术趋势下,前端工程师过度依赖后端工程师的接口和数据,给开发带来了两大问题: 问题一.后端接口查看难:要怎么调用?参数怎么传递?有几个参数?参数都代表什么含义? 问题二.返回数据操作难:数据返回不对或者不够怎么办?怎么才能灵活的操作数据? 这是很多公司前后端分离之后带来的困扰,那怎么来解决这些问题? 问题一的一般解决方案:后端团队共同维护一个在线文档,每次改接口再

vue-cli项目中使用mock结合axios-mock-adapter生成模拟数据【转】

1.安装 npm i mockjs axios --save-dev npm i mockjs axios-mock-adapter --save-dev 2.创建数据 // 文件夹配置 ----mock --------data ------------good.js ------------user.js --------index.js users.js: import Mock from "mockjs" const Users = []; for (let i=0; i<

vue+mockjs 模拟数据,实现前后端分离开发

在项目中尝试了mockjs,mock数据,实现前后端分离开发. 关于mockjs,官网描述的是 1.前后端分离 2.不需要修改既有代码,就可以拦截 Ajax 请求,返回模拟的响应数据. 3.数据类型丰富 4.通过随机数据,模拟各种场景. 等等优点. 总结起来就是在后端接口没有开发完成之前,前端可以用已有的接口文档,在真实的请求上拦截ajax,并根据mockjs的mock数据的规则,模拟真实接口返回的数据,并将随机的模拟数据返回参与相应的数据交互处理,这样真正实现了前后台的分离开发. 与以往的自己

可视化接口管理工具RAP,模拟数据,校验接口

最近看到一个不错的接口管理的工具,分享一下 RAP ppt介绍:http://www.imooc.com/video/11060 RAP是一个可视化接口管理工具 通过分析接口结构,动态生成模拟数据,校验真实接口正确性, 围绕接口定义,通过一系列自动化工具提升我们的协作效率. 使用网址:http://rap.taobao.org/ GitHub地址:https://github.com/thx/RAP 一些文档:https://github.com/thx/RAP/wiki/home_cn 官网:

前端模拟数据生成器

摘要: ?随着用户体验的重要性越来越高,目前前端和后台的解耦已经越来越明显了,这也加大了前后端的配合工作.在前端开发过程中可能我们需要一些后台返回的数据来完成交互效果,但是后台开发人员并没有完成后台功能,此时我们只能等,但是这样必然影响了开发进度,浪费了时间.有很多种解决方法,如果后端解决的话,那就是先定义接口,然后将假数据直接返回.如果在前端解决的话,前端搭建自己的服务,不依赖后端.作为前端工程师,今天我分享下另一种前端解决方案,mock服务. 简介: Mock.js 是一款模拟数据生成器,旨

Mock.js 与 fiddler 前端模拟数据与拦截请求

最近 工作需要  接触了Mock.js. Mock.js 是一款模拟数据生成器,旨在帮助前端攻城师独立于后端进行开发,帮助编写单元测试.提供了以下模拟功能: 根据数据模板生成模拟数据 模拟 Ajax 请求,生成并返回模拟数据 基于 HTML 模板生成模拟数据 http://mockjs.com/ 什么入门之类的 看官网就会~~~ Fiddler   web调试利器 便于我们调试前后端数据等. Fiddler是一个web调试代理.它能够记录所有客户端和服务器间的http请求,允许你监视,设置断点,

使用express, create-react-app, mongodb搭建react模拟数据开发环境

提要 最近刚刚完成了一个vue的项目,其中涉及的用户数有6000多个以及其他数据也比较多,为了在前端能够真实的进行数据模拟,所有把全量数据拷贝下来放到了api.json中.这样导致整个api.json文件过大,每次进行修改的时候编辑器都会卡顿. 项目做完后就在想能不能把大量的模拟数据放在数据库中进行管理,用nodejs来操作数据库.顺便再熟练一下nodejs. 使用的技术栈 express 是nodejs当前最流行的后台框架.官网对express的描述,它是一个机遇Node.js平台,快 速.开