電信運營商流量經營系統(資料模組
一、專案的核心模組(資料處理流程圖)
二、相關程式碼
1、建立規則資料庫(TopN)
public class TopkURLMapper extends Mapper<LongWritable, Text, Text, FlowBean> {
private FlowBean bean = new FlowBean();
private Text k = new Text();
@Override
protected void map(LongWritable key, Text value, Context context)
throws IOException, InterruptedException {
String line = value.toString();
String[] fields = StringUtils.split(line, "\t");
try {
if (fields.length > 32 && StringUtils.isNotEmpty(fields[26])
&& fields[26].startsWith("http")) {
String url = fields[26];
long up_flow = Long.parseLong(fields[30]);
long d_flow = Long.parseLong(fields[31]);
k.set(url);
bean.set("", up_flow, d_flow);
context.write(k, bean);
}
} catch (Exception e) {
System.out.println();
}
}
}
public class TopkURLReducer extends Reducer<Text, FlowBean, Text, LongWritable>{
private TreeMap<FlowBean,Text> treeMap = new TreeMap<>();//Treemap預設按照key進行排序,這裡重寫了FloewBean的ComparedTo方法,按照流量排序
private double globalCount = 0;
// <url,{bean,bean,bean,.......}>
@Override
protected void reduce(Text key, Iterable<FlowBean> values,Context context)
throws IOException, InterruptedException {
Text url = new Text(key.toString());
long up_sum = 0;
long d_sum = 0;
for(FlowBean bean : values){
up_sum += bean.getUp_flow();
d_sum += bean.getD_flow();
}
FlowBean bean = new FlowBean("", up_sum, d_sum);
//每求得一條url的總流量,就累加到全域性流量計數器中,等所有的記錄處理完成後,globalCount中的值就是全域性的流量總和
globalCount += bean.getS_flow();
treeMap.put(bean,url);
}
//cleanup方法是在reduer任務即將退出時被呼叫一次
@Override
protected void cleanup(Context context)
throws IOException, InterruptedException {
Set<Entry<FlowBean, Text>> entrySet = treeMap.entrySet();
double tempCount = 0;
for(Entry<FlowBean, Text> ent: entrySet){
if(tempCount / globalCount < 0.8){
context.write(ent.getValue(), new LongWritable(ent.getKey().getS_flow()));
tempCount += ent.getKey().getS_flow();
}else{
return;
}
}
}
2、讀入原始日誌資料,抽取其中的url,查詢規則庫,獲得該url指向的網頁內容的分析結果,追加到原始日誌後;如果沒查到,則交給未完全分類去處理
public class LogEnhanceMapper extends
Mapper<LongWritable, Text, Text, NullWritable> {
private HashMap<String, String> ruleMap = new HashMap<>();
// setup方法是在mapper task 初始化時被呼叫一次
@Override
protected void setup(Context context) throws IOException,
InterruptedException {
DBLoader.dbLoader(ruleMap);//將資料庫資料載入至Hashmap
}
@Override
protected void map(LongWritable key, Text value, Context context)
throws IOException, InterruptedException {
String line = value.toString();
String[] fields = StringUtils.split(line, "\t");
try {
if (fields.length > 27 && StringUtils.isNotEmpty(fields[26])
&& fields[26].startsWith("http")) {
String url = fields[26];
String info = ruleMap.get(url);
String result = "";
if (info != null) {
result = line + "\t" + info + "\n\r";
context.write(new Text(result), NullWritable.get());
} else {
result = url + "\t" + "tocrawl" + "\n\r";
context.write(new Text(result), NullWritable.get());
}
} else {
return;
}
} catch (Exception e) {
System.out.println("exception occured in mapper.....");
}
}
}
public class DBLoader {
public static void dbLoader(HashMap<String, String> ruleMap) {
Connection conn = null;
Statement st = null;
ResultSet res = null;
try {
Class.forName("com.mysql.jdbc.Driver");
conn = DriverManager.getConnection("jdbc:mysql://weekend01:3306/urlcontentanalyse", "root", "root");
st = conn.createStatement();
res = st.executeQuery("select url,info from urlrule");
while (res.next()) {
ruleMap.put(res.getString(1), res.getString(2));
}
} catch (Exception e) {
e.printStackTrace();
} finally {
try{
if(res!=null){
res.close();
}
if(st!=null){
st.close();
}
if(conn!=null){
conn.close();
}
}catch(Exception e){
e.printStackTrace();
}
}
}
}
public class LogEnhanceOutputFormat<K, V> extends FileOutputFormat<K, V> {
@Override
public RecordWriter<K, V> getRecordWriter(TaskAttemptContext job)
throws IOException, InterruptedException {
FileSystem fs = FileSystem.get(new Configuration());
FSDataOutputStream enhancedOs = fs.create(new Path("/output/enhancedLog"));
FSDataOutputStream tocrawlOs = fs.create(new Path("/output/tocrawl"));
return new LogEnhanceRecordWriter<K, V>(enhancedOs,tocrawlOs);
}
public static class LogEnhanceRecordWriter<K, V> extends RecordWriter<K, V>{
private FSDataOutputStream enhancedOs =null;
private FSDataOutputStream tocrawlOs =null;
public LogEnhanceRecordWriter(FSDataOutputStream enhancedOs,FSDataOutputStream tocrawlOs){
this.enhancedOs = enhancedOs;
this.tocrawlOs = tocrawlOs;
}
@Override
public void write(K key, V value) throws IOException,
InterruptedException {
if(key.toString().contains("tocrawl")){
tocrawlOs.write(key.toString().getBytes());
}else{
enhancedOs.write(key.toString().getBytes());
}
}
@Override
public void close(TaskAttemptContext context) throws IOException,
InterruptedException {
if(enhancedOs != null){
enhancedOs.close();
}
if(tocrawlOs != null){
tocrawlOs.close();
}
}
}
}
Configuration conf = new Configuration();
Job job = Job.getInstance(conf);
job.setJarByClass(LogEnhanceRunner.class);
job.setMapperClass(LogEnhanceMapper.class);
job.setOutputKeyClass(Text.class);
job.setOutputValueClass(NullWritable.class);
job.setOutputFormatClass(LogEnhanceOutputFormat.class);
FileInputFormat.setInputPaths(job, new Path(args[0]));
FileOutputFormat.setOutputPath(job, new Path(args[1]));
相關文章
- 2019年10中國三大電信運營商運營資料盤點
- 元宇宙和電信運營商元宇宙
- 電商RPA助力電商運營做好資料分析
- 電商運營與大資料分析大資料
- 電信運營商網路運維方案運維
- 電信日 | 看運營商資料安全建設典型案例
- Strategy Analytics:從消費者調研資料看後疫情時期電信運營商的經營策略
- js 聯通、移動、電信運營商大資料精準營銷獲客JS大資料
- 電信運營商資本支出分析:營收現狀與資本強度策略營收
- 一個正經的電商運營每天應該看哪些資料?
- IPIDEA助力跨境電商經營,哪些電商資料值得爬取?Idea
- 中國電信VoLTE要來了?蘋果iPhone運營商資料更新蘋果iPhone
- 移動電信聯通三大運營商的“流量不清零”,誰最坑?
- 2021年2月三大運營商運營資料包告
- 後流量時代,如何實現最佳的電商風控運營?
- 2018年4月電信行業運營資料解讀行業
- 運營商大規模資料叢集治理的實踐指南
- 亞信科技AISWare AntDB資料庫在運營商核心業務系統的聯合實踐分享AI資料庫
- 代理IP如何助力電商運營?
- GSMA:2021年電信運營商收入多元化報告
- 營銷模組資料庫表解析(二)資料庫
- Omdia:展望電信運營商與雲服務提供商的合作前景
- 如何做“埋點”? 淺談手遊精細化運營與資料運營系統
- 大資料下的運營利器:精準推送系統大資料
- 企業5G:電信運營商選錯主戰場
- 波及16個都道縣!日本電信運營商KDDI再出故障
- 運營商資料庫選型有哪些需求?資料庫
- 網路安全宣傳週 | 電信日奉上運營商資料安全三大場景化方案
- 電商資料分析全攻略:從零開始提升運營效率
- 多商戶商城小程式如何操作運營?電商系統原始碼發展趨勢原始碼
- 2019年汽車經銷商運營概述
- 【精細化運營】遊戲運營資料分析遊戲
- 數商雲跨境電商獨立站系統:提高整體運營效率,助力企業實現精準定位的使用者運營
- 什麼是資料運營?資料運營是做什麼的?
- IPIDEA與電商,代理IP怎樣有效提升電商運營?Idea
- 直播系統定製開發中程式運營所需資料
- Omdia:2017-2019年電信運營商物聯網業務KPIKPI
- 大資料總結微信自媒體運營大資料
- 如何設計電商系統原始碼的商鋪模組原始碼