Spark+Kafka(project)
地址 :https://github.com/yuqingwang15/kafka-spark
- 案例实时统计每秒中男女生购物人数,因此针对每条购物日志,我们只需要获取gender即可,然后发送给Kafka,接下来Spark Streaming再接收gender进行处理。
1 应用程序将购物日志发送给Kafka主题"sex",每间隔相同的时间发送给Kafka。
2 Streaming从Kafka主题"sex"读取并处理消息,可以按每5秒作为窗口大小读取一次数据,然后再处理数据。
3 Spark将处理后的数据发送给Kafka,topic为"result"
4 Flask搭建一个web应用程序,接收Kafka主题为"result"的消息。
5 Flask-SocketIO将数据实时推送给客户端。
6 客户端浏览器利用js框架socketio实时接收数据,然后利用js可视化库hightlights.js库动态展示。
-
Ubuntu: 16.04 Spark: 2.1.0 Scala: 2.11.8 kafka: 0.8.2.2 Python: 3.x(3.0以上版本) Flask: 0.12.1 Flask-SocketIO: 2.8.6 kafka-python: 1.3.3
- data目录存放的是用户日志数据;
- scripts目录存放的是Kafka生产者和消费者;
- static/js目录存放的是前端所需要的js框架;
- templates目录存放的是html页面;
- app.py为web服务器,接收Spark Streaming处理后的结果,并推送实时数据给浏览器;
- External Libraries是本项目所依赖的Python库,是PyCharm自动生成。
1 Kafka--kafka各模块作用
1. Broker Kafka集群包含一个或多个服务器,这种服务器被称为broker
2. Topic 每条发布到Kafka集群的消息都有一个类别,这个类别被称为Topic。(物理上不同Topic的消息分开存储,逻辑上一个Topic的消息虽然保存于一个或多个broker上但用户只需指定消息的Topic即可生产或消费数据而不必关心数据存于何处)。topic是发布消息发布的category,以单节点的配置创建了一个叫dblab的topic.可以用list列出所有创建的topics,来查看刚才创建的主题是否存在。
3. Partition Partition是物理上的概念,每个Topic包含一个或多个Partition.
4. Producer 负责发布消息到Kafka broker
5. Consumer 消息消费者,向Kafka broker读取消息的客户端。
6. Consumer Group 每个Consumer属于一个特定的Consumer Group(可为每个Consumer指定group name,若不指定group name则属于默认的group)
2 test for installation(mac)--打开3个不同终端输入,分别为zookeeper-server,kafka-server, kafka-topics
cd /usr/local/bin
1zookeeper-server-start config/zookeeper.properties
2kafka-server-start config/server.properties
3kafka-topics --create --zookeeper localhost:2181 --replication-factor 1 --partitions 1 --topic dblab
kafka-topics --list --zookeeper localhost:2181
kafka-console-producer --broker-list localhost:9092 --topic dblab 输入数据
kafka-console-consumer --zookeeper localhost:2181 --topic dblab --from-beginning 得到输入的数据
3 data processing--kafka的producer发送数据,consumer接收。在zookeeper和kafka server开启情况下。
- 利用Python预处理数据 -- producer.py
- 实例化KafkaProducer ip+port
- 读取 csv.reader(csvfile)
- time.sleep(0.1) 每个时间发送一行数据
- producer.send('sex',line[9].encode('utf8'))
- 写consumer.py测试
- Python操作Kafka:开启zookeeper-server和kafka-server,run producer.py和consumer.py
- consumer 的窗口出现结果则成功
4 spark streaming--对接受的数据进行处理,再发送给kafka(kafka->spark streaming->kafka)
利用Spark Streaming实时接收处理Kafka数据以及将处理后的结果发给的Kafka。
典型的wordcount问题,而且是基于Spark流计算。女生的数量,即为0的个数,男生的数量,即为1的个数。
利用Spark Streaming接口reduceByKeyAndWindow,设置窗口大小为1,滑动步长为1,这样统计出的0和1的个数即为每秒男生女生的人数。
- 配置Spark开发Kafka环境(mac)//将下载的kafka的所有jar复制到spark中
- 下载 spark-streaming-kafka-0-8_2.11-2.1.0.jar 注意version
- spark/jars目录下新建kafka目录,把 /usr/local/Cellar/kafka/0.11.0.1/libexec/libs 下所有函数库复制到/usr/local/spark/jars/kafka目录下
- 建立项目 --需要做的是建立日志和工程文件,sbt文件=>打包jar=>脚本文件运行
- mkdir kafka
- kafka目录下新建scala文件存放目录以及scala工程文件 mkdir -p src/main/scala
-
日志文件与工程文件
- 工程:1. 首先按每秒的频率读取Kafka消息;
2. 然后对每秒的数据执行wordcount算法,统计出0的个数,1的个数,2的个数;
3. 最后将上述结果封装成json发送给Kafka; - sbt文件
- 编译打包程序 package (sbt下载问题sbt-launch.jar的下载地址时间长)(需要修改配置重新打包)
- 编写运行脚本
- sh startup.sh
5 UI
Flask-SocketIO实现实时推送数据,利用socket.io.js实现实时接收数据,hightlights.js展现数据
background_thread函数,该函数从Kafka接收消息,并进行处理,获得男女生每秒钟人数,然后将结果通过函数socketio.emit实时推送至浏览器。
socket.io.js实时接收服务端发送的消息,并将值实时设置在htm标签内,然后由hightlights.js实时从html标签获取数据并展示
REFERENCE:
mac command :http://blog.csdn.net/wmsjlihuan/article/details/72957077
linux command: http://man.linuxde.net/rm https://wenku.baidu.com/view/80c2c4be89eb172dec63b764.html
http://dblab.xmu.edu.cn/blog/1538/#more-1538
Thanks again for professor lin!