Kafka01

Kafka

1. kafka 部署

消息中间件
mysql–>maxwell–>kafka–>ss/flink–>hbase
存储数据
缓冲上游业务高峰给下游带来的压力
作业夯住

流式平台

发布&订阅: 类似一个消息系统,读写流式的数据
处理: 可以编写可扩展的流式app,用于实时事件的响应
存储: 副本备份,容错的集群

https://docs.cloudera.com/documentation/kafka/latest.html
http://archive.cloudera.com/kafka/kafka/4/kafka-2.2.1-kafka4.1.0.tar.gz

修改kafka配置文件

[hadoop@hadoop003 config]$  vim server.properties

broker.id=0
host.name=hadoop003
port=9092
log.dirs=/home/hadoop/tmp/kafka-logs
zookeeper.connect=hadoop003:2181,hadoop004:2181,hadoop005:2181/kafka

[hadoop@hadoop004 config]$  vim server.properties
broker.id=1
host.name=hadoop004
port=9092
log.dirs=/home/hadoop/tmp/kafka-logs
zookeeper.connect=hadoop003:2181, hadoop004:2181, hadoop005:2181/kafka

[hadoop@hadoop005 config]$  vim server.properties

broker.id=2
host.name=hadoop005
port=9092
log.dirs=/home/hadoop/tmp/kafka-logs
zookeeper.connect=hadoop003:2181,hadoop004:2181,hadoop005:2181/kafka


[hadoop@hadoop003 config]$ vim zookeeper.properties
dataDir=/home/hadoop/tmp/zookeeper


[hadoop@hadoop003 bin]$ vim kafka-run-class.sh

if [ -z "$JAVA_HOME" ]; then
  JAVA="/usr/java/jdk"
else
  JAVA="$JAVA_HOME/bin/java"
fi


[hadoop@hadoop003 bin]$ vim kafka-server-stop.sh
SIGNAL=${SIGNAL:-TERM}
PIDS=$(jps -lm | grep -i 'kafka.Kafka'| awk '{print $1}')

[hadoop@hadoop003 app]$ scp -r kafka_2.11-2.2.1-kafka-4.1.0/ hadoop005:/home/hadoop/app/
[hadoop@hadoop003 app]$ scp -r kafka_2.11-2.2.1-kafka-4.1.0/ hadoop004:/home/hadoop/app/

启动集群

nohup bin/kafka-server-start.sh config/server.properties &

查看jps -m

查看topic

kafka-topics.sh --list \
--zookeeper  hadoop003:2181,hadoop004:2181,hadoop005:2181/kafka

创建topic

kafka-topics.sh --create \
--zookeeper  hadoop003:2181,hadoop004:2181,hadoop005:2181/kafka \
--partitions 3 \
--replication-factor 3 \
--topic test

描述

kafka-topics.sh --describe \
--zookeeper  hadoop003:2181,hadoop004:2181,hadoop005:2181/kafka \
--topic test

6.console案例

kafka-console-producer.sh \
--broker-list hadoop003:9092,hadoop004:9092,hadoop005:9092 \
--topic test

kafka-console-consumer.sh \
--bootstrap-server hadoop003:9092,hadoop004:9092,hadoop005:9092 \
--topic test \
--from-beginning

2. kafka 启动脚本编写

#!/bin/bash
case $1 in
"start"){
        for i in hadoop003 hadoop004 hadoop005
        do
                echo "**********$i kafka start **********"
                ssh hadoop@$i "kafka-server-start.sh -daemon /home/hadoop/app/kafka/config/server.properties"
                echo "$i kafka is running"
        done
};;

"stop"){
        for i in hadoop003 hadoop004 hadoop005
        do
                echo "**********$i kafka stop**********"
                ssh hadoop@$i "/home/hadoop/app/kafka/bin/kafka-server-stop.sh /home/hadoop/app/kafka/config/server.properties"
        done
};;
esac

ln -s /usr/mybin/kafka.sh /usr/local/bin/kafka

3. kafka Topic

  1. topic 数据主题,数据记录发布的地方 用来区分业务系统

  2. partition: topic物理上的分组
    一个topic可以分为多个partition
    每个partition都是一个[有序]的队列
    其实就是一个文件夹而已

命名规则—>topic名称-partition序号
如何保证消费有序: 一个partition
producer_parititon_by =table maxwell 自己封装

4. kafka 分区策略

DefaultPartitioner.java

一般来说最好的情况是一个分区对应consumer group 中的一个consumer
consumer数量< partition数量
若出现

  1. topic数发生了变化
  2. partition数发生了变化
  3. 消费者数发生了变化
  4. 消费者消费速度太慢,超过限制时间数量增

加会导致kafka的rebalance

4.1 rebalance

主要流程

  1. 消费者通知kafka有新的消费者加入
  2. kafka会将状态切换到rebalance等待状态,结束当前的所有连接等待分配
  3. kafka选择一个consumer成为leader
  4. kafka将元数据发给所有consumer
  5. 其他consumer持续向kafka要求partition
  6. leader根据分区策略给将partition分配好后发给kafka
  7. kafka将结果给follower

4.2 分区策略分为种

4.2.1 range策略

针对topic分区数进行分配
每个topic分区数 / consumer数量
若除的尽,则平均分配
除不尽,多余的给前排

4.2.2 轮询策略

消费者通过订阅的topic的partition按照字典值排序分配给consumer

4.2.3 粘性

优先均匀,如果发生consumer数量变化,尽量在之前的基础上分配

4.2.4 CooperativeStickAssignor

比粘性策略轻量一些,粘性策略会放弃之前的分区清理数据,重新分配
CooperativeStick会在原先的基础上分配

如何分区:
int parititon
=> send(k,v)

给它设置单分区有序
设置K的值 (通过hash算法设置同个维度的数据放入同个分区)保证他们有序

ack= all 最可靠 性能低
ack=1 每个分区的老大写成功 性能高 保障级别低

retries 100
max.in.flight.requests.per.connection 5 -> 1
如果不设置1,会改变消息的顺序

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值