Spark和Kafka的实时通话计费系统样例笔记

本项目实现了一个基于Spark Streaming和Kafka的通话记录实时处理系统,主要功能包括:

  1. 模拟生成通话记录数据并发送到Kafka

  2. 使用Spark Streaming从Kafka消费数据

  3. 对通话记录进行处理并存储到HDFS

关键技术点

1. Kafka生产者实现

import random, datetime, time
from kafka import KafkaProducer

def gen_phone_num():
    phone = '13'
    for x in range(9):
        phone = phone + str(random.randint(0, 9))
    return phone

producer = KafkaProducer(bootstrap_servers="localhost:9092")
  • 生成随机手机号(13开头11位数字)

  • 模拟通话记录数据(主叫、被叫、拨打时间、接通时间、挂断时间)

  • 使用手机号前三位作为Kafka topic

  • 随机间隔(0-1秒)发送消息

2. Spark Streaming消费Kafka数据

from pyspark.streaming.kafka import KafkaUtils
from pyspark import SparkContext
from pyspark.streaming import StreamingContext

sc = SparkContext('local[2]','KafkaStreamBilling')
ssc = StreamingContext(sc, 5)  # 5秒批处理间隔

streamRdd = KafkaUtils.createDirectStream(ssc,
               topics=['130','131','132','133','134','135','136','137','138','139'],
               kafkaParams={"metadata.broker.list": "localhost:9092"})
  • 创建Spark Streaming上下文

  • 直接连接Kafka(不使用Receiver)

  • 订阅多个topic(手机号前三位)

3. 数据处理与存储

def process(x):
    v = x[1].split(',')
    tformat = '%Y-%m-%d %H:%M:%S'
    d1 = datetime.strptime(v[3], tformat)  # 接通时间
    d2 = datetime.strptime(v[4], tformat)  # 挂断时间
    ym = '%d%02d' % (d1.year, d1.month)   # 年月
    sec = (d2-d1).seconds
    minutes = sec//60 if sec%60==0 else sec//60+1  # 计算通话分钟数
    return (v[0],v[2],v[3],v[4],str(minutes),v[1],ym)

def save(rdd):
    if not rdd.isEmpty():
        rdd2 = rdd.map(lambda x: process(x))
        df0 = rdd2.toDF(['src_phone', 'dail_time', 'call_time', 'hangup_time',
                         'call_minutes', 'dst_phone', 'ym'])
        df0.createOrReplaceTempView("phonecall")
        # 按年月分区存储到HDFS
        path = "hdfs://localhost:9000/datas/" + year_month + "/"
        df0.drop("ym").write.save(path, format="csv", mode="append")
  • 计算通话时长(按分钟计费)

  • 按年月分区存储到HDFS

  • 使用Spark SQL进行数据处理

环境配置问题解决

在项目实现过程中遇到并解决了以下环境问题:

  1. Python环境问题:

    sudo apt-get install python3.6-dev
    • 安装Python开发包解决编译依赖

  2. Spark版本问题:

    pip uninstall pyspark
    pip install pyspark==2.4.8
    确保Spark版本与集群环境一致
  3. HDFS权限问题:

    hdfs dfs -mkdir -p /spark-eventlog
    hdfs dfs -chmod 777 /spark-eventlog
    chown -R spark:spark /usr/local/hadoop/tmp/dfs
    解决HDFS目录权限问题
  4. 依赖库问题:

    pip install lz4==3.1.3
    安装兼容版本的压缩库

项目架构

复制

下载

+----------------+    +---------------+    +---------------+    +-----+
| 数据生成程序    | -> | Kafka消息队列  | -> | Spark Streaming | -> | HDFS |
+----------------+    +---------------+    +---------------+    +-----+

总结

本项目完整实现了从数据生成、消息队列传输到实时处理的完整流程,关键技术点包括:

  1. Kafka生产者和消费者的使用

  2. Spark Streaming实时处理框架

  3. 结构化数据处理与存储

  4. 大数据环境配置与问题排查

这种架构可以扩展到其他实时数据处理场景,如日志分析、用户行为跟踪等。关键是要处理好环境依赖和版本兼容性问题。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值