Kafka+Flink在线处理海量数据

kafka(MQ)

在这里插入图片描述
官网:http://kafka.apache.org/

简介

kafka(25W-50W/秒)也是一个消息队列,主要用作流量的削峰平谷,Kafka目前是大数据业界公认的MQ,比较古老的队列有activemq(6000/s),现在流行用的有rabbitmq(1.2W/s),还有ZeroMQ(25W-50W/s,缺点操作繁琐)等。

active、rabbit适用于业务系统,对数据一致性有很强的保护能力(对事务要求高)
Kafka、ZeroMQ适用于大数据场景,或者不是很重要的数据传输过程,速度非常快但是有丢失风险(上亿丢个位)

rabbitmq有六中模式,分别是简单、工作、发布订阅、路由、主题、RPC模式。但Kafka只有一种模式:那就是发布/订阅(与rabbit中的模式是两个概念) kafaka虽然也有在线处理的能力,但是相对于Flink的处理速度来说,太菜了(本文不介绍kefka处理),还有以容错的持久方式存储记录流,但是对于HDFS来说,也太菜了(照样不作介绍),所以只把它当做消息队列。
在这里插入图片描述

  1. kafka可以以单机或者集群的方式来运行,将log数据保存在topic中,每个记录以键、值、时间戳组成。在kafka中有个特别需要注意的地方,在其概念中所有存放入主题中的数据都叫做log(data),日志数据叫做logs
  2. Kafka是用scala语言开发 {(scala是java的衍生语言[底层java],函数式编程,同时支持面向对象),scala文件编译为.class在jvm上运行}
  3. topic:主题,是kafka接收生产者数据并存储的位置,消费者也从主题中消费数据。
  4. broker:在kafka中集群中每个节点都叫做broker;
  5. partiton:分区,每个主题都会有多个分区来确保集群在保存数据时的负载均衡。
  6. 每个分区都是有序的,不变的记录序列,这些记录连续地附加到结构化的提交数据中。每个分区的记录都分配有一个称为偏移的顺序ID号(offset),该ID唯一的标示分区中的每个记录(实际上,基于每个消费者保留的唯一元数据是该消费者在数据中的偏移量或位置,下次消费者从该位置继续读取)。
    在这里插入图片描述
  7. 在kafka中所有数据都可以定义保存时间(默认七天)在有效期内,不管数据是否被消费,都不会被删除,反之,当时间超过有效期,不管是否被消费过,过期数据都会被清除。
  8. Kafka的性能相对于数据大小实际上是恒定的(常规思维:数据越大,速度越慢),因此长时间存储数据不是问题。
  • 消费者在消费数据时的读取过程:Kafka将数据保存在文件中,每个存放数据的大小固定(默认1G,配置文件110行,默认七天在168行),并且保存了文件序号和文件长度之间的映射关系,用来快速定位你要读取的数据在哪个文件中。找到文件之后,文件中的数据又按每行数据的长度进行了编号(offsetId),编号和数据的映射关系方便了文件内进行数据定位。所以kafka中数据的量的多少对查询速度的影响是比较小的;
    在这里插入图片描述

Quickstart

Zookeeper环境

tar -xvf zookeeper-3.4.8.tar.gz   
cd zookeeper-3.4.8/conf
cp zoo_sample.cfg zoo.cfg                 #默认配置文件名zoo.cfg
vim zoo.cfg

tickTime=2000                              #tickTime心跳时间,
clientPort=2181                            #访问端口
dataDir=/home/app/zookeeper-3.4.8/tmp      #设置日志路径
server.1=hadoop01:2888:3888                #集群最少3个节点,可按机器名
server.2=hadoop02:2888:3888                #2888指follower连leader端口
server.3=hadoop03:2888:3888                #3888指定选举的端口

cd ../
mkdir tmp
vim tmp/myid                     #1:第一台节点id号,选举是大号优先,超半当选
cd /home/app
scp -r zookeeper-3.4.8 root@hadoop02:/home/app     #复制到02/03并修改myid号

#在bin目录下执行zookeeper的启动/停止命令
./zkServer.sh start(stop)
#检查是否启动成功
./zkServer.sh status(leader  or  flower)

在这里插入图片描述

安装kafka

cd kafka_2.13-2.4.1/config/
vim server.properties                                            #kafka所有配置都在里面

broker.id=0                                                      #当前集群节点编号
log.dirs=/home/app/kafka_2.13-2.4.1/tmp/kafka-logs               #kafka数据存储目录
zookeeper.connect=hadoop01:2181,hadoop02:2181,hadoop03:2181      #连接zookeeper集群
  • 启动kafka
cd /home/app/kafka_2.13-2.4.1
bin/kafka-server-start.sh config/server.properties &

成功启动:
在这里插入图片描述

kafka的运用

  • 创建主题 flux
bin/kafka-topics.sh --create --bootstrap-server localhost:9092 --replication-factor 1 --partitions 1 -topic flux

参数介绍:

–create: 要创建主题
–replication-factor:副本个数
–partitions:主题分区存储,分区的个数
–topic:主题名(唯一,不能重复)
可以使用 --list 命令查看所有topic

bin/kafka-topics.sh --list --bootstrap-server localhost:9092
  • 开启生产者
bin/kafka-console-producer.sh  --broker-list localhost:9092  --topic flux
  • 开启消费者
bin/kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic flux --from-beginning

完成后在生产者中敲入什么,在消费者中就可以接收到什么

  • 观察
    vim tmp/kafka-logs
    在这里插入图片描述

Flink

官网:https://flink.apache.org/
在这里插入图片描述

介绍

Apache Flink是一个框架和分布式处理引擎,用于对无界(流式)和有界数据流(离线)进行有状态计算。Flink设计为在所有常见的集群环境中运行,以内存速度和任何规模执行计算。
Flink是一个真正意义上的流式处理引擎,流式处理模式中可以达到百毫秒以下,吞吐量也不错。同kafka一样,也是由scala开发的。

对手:
Storm速度也非常快,能达到亚秒级(200sm)。
SparkStreaming也是做实时分析的,但是速度不及Storm,大概在1-5秒,但是吞吐量远远超过Storm。Storm相当于一条一条处理,它相当于批量处理。

  • Flink的抽象级别
    在这里插入图片描述
    目前SQL层还没有完成
  • Flink程序的基本构成
    Source:数据源
    Transformation:转化
    Sink:输出
    在这里插入图片描述
  • 元组 :Tuple ,类似一个多元的Map(Integer 0,Stirng 1,Integer 2,Person3,Integer 4)

Flink开发步骤

  • maven坐标
<dependency>
  <groupId>org.apache.flink</groupId>
  <artifactId>flink-core</artifactId>
  <version>1.9.0</version>
  </dependency>
<dependency>
  <groupId>org.apache.flink</groupId>
  <artifactId>flink-java</artifactId>
  <version>1.9.0</version>
  <scope>provided</scope>
</dependency>
<dependency>
  <groupId>org.apache.flink</groupId>
  <artifactId>flink-streaming-java_2.11</artifactId>
  <version>1.9.0</version>
  <scope>provided</scope>
</dependency>
  1. 获得execution environment
  2. 加载/创建初始数据
  3. 指定对此数据的转换
  4. 指定将计算结果放在何处
  5. 触发程序执行
  • 在flink中有两大类API
    1.DataSet:离线 》》》》 执行环境:ExecutionEnvironment
    2.DataStream:在线 》》 执行环境:StreamExecutionEnvironment
    在这里插入图片描述
public class SourceTest {
    public static void main(String[] args) throws Exception {
        //获取执行环境
        /*
        说明:
            在flink中有两大类API
            1.DataSet:离线 执行环境:ExecutionEnvironment
            2.DataStream:在线(也可处理离线,离线数据以流的形式处理,资源消费大) 
                         执行环境:StreamExecutionEnvironment
            获取执行环境对象的方式一般使用.getExecutionEnvironment()
         */
        ExecutionEnvironment env = ExecutionEnvironment.getExecutionEnvironment();
        //通过环境获取数据:Source
        /*
        说明:
            source的获取需要env来进行,主要的source类型有以下几个
            1.readTextFile(path):读取文件(从本地读取,或者HDFS)
            2.fromCollection(Collection):从集合中读取数据,一般在测试时使用,
            或者从关系型数据库读取数据到集合后,使用fromCollection来读取到flink环境中
            3.fromElements(T ...):纯测试时使用
         */
        List<String> list = new ArrayList<String>();
        list.add("Hadoop");
        list.add("Hadoop");
        list.add("Flink");
        list.add("Flink");
        list.add("Hadoop");
        DataSource<String> source = env.fromCollection(list);
        //指定对此数据的转换.transfromation 
        /*
         "Hadoop"--->("Hadoop",1) --->("Hadoop",3)
         */
        source.map(new MapFunction<String, Tuple2<String,Integer>>() {
            public Tuple2<String, Integer> map(String value) throws Exception {
                return new Tuple2<String, Integer>(value,1);
            } //分组   求和
        }).groupBy(0).sum(1)
        //指定将计算结果放在何处 sink
        .print();
        //触发程序执行
    }
}
  • 2
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值