基于 Flink 的实时数据分析系统

本文通过 Flink、Kafka、ElasticSearch 和 Kibana 搭建实时数据分析系统,介绍如何模拟数据、配置环境、使用 Flink 处理数据流并用 Kibana 可视化结果。
摘要由CSDN通过智能技术生成

最近在学 Flink,做了一个实时数据分析的 Demo,流程如下所示:

  • Data Mock:作为生产者模拟数据,负责从本地文件系统中读取数据并发往 Kafka;
  • Zookeeper:Kafka 的依赖;
  • KafKa:消息队列,可以用于发布和订阅消息;
  • Flink:流式处理引擎,作为消费者订阅 Kafka 的消息;
  • ElasticSearch:搜索引擎,也可以作为实时存储引擎;
  • Kibana:可视化 ElasticSearch 中的数据。

除了看过两周 Flink 外,其他的框架都没有接触过,只是简单的拿来用一下,也并不是很了解,所以本篇教程如果有什么错误,欢迎指出。

1.准备

1.1 环境准备

首先是环境准备:

  • Java 8
  • Zookeeper:3.6.1;
  • Kafka:2.6.0;
  • Flink:1.11.1;
  • ElasticSearch:7.8.1
  • Kibana:7.8.1(注意 ES 要与 Kibana 的版本相同)

因为用的是 mac,所以所有环境都可以通过 brew 一键安装,不过还是建议用 Docker 来安装各种环境。

1.2 数据准备

数据用的是淘宝的用户行为数据,可以在阿里天池上下载到,附上下载地址:

数据:https://tianchi.aliyun.com/dataset/dataDetail?dataId=649

数据集包含了 2017 年 11 月 25 日至 2017 年 12 月 3 日之间,约一百万随机用户的所有行为(行为包括点击、购买、加购、喜欢)。数据集的组织形式和 MovieLens-20M 类似,即数据集的每一行表示一条用户行为,由用户ID、商品ID、商品类目ID、行为类型和时间戳组成,并以逗号分隔。数据集中每一列的详细描述如下:

列名称 说明
用户ID 整数类型,序列化后的用户ID
商品ID 整数类型,序列化后的商品ID
商品类目ID 整数类型,序列化后的商品所属类目ID
行为类型 字符串,枚举类型,包括(‘pv’, ‘buy’, ‘cart’, ‘fav’)
时间戳 行为发生的时间戳

关于数据集大小的一些说明如下:

维度 数量
用户数量 987,994
商品数量 4,162,024
商品类目数量 9,439
所有行为数量 100,150,807

2.实战

2.1 Kafka

2.1.1 简介

先简单介绍下 Kafka。

Kafka 是分布式发布-订阅消息的系统,最初由LinkedIn公司开发的,之后成为Apache项目的一部分,Kafka是一个分布式,可划分的,冗余备份的持久性的日志服务,它主要用于处理活跃的流式数据。

kafka的作用类似于缓存,即活跃的数据和离线处理系统之间的缓存。

下图为 Kafka 的架构图:

简单介绍一下:

  • Producer:消息生产者,向 Kafka Broker 发送消息(Push);
  • Consumer:消费者,从 Kafka Broker 订阅消息(Pull);
  • Broker:缓存代理,Kafka 集群中的服务器称为 Broker,每个 Broker 可以容纳多个 Topic;
  • Topic:图上没有显示,消息的订阅和发布需要 Topic,相当于給消息取个名字,好分门别类;
  • Zookeeper:Kafka 通过 Zookeeper 来管理集群,所以启动 Kafka 之前需要先启动 Zookeeper。

Mac 通过 brew install kafka 可以自动安装 zookeeper 和 kafka。

并通过下面的命令分别启动 zookeeper 和 kafka:

zookeeper-server-start /usr/local/etc/kafka/zookeeper.properties & kafka-server-start /usr/local/etc/kafka/server.properties

注意观察启动信息,不要出现错误。

如果要关闭可可以运行下面的命令:

kafka-server-stop & zookeepker-sever-stop

注意:

  • 不要关闭终端,关掉了服务也没了;
  • 通过 ctrl+c 只能关闭 kafka,而无法关闭 Zookeeper。

2.1.2 代码

由于没有线上接口,所以我们需要模拟一个消息源作为 Kafka 的消息生产者。

首先常见一个 maven 项目,建议先统一配置写环境的版本:

<properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <flink.version>1.11.1</flink.version>
    <java.version>1.8</java.version>
    <scala.binary.version>2.12</scala.binary.version>
    <kafka.version>2.6.0</kafka.version>
    <maven.compiler.source>${java.version}</maven.compiler.source>
    <maven.compiler.target>${java.version}</maven.compiler.target>
</properties>

首先导入依赖:

<dependency>
    <groupId>org.apache.kafka</groupId>
    <artifactId>kafka_${scala.binary.version}</artifactId>
    <version>${kafka.version}</version>
</dependency>

<dependency>
    <groupId>org.apache.kafka</groupId>
    <artifactId>kafka-clients</artifactId>
    <version>${kafka.version}</version>
</dependency>

然后创建一个 Kafka 生产者对象:

String kafkaTopic = "user_behavior";
// 使用本地和默认端口
String brokers = "localhost:9092";

Properties kafkaProps = new Properties();
kafkaProps.put("bootstrap.servers", brokers);
kafkaProps.put("key.serializer", ByteArraySerializer.class.getCanonicalName());
kafkaProps.put("value.serializer", ByteArraySerializer.class.getCanonicalName());
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值