第一章:初识Kafka
第二章:部署Kafka
第三章:Kafka测试
第一章:初识Kafka
官网:http://kafka.apache.org/
部署环境:阿里云三台机器
Kafka在生产中的定位:
-
只做消息中间件,仅仅只做消息的存储,起到上游和下游的一个缓冲的作用,与分布式流式平台挂钩(Kafka、Storm)
-
kafka在以前的版本中就叫做消息中间件,现在官网的定位是分布式流式平台(A distributed streaming platform),虽然kafka给自己的定位是这样的,但是生产上90%的场景是消息中间件。
讲到消息中间件我们引出flume:
1、我们知道在Flume中有一个进程:一个进程包含三个角色
- source、channel、sink
2、在Kafka中可以理解为有三个进程 --> 三个角色,kafka部署的进程叫broker。
- producer(生产者)、broker、consumer(消费者)
3、对应生产架构,95%的场景都是这样:Flume --> Kafka --> Spark Streaming/Flink
- Flume的数据发送到Kafka,Spark Streaming / Flink来消费数据
企业为什么还是选择Spark的多,因为它囊括了Spark Core、Spark SQL、Spark Streaming、Spark机器学习、Spark结构化流;无论做离线或者实时,只要通过一种组件就囊括数据开发和挖掘。离线处理:Spark-core、Spark SQL
1.1 Kafka官网介绍
Kafka部署的进程叫 broker:
1、消息中间件:Read and Write streams of data like a messaging system
2、处理:Write scalable stream processing applications that react to events in real-time
3、存储:Store streams of data safely in a distributed,replicated,fault-tolerant cluster
生产上一般Kafka只用做消息中间件和存储,Kafka的存储是分布式、提供副本、高容错的。
二、Documentation(指导)
1.2 Kafka生产中版本的选择
版本选择:0.10.0.X
why choice it(0.10.0.X)?
1、70%的公司都是选择CDH版本的。J总生产版本CDH-5.12.0,而我们自己学习的版本为CDH-5.7.0,我们要学会举一反三。
eg.企业生产版本和我们学习版本不一致,如何去做?
- 替换版本
进入到如下网址:https://www.cloudera.com/documentation/kafka/latest.html,点击SELECT A DIFFERENT VERSION,CDK指的是kafka在CDH中的简写。
2、点击Version and Packaging
1、注意版本选择:
- https://docs.cloudera.com/documentation/kafka/latest/topics/kafka_packaging.html
eg.生产使用cdh2.12.0,看官网,Minumum Supported CDH Version(最小支持的CDH版本),自行选择相近的版本。
- CDH的版本尽量选择5.X较新的,比如生产版本是CDH5.12.0,kafka版本选择0.10.0和0.11.0;
2、Kafka+Spark Streaming的版本选择
Kafka版本的还有一个维度选择是Spark Streaming,官网推荐的是0.10+。
http://spark.apache.org/docs/latest/streaming-kafka-integration.html
3、生产上Kafka的选择
2.2.0 Apache Kafka 0.10.2.0+kafka2.2.0+110 July 13, 2017 //以这一条为例,其实是由三部分构成
base_version+cloudera_version+patch_level
kafka_2.11-0.10.2-kafka-2.2.0.jar
Kafka2.11:scala版本
2.2.0是cloudera公司给的版本号,110是cloudera公司打的补丁号
- base_version is the version of the open-source component included in the Cloudera package.
- cloudera_version is the version of the Cloudera package.
- patch_level is the number of source commits applied on top of the base version forked from the Apache Kafka branch. Note that the number of commits does not indicate the number of functional changes or bug fixes in the release. For example, a commit can be used to amend a version number or make other non-functional changes.
要注意:kafka-clients-0.10.2-kafka-2.2.0.jar的版本,否则会引起生产上API的抛错。
在我们本次课程学习中还是使用Apache版本:
回顾CDH部署过程中,hdfs yarn zk hive hbase spark(1.6.x),额外单独部署,自定义parcel:kafka、spark2;
- http://archive.cloudera.com/cdh5/cdh/5/ ,在这个目录下是没有kafka的版本的,
更换网址后找到的也只是它的源代码包而已:http://archive.cloudera.com/kafka/kafka/2/
进入到kafka.apache.org上,找到对应的0.10版本,https://www.apache.org/dyn/closer.cgi?path=/kafka/0.10.0.0/kafka_2.11-0.10.0.0.tgz
小结:为什么选择0.10的分支?
1、Apache版本
-rw-rw-r-- 1 1000 1000 31M May 24 2016 kafka_2.11-0.10.0.0.tgz
2、CDH版本
- 对于kafka在生产上的部署,需要额外的独立部署,需要自定义的包裹文件,官网上并没有提供
- Apache的版本选择就是kafka_2.11-0.10.0.0.tgz,CDH相比于kafka多出的一个是kafka_2.11-0.10.2-kafka-2.2.0.jar后面的kafka-2.2.0,
- 我们的zookeeper还是选择cdh系列
注意:CDH上的kafka、spark2是根据包裹文件:KAFKA-2.2.0-1.2.2.0.p0.68-e17.parcel自定义去部署完成的。
1.3 Kafka的一些相关概念
第一个概念
kafka、spark是scala编程的
- 主题:topic
生产业务:
- oms订单系统是存储在mysql中的,我们通过flume抽取的,把数据抽取到kafka(omstopic),sparkstreaming1来进行消费
- wms仓库系统:mysql --> flume --> kafka(wmstopic) --> sparkstreaming2来进行消费
oms订单系统 mysql --> flume --> kafka(omstopic) --> ss1
wms订单系统 mysql --> flume --> kafka(wmstopic) --> ss2
mkdir omstopic文件夹 oms系统的数据就放到omstopic文件夹
mkdir wmstopic文件夹 wms系统的数据就放到wmstopic文件夹
kafka创建主题:一般根据生产业务处理数据来划分,omskafka和wmskafka两个topic其实是一个topic;一般是根据生产业务 上游+数据处理来划分。
最终落在磁盘上就是创建文件夹(linux文件夹)
第二个概念:分区
omstopic 3个分区
p0 omstopic_0
p1 omstopic_1
p2 omstopic_2
- 比如我们有1~100条数据,写到omstopic,omstopic有三个分区,可能第一个分区写了40个,第二个分区写了20个,第三个分区写了40个。
第三个概念:副本
- 相当于我们hdfs上的一个文件130M,切了两个块,==> 分区;这两个块每个块都有三个副本,相当于是复制的意思。
omstopic_0 omstopic_0 omstopic_0
omstopic_1 omstopic_1 omstopic_1
omstopic_2 omstopic_2 omstopic_2
第四个概念:offset
抛开Kafka不谈,mysql建完表后,会有一个自增长主键,就相当于是一个索引,offset的索引是从0开始的。
- 数据是落在文件的一个位置,以二进制的形式来的。
key | value |
---|---|
1 | aaa |
2 | bbb |
3 | ccc |
4 | ddd |
抛出生产场景:全局有序
知道索引,知道下标后,精准消费
1、很多公司生产上60%的情况都是log日志,如果log日志是无序的状态,我们应该开心.
2、很多公司40%都是业务数据,比如mysql是一个有序状态,eg:我们在淘宝看中一双鞋,加入购物车,使用了insert操作;看了这双鞋不喜欢,把它删除购物车,做了update动作;我们添加一个口红,也是做了update动作;清空购物车,最后再做了一个delete操作;
- 对于一个订单,最先肯定是insert插入,然后是update更新操作,付完款后最后就是delete。
总结:
很多公司为了保证全局有序:
首先引出概念:
- Kafka数据的文件是Linux磁盘文件 是有序状态,也就是分区内有序。
在这种场景下,如何解决?
- 有些公司生产上只做一个分区p0就能够解决,这样就解决了分区内有序问题;但是性能下降了,鱼和熊掌,不可兼得。
- 针对上述情况是,kafka数据量小,扛不扛的住无所谓。
2、一些公司在sparkstreaming程序做一个排序,但是没必要,性能更加差了。
3、producer api(k,v)
kafka和zookeeper版本如下:
[root@hadoop001 kafka]# ll
total 64656
-rw-r--r-- 1 root root 31579147 May 24 2016 kafka_2.11-0.10.0.0.tgz
-rw-r--r-- 1 root root 34622929 Feb 22 2018 zookeeper-3.4.5-cdh5.12.0.tar.gz
部署zookeeper:
三台机器统一创建文件夹:
1、mkdir -p /opt/software
2、tar -xzvf /root/kafka/zookeeper-3.4.5-cdh5.12.0.tar.gz -C /opt/software/
3、进入到/opt/software目录后,cd conf目录,拷贝一份文件,cp zoo_sample.cfg zoo.cfg,编辑拷贝的这份zoo.cfg文件。
4、修改datadir目录:dataDir=/opt/software/zookeeper/data
5、再在zoo.cfg后面添加:
server.1=hadoop001:2888:3888
server.2=hadoop002:2888:3888
server.3=hadoop003:2888:3888
6、做一个软连接:
[root@hadoop001 software]# ln -s zookeeper-3.4.5-cdh5.12.0 zookeeper
[root@hadoop001 software]# pwd
/opt/software
7、zookeeper下创建data目录:
- mkdir data
8、另外两台机器Hadoop002、hadoop003都像上面这样做就行了。
9、启动zookeeper,进入到bin目录,./zkserver.sh start
10、查看状态,必然是两个follower,一个leader。
安装目录自己根据生产进行变通。
部署kafka:
-
进入到这个目录,进行编辑:
-
[root@hadoop001 config]# pwd
/root/kafka/kafka_2.11-0.10.0.0/config
[root@hadoop001 config]# vi server.properties
修改如下:
1、hadoop001机器上如下修改:
#The id of the broker. This must be set to a unique integer for each broker.
broker.id=0
host.name=hadoop001
port=9092
2、hadoop002机器上如下修改:
broker.id=1
host.name=hadoop002
port=9092
3、hadoop003机器上如下修改:
broker.id=2
host.name=hadoop003
port=9092
注意:broker.id要注意
1、cat kafka-server-start.sh,注意到下面有这么一句话:
- echo “USAGE: $0 [-daemon] server.properties [–override property=value]*”
shell脚本面试题目:$0的意思。
Kafka前台启动:
1、在hadoop001机器上进行前台启动,当前session关掉后,进程就会挂掉;三台机器依次前台启动:
命令:[root@hadoop001 bin]# ./kafka-server-start.sh …/config/server.properties
1、[2019-10-11 09:41:34,904] INFO [Kafka Server 0], started (kafka.server.KafkaServer)
2、[2019-10-11 09:41:34,904] INFO [Kafka Server 1], started (kafka.server.KafkaServer)
3、[2019-10-11 09:41:34,904] INFO [Kafka Server 2], started (kafka.server.KafkaServer)
这个id就是在这个目录下:/root/kafka/kafka_2.11-0.10.0.0/config,编辑这份文件: server.properties
到此时出现的问题:
1、 三台机器的kafka都okay了,我们的zookeeper并没有指定:
- 我们采用的是集群环境,每个kafka找的是本地的,zookeeper又是集群的;
2、标准的生产上是如何配置的:/root/kafka/kafka_2.11-0.10.0.0/config,3台机器每台机器上都编辑这份文件,添加最后一句: server.properties
# Zookeeper connection string (see zookeeper docs for details).
# This is a comma separated host:port pairs, each corresponding to a zk
# server. e.g. "127.0.0.1:3000,127.0.0.1:3001,127.0.0.1:3002".
# You can also append an optional chroot string to the urls to specify the
# root directory for all kafka znodes.
zookeeper.connect=hadoop001:2181,hadoop002:2181,hadoop003:2181/kafka
/kafka kafka在zk的目录
3、进入到./zkserver.sh,启动后使用ls /,我们发现它是一个零散的东西。
[zk: localhost:2181(CONNECTED) 1] ls /
[controller_epoch, brokers, zookeeper, admin, isr_change_notification, consumers, config]
上述都是kafka原生自带的文件夹,假如我们配置了,这些都在kafka里面。
正好是因为每个kafka的节点有zookeeper的进程,因此我们能够进行启动。
进入到zookeeper中后,出现:[zk: localhost:2181(CONNECTED) 0] ls /
[controller_epoch, brokers, zookeeper, kafka, admin, isr_change_notification, consumers, config],出现kafka,那么就意味着部署好了。
zookeeper中文件夹如何删除:
1、首先要进入zookeeper目录,cd /opt/software/zookeeper/bin,然后使用命令:./zkCli.sh,进入zookeeper目录。
2、然后ls /查看,
[zk: localhost:2181(CONNECTED) 0] ls /
[controller_epoch, brokers, zookeeper, kafka, admin, isr_change_notification, consumers, config]
3、删除brokers文件夹:
- [zk: localhost:2181(CONNECTED) 3] rmr /brokers
4、ls /kafka中有几个文件
- [zk: localhost:2181(CONNECTED) 5] ls /kafka
[controller_epoch, controller, brokers, admin, isr_change_notification, consumers, config]
5、退出zookeeper,使用quit
第三章:kafka测试
官网quickstart:
./kafka-topics.sh \
--create \
--zookeeper hadoop001:2181,hadoop002:2181,hadoop003:2181/kafka \
--partitions 3 \
--replication-factor 3 \
--topic ruozedatag6
- 我们创建一个topic叫ruozedatag6,分区和节点数保持一致。
- 分区副本思想主要来自hdfs block块的思想。