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
    1. data目录存放的是用户日志数据;
    2. scripts目录存放的是Kafka生产者和消费者;
    3. static/js目录存放的是前端所需要的js框架;
    4. templates目录存放的是html页面;
    5. app.py为web服务器,接收Spark Streaming处理后的结果,并推送实时数据给浏览器;
    6. 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开启情况下。

  1. 利用Python预处理数据 -- producer.py
    1. 实例化KafkaProducer ip+port
    2. 读取 csv.reader(csvfile)
    3. time.sleep(0.1) 每个时间发送一行数据
    4. producer.send('sex',line[9].encode('utf8'))
  2. 写consumer.py测试  
  3. Python操作Kafka:开启zookeeper-server和kafka-server,run producer.py和consumer.py
  4. consumer 的窗口出现结果则成功

4    spark streaming--对接受的数据进行处理,再发送给kafka(kafka->spark streaming->kafka)

利用Spark Streaming实时接收处理Kafka数据以及将处理后的结果发给的Kafka。

典型的wordcount问题,而且是基于Spark流计算。女生的数量,即为0的个数,男生的数量,即为1的个数。

利用Spark Streaming接口reduceByKeyAndWindow,设置窗口大小为1,滑动步长为1,这样统计出的0和1的个数即为每秒男生女生的人数。

  1. 配置Spark开发Kafka环境(mac)//将下载的kafka的所有jar复制到spark中
    1. 下载 spark-streaming-kafka-0-8_2.11-2.1.0.jar 注意version
    2. spark/jars目录下新建kafka目录,把  /usr/local/Cellar/kafka/0.11.0.1/libexec/libs 下所有函数库复制到/usr/local/spark/jars/kafka目录下
  2. 建立项目 --需要做的是建立日志和工程文件,sbt文件=>打包jar=>脚本文件运行
    1. mkdir kafka
    2. kafka目录下新建scala文件存放目录以及scala工程文件 mkdir -p src/main/scala
    3.  日志文件与工程文件
    4. 工程:1. 首先按每秒的频率读取Kafka消息;
      2. 然后对每秒的数据执行wordcount算法,统计出0的个数,1的个数,2的个数;
      3. 最后将上述结果封装成json发送给Kafka;
    5. sbt文件
    6. 编译打包程序 package (sbt下载问题sbt-launch.jar的下载地址时间长)(需要修改配置重新打包)
    7. 编写运行脚本 
    8. sh startup.sh

 

5  UI

Flask-SocketIO实现实时推送数据,利用socket.io.js实现实时接收数据,hightlights.js展现数据

Flask-SocketIO文档

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!

posted on 2017-09-26 14:33  satyrs  阅读(579)  评论(0编辑  收藏  举报

导航