本项目实现了一个基于Spark Streaming和Kafka的通话记录实时处理系统,主要功能包括:
-
模拟生成通话记录数据并发送到Kafka
-
使用Spark Streaming从Kafka消费数据
-
对通话记录进行处理并存储到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进行数据处理
环境配置问题解决
在项目实现过程中遇到并解决了以下环境问题:
-
Python环境问题:
sudo apt-get install python3.6-dev
-
安装Python开发包解决编译依赖
-
-
Spark版本问题:
pip uninstall pyspark pip install pyspark==2.4.8
确保Spark版本与集群环境一致 -
HDFS权限问题:
hdfs dfs -mkdir -p /spark-eventlog hdfs dfs -chmod 777 /spark-eventlog chown -R spark:spark /usr/local/hadoop/tmp/dfs
解决HDFS目录权限问题 -
依赖库问题:
pip install lz4==3.1.3
安装兼容版本的压缩库
项目架构
复制
下载
+----------------+ +---------------+ +---------------+ +-----+ | 数据生成程序 | -> | Kafka消息队列 | -> | Spark Streaming | -> | HDFS | +----------------+ +---------------+ +---------------+ +-----+
总结
本项目完整实现了从数据生成、消息队列传输到实时处理的完整流程,关键技术点包括:
-
Kafka生产者和消费者的使用
-
Spark Streaming实时处理框架
-
结构化数据处理与存储
-
大数据环境配置与问题排查
这种架构可以扩展到其他实时数据处理场景,如日志分析、用户行为跟踪等。关键是要处理好环境依赖和版本兼容性问题。