爬虫课程:原生队列、多线程重复消费的问题、ArrayBlockingQueue阻塞队列
分布式爬虫:使用Redis的list数据结构做队列。
分布式电商:AMQ 消息队列、发布一个商品时发送一个消息,有程序消费消息创建静态化页面。
Apache Kafka:消息队列、随着大数据兴起,现在非常流行。
是什么?有什么用?怎么用?
是什么?三个定义
有什么用?(消息队列有什么用?)
Kafka Cluster:由多个服务器组成。每个服务器单独的名字broker(掮客)。
Kafka Producer:生产者、负责生产数据。
Kafka consumer:消费者、负责消费数据。
Kafka Topic: 主题,一类消息的名称。存储数据时将一类数据存放在某个topci下,消费数据也是消费一类数据。
订单系统:创建一个topic,叫做order。
用户系统:创建一个topic,叫做user。
商品系统:创建一个topic,叫做product。
注意:Kafka的元数据都是存放在zookeeper中。
192.168.140.128 kafka01
192.168.140.129 kafka02
192.168.140.130 kafka03
1)安装jdk、安装zookeeper
2)安装目录
安装包存放的目录:/export/software
安装程序存放的目录:/export/servers
数据目录:/export/data
日志目录:/export/logs
mkdir -p /export/servers/ mkdir -p /export/software / mkdir -p /export/data / mkdir -p /export/logs / |
3)安装用户
安装hadoop,会创建一个hadoop用户
安装kafka,创建一个kafka用户
或者 创建bigdata用户,用来安装所有的大数据软件。
本例:使用root用户
zkServer.sh status
由于kafka是scala语言编写的,基于scala的多个版本,kafka发布了多个版本。
其中2.11是推荐版本。
tar -zxvf kafka_2.11-1.0.0.tgz -C /export/servers/ cd /export/servers/ rm -rf /export/servers/kafka rm -rf /export/logs/kafka/ rm -rf /export/data/kafka mv kafka_2.11-1.0.0 kafka |
4.3.3.1查看目录
4.3.3.2修改配置文件
进入配置目录,查看server.properties文件
cat server.properties |grep -v "#"
通过以上命令,查看到了默认的配置文件,对默认的文件进行修改。
修改三个地方
# broker.id 标识了kafka集群中一个唯一broker。 broker.id=0 num.network.threads=3 num.io.threads=8 socket.send.buffer.bytes=102400 socket.receive.buffer.bytes=102400 socket.request.max.bytes=104857600
# 存放生产者生产的数据 数据一般以topic的方式存放 # 创建一个数据存放目录 /export/data/kafka --- mkdir -p /export/data/kafka log.dirs=/export/data/kafka
num.partitions=1 num.recovery.threads.per.data.dir=1 offsets.topic.replication.factor=1 transaction.state.log.replication.factor=1 transaction.state.log.min.isr=1 log.retention.hours=168 log.segment.bytes=1073741824 log.retention.check.interval.ms=300000
# zk的信息 zookeeper.connect=zk01:2181,zk02:2181,zk03:2181 zookeeper.connection.timeout.ms=6000 group.initial.rebalance.delay.ms=0 |
将修改好的配置文件,分发到node02,node03上。
先在node02、node03上删除以往的安装记录
rm -rf /export/servers/kafka rm -rf /export/logs/kafka/ rm -rf /export/data/kafka |
分发安装包
scp -r /export/servers/kafka/ node02:/export/servers/ scp -r /export/servers/kafka/ node03:/export/servers/ |
修改node02上的broker.id
vi /export/servers/kafka/config/server.properties |
修改node03上的broker.id
vi /export/servers/kafka/config/server.properties |
cd /export/servers/kafka/bin ./kafka-server-start.sh /export/servers/kafka/config/server.properties |
由于kafka集群并没有UI界面可以查看。
需要借助外部工具,来查看卡夫卡的集群
这个工具是一个java程序,必须要安装好JDK
需求:订单系统,需要发送消息。 后面后3个程序需要接受这个消息,并做后续的处理。
bin/kafka-topics.sh --create --zookeeper zk01:2181 --replication-factor 1 --partitions 1 --topic order |
bin/kafka-console-producer.sh --broker-list kafka01:9092 --topic order |
bin/kafka-console-consumer.sh --zookeeper zk01:2181 --from-beginning --topic order |
1)java工程-maven,依赖。
<dependency> |
/** |
/**
|
bin/kafka-topics.sh --create --zookeeper zk01:2181 --replication-factor 1 --partitions 1 --topic order
分片:solrcloud中有提及到。
当数据量非常大的时候,一个服务器存放不了,就将数据分成两个或者多个部分,存放在多台服务器上。每个服务器上的数据,叫做一个分片。
副本:solrcloud中有提及到。
当数据只保存一份的时候,有丢失的风险。为了更好的容错和容灾,将数据拷贝几份,保存到不同的机器上。
如果broker迟迟不给ack,而buffer又满了。
开发者可以设置是否直接清空buffer中的数据。
broker端的消息不丢失,其实就是用partition副本机制来保证。
Producer ack -1. 能够保证所有的副本都同步好了数据。其中一台机器挂了,并不影像数据的完整性。
只要记录offset值,消费者端不会存在消息不丢失的可能。只会重复消费。
segment段中有两个核心的文件一个是log,一个是index。 当log文件等于1G时,新的会写入到下一个segment中。
通过下图中的数据,可以看到一个segment段差不多会存储70万条数据。
kafka在数据生产的时候,有一个数据分发策略。默认的情况使用DefaultPartitioner.class类。
这个类中就定义数据分发的策略。
Utils.toPositive(Utils.murmur2(keyBytes)) % numPartitions
数据分发策略的时候,可以指定数据发往哪个partition。
当ProducerRecord 的构造参数中有partition的时候,就可以发送到对应partition上
/**
|
如果生产者没有指定partition,但是发送消息中有key,就key的hash值。
/**
|
既没有指定partition,也没有key的情况下如何发送数据。
使用轮询的方式发送数据。
/**
|
一个partition只能被一个组中的成员消费。
所以如果消费组中有多于partition数量的消费者,那么一定会有消费者无法消费数据。
7.2 、UI界面