大数据 电信客服项目
1.项目背景
通信运营商每时每刻会产生大量的通信数据,例如通话记录,短信记录,彩信记录,
第三方服务资费等等繁多信息。数据量如此巨大,除了要满足用户的实时查询和展示之外,
还需要定时定期的对已有数据进行离线的分析处理。例如,当日话单,月度话单,季度话单,
年度话单,通话详情,通话记录等等+。我们以此为背景,寻找一个切入点,学习其中的方法论。
当前我们的需求是:统计每天、每月以及每年的每个人的通话次数及时长。
2.项目架构
3.项目实现
系统环境:
表1
系统 |
版本 |
windows |
10 专业版 |
linux |
CentOS 6.8 |
开发工具:
表2
工具 |
版本 |
idea |
2017.2.5旗舰版 |
maven |
3.3.9 |
JDK |
1.8+ |
提示:idea2017.2.5必须使用maven3.3.9,不要使用maven3.5,有部分兼容性问题
集群环境:
表3
框架 |
版本 |
hadoop |
2.7.2 |
zookeeper |
3.4.10 |
hbase |
1.3.1 |
flume |
1.7.0 |
kafka |
2.11-0.11.0.0 |
硬件环境:
表4
hadoop102 |
hadoop103 |
hadoop104 |
|
内存 |
4G |
2G |
2G |
CPU |
2核 |
1核 |
1核 |
硬盘 |
50G |
50G |
50G |
3.1 数据生产
此情此景,对于该模块的业务,即数据生产过程,一般并不会让你来进行操作,
数据生产是一套完整且严密的体系,这样可以保证数据的鲁棒性。但是如果涉及到
项目的一体化方案的设计(数据的产生、存储、分析、展示),则必须清楚每一个
环节是如何处理的,包括其中每个环境可能隐藏的问题;数据结构,数据内容可能出现的问题。
3.1.1 数据结构
我们将在HBase中存储两个电话号码,以及通话建立的时间和通话持续时间,
最后再加上一个flag作为判断第一个电话号码是否为主叫。
姓名字段的存储我们可以放置于另外一张表做关联查询,当然也可以插入到当前表中。
表5
列名 |
解释 |
举例 |
call1 |
第一个手机号码 |
15369468720 |
call1_name |
第一个手机号码人姓名(非必须) |
李雁 |
call2 |
第二个手机号码 |
19920860202 |
call2_name |
第二个手机号码人姓名(非必须) |
卫艺 |
date_time |
建立通话的时间 |
20171017081520 |
date_time_ts |
建立通话的时间(时间戳形式) |
|
duration |
通话持续时间(秒) |
0600 |
3.2 数据采集/消费(存储)
我们常用的一种模型是:
线上数据 --> flume --> kafka --> flume(根据情景增删该流程) --> HDFS
消费存储模块流程如图2所示:
1)启动zookeeper,kafka集群
[lxl@hadoop102 kafka]$ bin/kafka-server-start.sh config/server.properties............
2)创建kafka主题
[lxl@hadoop102 kafka]$ bin/kafka-topics.sh --zookeeper hadoop102:2181 --create --topic ct --partitions 3 --replication-factor 2
检查一下是否创建主题成功:
$ /opt/module/kafka/bin/kafka-topics.sh --zookeeper hadoop102:2181 --list
3)启动kafka控制台消费者,等待flume信息的输入
[lxl@hadoop102 kafka]$ bin/kafka-console-consumer.sh --zookeeper hadoop102:2181 --topic ct
4)配置flume(flume-kafka.conf)
# Name the components on this agent a1.sources = r1 a1.sinks = k1 a1.channels = c1# Describe/configure the source a1.sources.r1.type = exec a1.sources.r1.command = tail -F -c +O /opt/module/datas/call.log a1.sources.r1.shell = /bin/bash -c # Describe the sink a1.sinks.k1.type = org.apache.flume.sink.kafka.KafkaSink a1.sinks.k1.kafka.bootstrap.servers = hadoop102:9092,hadoop103:9092,hadoop104:9092 a1.sinks.k1.kafka.topic = ct a1.sinks.k1.kafka.flumeBatchSize = 20 a1.sinks.k1.kafka.producer.acks = 1 a1.sinks.k1.kafka.producer.linger.ms = 1 # Use a channel which buffers events in memory a1.channels.c1.type = memory a1.channels.c1.capacity = 1000 a1.channels.c1.transactionCapacity = 100 # Bind the source and sink to the channel a1.sources.r1.channels = c1 a1.sinks.k1.channel = c1
5)启动flume
[lxl@hadoop102 flume]$ bin/flume-ng agent -c conf/ -n a1 -f /opt/module/flume/job/flume-2-kafka.conf
hbase(main):001:0> scan 'ct:calllog'
代码:
https://github.com/LXL-YAN/project-ct
3.3 数据分析
我们的数据已经完整的采集到了HBase集群中,这次我们需要对采集到的数据进行分析,统计出我们想要的结果。注意,在分析的过程中,我们不一定会采取一个业务指标对应一个mapreduce-job的方式,如果情景允许,我们会采取一个mapreduce分析多个业务指标的方式来进行任务。具体何时采用哪种方式,我们后续会详细探讨。
分析模块流程如图3所示:
业务指标:
a) 用户每天主叫通话个数统计,通话时间统计。
b) 用户每月通话记录统计,通话时间统计。
c) 用户之间亲密关系统计。(通话次数与通话时间体现用户亲密关系)
需求分析
根据需求目标,设计出下述(3.2.2)表结构。我们需要按照时间范围(年月日),结合MapReduce统计出所属时间范围内所有手机号码的通话次数总和以及通话时长总和。
思路:
a) 维度,即某个角度,某个视角,按照时间维度来统计通话,比如我想统计2018年所有月份所有日子的通话记录,那这个维度我们大概可以表述为2018年*月*日
b) 通过Mapper将数据按照不同维度聚合给Reducer
c) 通过Reducer拿到按照各个维度聚合过来的数据,进行汇总,输出
d) 根据业务需求,将Reducer的输出通过Outputformat把数据
数据输入:HBase
数据输出:Mysql
HBase中数据源结构:
表6
标签 |
举例&说明 |
rowkey |
hashregion_call1_datetime_call2_flag_duration 01_15837312345_20170527081033_13766889900_1_0180 |
family |
f1列族:存放主叫信息 f2列族:存放被叫信息 |
call1 |
第一个手机号码 |
call2 |
第二个手机号码 |
date_time |
通话建立的时间,例如:20171017081520 |
date_time_ts |
date_time对应的时间戳形式 |
duration |
通话时长(单位:秒) |
flag |
标记call1是主叫还是被叫(call1的身份与call2的身份互斥) |
a) 已知目标,那么需要结合目标思考已有数据是否能够支撑目标实现;
b) 根据目标数据结构,构建Mysql表结构,建表;
c) 思考代码需要涉及到哪些功能模块,建立不同功能模块对应的包结构。
d) 描述数据,一定是基于某个维度(视角)的,所以构建维度类。比如按照“年”与“手机号码”的组合作为key聚合所有的数据,便可以统计这个手机号码,这一年的相关结果。
e) 自定义OutputFormat用于对接Mysql,使数据输出。
f) 创建相关工具类。
Mysql表结构设计(参考)
我们将分析的结果数据保存到Mysql中,以方便Web端进行查询展示。
1) 表7:db_telecom.tb_contacts
用于存放用户手机号码与联系人姓名。
表7 db_telecom.tb_contacts
列 |
备注 |
类型 |
id |
自增主键 |
int(11) NOT NULL |
telephone |
手机号码 |
varchar(255) NOT NULL |
name |
联系人姓名 |
varchar(255) NOT NULL |
2) 表8:db_telecom.tb_call
用于存放某个时间维度下通话次数与通话时长的总和。
表8 db_telecom.tb_call
列 |
备注 |
类型 |
id_date_contact |
复合主键(联系人维度id,时间维度id) |
varchar(255) NOT NULL |
id_date_dimension |
时间维度id |
int(11) NOT NULL |
id_contact |
查询人的电话号码 |
int(11) NOT NULL |
call_sum |
通话次数总和 |
int(11) NOT NULL DEFAULT 0 |
call_duration_sum |
通话时长总和 |
int(11) NOT NULL DEFAULT 0 |
3) 表9:db_telecom.tb_dimension_date
用于存放时间维度的相关数据
表9 db_telecom.tb_dimension_date
列 |
备注 |
类型 |
id |
自增主键 |
int(11) NOT NULL |
year |
年,当前通话信息所在年 |
int(11) NOT NULL |
month |
月,当前通话信息所在月,如果按照年来统计信息,则month为-1。 |
int(11) NOT NULL |
day |
日,当前通话信息所在日,如果是按照月来统计信息,则day为-1。 |
int(11) NOT NULL |
4) 表10:db_telecom.tb_intimacy
用于存放所有用户用户关系的结果数据。(作业中使用)
表10 db_telecom.tb_intimacy
列 |
备注 |
类型 |
id |
自增主键 |
int(11) NOT NULL |
intimacy_rank |
好友亲密度排名 |
int(11) NOT NULL |
id_contact1 |
联系人1,当前所查询人 |
int(11) NOT NULL |
id_contact2 |
联系人2,与联系人为好友 |
int(11) NOT NULL |
call_count |
两联系人通话次数 |
int(11) NOT NULL DEFAULT 0 |
call_duration_count |
两联系人通话持续时间 |
int(11) NOT NULL DEFAULT 0 |
最终设计:
数据分析流程
3.4 数据展示
数据展示模块流程如图7所示:
转载于:https://www.cnblogs.com/LXL616/p/11186443.html
大数据 电信客服项目相关推荐
- 大数据电信客服项目一——数据生成
源码,资料自取:链接:https://pan.baidu.com/s/1jWcfux9vONLio5LboLSxSQ 提取码:6666 说明:数据生成采用面向接口 ...
- 大数据电信客服-数据分析(三)
目录 一.需求分析 二.Mysql表结构设计 三.环境准备 四.需求实现 ct.analysis ct.analysis.io ct.analysis.kv ct.analysis.mapper ct ...
- 大数据电信客服-数据采集/消费(二)
目录 一.数据采集/消费(存储) 二.数据采集 三.数据消费 四.编写代码 在project-ct.pom 在ct.consume下 在ct.consumer.bean 在ct.consumer.da ...
- 视频教程-新版全面系统完整的电信客服综合案例教程-大数据
新版全面系统完整的电信客服综合案例教程 张长志技术全才.擅长领域:区块链.大数据.Java等.10余年软件研发及企业培训经验,曾为多家大型企业提供企业内训如中石化,中国联通,中国移动等知名企业.拥有丰 ...
- 大数据项目之_15_电信客服分析平台_0102_项目背景+项目架构+项目实现+数据生产+数据采集/消费(存储)
大数据项目之_15_电信客服分析平台_01&02 一.项目背景 二.项目架构 三.项目实现 3.1.数据生产 3.1.1.数据结构 3.1.2.编写代码 3.1.3.打包测试 3.2.数据采集 ...
- 实战▍一个完整的电信客服分析平台大数据项目:架构、实现、数据
作者|黑泽明军 编辑|丹顶鹤5号 电信客服分析平台(附代码) 编者按: 很难见到这种一个完整的大数据项目,从项目背景.项目架构到项目实现都有大量的实例,包括数据存储和数据采集和各个模块的运行设置等等 ...
- 【大数据开发必看】项目一 电信客服
电信客服 需求: 统计每天.每月以及每年的每个人的通话次数及时长 项目架构: 生产数据(ProduceLog) 随机生成电话号(主被叫) 随机生成通话建立时间 随机生成通话时长(30min内) 生成日 ...
- 精准大数据获客——移动 联通 电信运营商大数据分析_营销
目前,移动.联通.电信三大运营商都在加速进行大数据能力建设.完善和丰富大数据的应用模式和基础架构.在大数据时代,企业的销售和营销渠道已由传统模式转为向大数据营销模式,大数据营销模式更顺应时代的变化和发 ...
- 大数据技术基础综合项目——牛客网招聘岗位统计分析
大数据技术基础综合项目--牛客网招聘岗位统计分析 文章目录 大数据技术基础综合项目--牛客网招聘岗位统计分析 零.实验环境说明 一.数据集来源及说明 二.数据预处理阶段 2.1 删除空行的数据 2.2 ...
最新文章
- python 不得不知的第三方库以及常用安装包
- JavaWeb第二讲 重定向与转发 doGet()与doPost()
- 【狂神说】Redis笔记
- 正则控制可以输两位小数、负数,整数
- 如何设置WIN7自动登录(去除登录密码)
- httpclient 在获取返回值时,使用getResponseBody触发警告的问题
- 22. PHP 日期和时间
- 软件测试订单测试用例,测试用例 - 进销存软件测试.doc
- ADB常用命令及其用法大全
- Windows Server 2016-WinSer 2016标准版与数据中心版的区别
- 如何使用GitHub客户端
- forEach(BiConsumer action)方法遍历Map集合
- Rust编程语言入门教程(二)-核心概念(所有权(Ownership) 和生命周期)、变量声明(遍历数组)
- c jave等语言作用,编程语言的前世今生,看 Java、C、C++ 等语言的演变
- Bugzilla安装完初次登录提示“couldn‘t create child process: 720002: index.cgi”解决方法
- 《Python核心编程》第5章 数字 练习
- 洛谷P4084 [USACO17DEC]Barn Painting G 题解
- 为什么前端工作越来越难找了?
- php织梦源码安装,如何安装网上下载的织梦源码
- h5app 实现ios更新跳转appStore