本项目需求是:统计每天、每月以及每年的每个人的通话次数及时长
架构图:
本项目是一个离线项目,流程是:
一、生产数据是实际生产环境中的一些日志文件等,其中该日志文件需要进行数据清洗,然后获取有效字段,本电信项目需要的有效字段有:
主叫手机号:call1 ,被叫手机号:call2,建立通话的时间:buildTime,通话时长:duration
二、 使用Flume收集日志,然后传输到Kafka队列中,其中Flume的类型就可以确定
source:exec类型,其中source可以是多个,因为,集群上每一台机器都可以产生日志,都需要监听
channel:无疑问的选择的是memory,这样速度快
sink:下游选择的是kafka,需要在flume配置文件中指定kafka的topic,地址等,具体的配置见后面
三、Kafka传输消息
需要创建topic
四、Hbase这是项目中核心之一
本项目使用Hbase进行存储,Hbase存储阶段需要做很多事情,比如,预分区,rowkey的设计,包括查询这块,考虑的问题有怎样把数据存的即分散又相对集中,比如,一个人的每天每月每年的通话记录怎么放才能在查询的时候快,包括查询,查询一个人的4月到9月该怎么查,又改怎么过滤
五、mapreduce分析
分析可以用很多框架,比如hive,spark等等,在这选择的是mapreduce,其中怎么把数据在写到mysql的output也是关键
六、展示
展示的话是纯属于Java EE的工作,可以使用各种报表等
步骤:
把以上的即集群环境搭好,配置flume如下
# define
a1.sources = r1
a1.sinks = k1
a1.channels = c1
# source
a1.sources.r1.type = exec
a1.sources.r1.command = tail -F -c +0 /home/atguigu/call/calllog.csv
a1.sources.r1.shell = /bin/bash -c
# 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 = calllog
a1.sinks.k1.kafka.flumeBatchSize = 20
a1.sinks.k1.kafka.producer.acks = 1
a1.sinks.k1.kafka.producer.linger.ms = 1
# channel
a1.channels.c1.type = memory
a1.channels.c1.capacity = 1000
a1.channels.c1.transactionCapacity = 100
# bind
a1.sources.r1.channels = c1
a1.sinks.k1.channel = c1