kafka第一天

问题场景

kafka:MessageQueue:消息系统

topic:主题

分区的好处:并行查询

kafka集群 broker(代理。经纪人)

数据:message 

生产者 消费者== 代码

生产者可以向不同的topic发送数据,消费者可以从不同的topic中获取需要的数据

kafka核心概念:topic partition broker


kafka简介:公司 linkedin 开源 分布式的消息系统

支持多种语言进行开发(c++ java python scala)

scala是一门语言:既能面向对象(其实面向对象调用的过程就是面向过程),又能面向函数。

              wordcount的例子

java和Scala:

              jdk1.8 Lamda表达式:函数式编程

              java有非常成熟的产品:Hadoop hbase hive 成熟的三大框架:SSM SSH

              由于java是一门有成熟产品的语言,目前来说还是难以代替的。

              kafka是用java写的,spark大部分的核心代码是用Scala,一部分使用java写的,flink使用Scala写的。

Python:Python可以做的事情:企业级开发 ,网络爬虫(封装好了进行网络爬虫的工具),数据分析(机器学习的开发。深度学习的开发),运维

        大数据的工具对Python非常的友好,几乎所有的工具都支持Python。Python缺点:Python2->Python3 可能会不兼容。

        大数据首先要考虑数据的来源:

                 1)通过网络爬虫爬到(Python)

                 2)用Hadoop存储 

                 3)用hive、hbase分析

        面向对象+面向函数


Scala的作者是JVM的作者之一。所以Scala也运行在JVM之上,java和Scala的代码可以互相调用。

spark:java Scala


kafka第一天_第1张图片
消息系统存储数据

消息系统(不一定是kafka)的好处:1)解耦合 2)扩展性 3)可恢复性(处理数据的节点宕机不会造成数据的丢失)4)提高峰值的处理能力

kafka第一天_第2张图片
提高峰值处理能力

消息队列的分类

一对多:这种模式叫订阅模式(public-subscribe)。

一对一:点对点的模式(point-to-point)。

两种模式的特点:

点对点模式:如果一个人消费了数据,其他人就消费不了了。

订阅模式:一组中只能一个人消费数据,但可以多个组消费。

kafka用的是订阅模式。

数据的处理方式:push(推) pull(拉)

pull:按需取数据,所以kafka设计的时候,用的是pull

push:微信群聊场景,信息都是推过来的,我们打开聊天界面就可以直接看到之前的聊天所有记录。


kafka的核心概念

producer:消息的生产者

consumer:消息的消费者

broker:代理,kafka集群当中的一台服务器。

topic:主题,类似于关系型数据库里面的一张表

partition:提升读写性能,解决磁盘瓶颈问题 

kafka第一天_第3张图片
partition存储数据

message:消息(数据),通信最基本单位。


kafka集群的架构

kafka第一天_第4张图片
kafka集群架构:成员和消息推拉过程

zookeeper:协调作用 保存了kafka的元数据信息

读数据的时候必须有zookeeper的地址。

每个kafka里面都有全量的元数据信息。


搭建集群

集群规划

两个角色:kafka和zookeeper

                                       kafka          zookeeper                

Hadoop02                      √                    √

Hadoop03                     √                    √

Hadoop04                     √                    √

centos版本:6.7

Step 1: 下载软件包:版本:8.2.2

官网:https://www.apache.org/dyn/closer.cgi?path=/kafka/0.8.2.2/kafka_2.11-0.10.2.1.tgz

Step2:解压到apps

step3:修改配置文件/kafka/config

配置文件:server.properties  producer.properties  consumer.properties

1)server.properties

broker.id=1

host.name=hadoop02

port=9092

log.dirs=/home/hadoop/log/kflog

num.partitions=1

zookeeper.connect=hadoop02:2181,hadoop03:2181,hadoop04:2181

2)producer.properties

bootstrap.servers=hadoop02:9092,hadoop03:9092,hadoop04:9092

compression.codec=none(压缩类的指定)

serializer.class=kafka.serializer.DefaultEncoder

3)consumer.properties

zookeeper.connect=hadoop02:2181,hadoop03:2181,hadoop04:2181

一些参数的说明

1)端口号和主机名

broker的端口号:port=9092

host.name

2)指定存储路径在hdfs上:

log.dirs

3)默认分区partition

4)数据生命周期:默认168小时(即一周),可以修改

5)zookeeper的依赖集群

zookeeper.connect=hadoop02:2181,hadoop03:2181,hadoop04:2181

step4:发送安装包到Hadoop03,Hadoop04

for i in hadoop04 hadoop03

do scp -r kafka_2.11-0.8.2.2/ hadoop@$i:$PWD

done

需要修改 broker.id 和 host.name

配置环境变量.bashrc

Step 4: Start the server

Kafka uses ZooKeeper so you need to first start a ZooKeeper server if you don't already have one. You can use the convenience script packaged with kafka to get a quick-and-dirty single-node ZooKeeper instance.

首先选择使用自己安装的zookeeper,如果没有,可以使用软件自带。

软件自带的zookeeper的启动命令:

>bin/zookeeper-server-start.sh config/zookeeper.properties

Now start the Kafka server:

>bin/kafka-server-start.sh config/server.properties(参数文件)

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

Step 5: Create a topic

Let's create a topic named "test" with a single partition and only one replica:

> bin/kafka-topics.sh --create --zookeeper hadoop02:2181 --replication-factor 1 --partitions 1 --topic test

解读:五个参数 create zookeeper replication-factor partitions topic

We can now see that topic if we run the list topic command:列出主题

>bin/kafka-topics.sh --list --zookeeper hadoop02:2181

--delete     Delete a topic

Alternatively, instead of manually creating topics you can also configure your brokers to auto-create topics when a non-existent topic is published to.

Step : Send some messages 模拟生产者

Kafka comes with a command line client that will take input from a file or from standard input and send it out as messages to the Kafka cluster. By default each line will be sent as a separate message.

Run the producer and then type a few messages into the console to send to the server.

>bin/kafka-console-producer.sh --broker-list localhost:9092 --topic test2

This is a message

This is another message

Step : Start a consumer 模拟消费者

Kafka also has a command line consumer that will dump out messages to standard output.

>bin/kafka-console-consumer.sh --zookeeper localhost:2181 --topic test2 --from-beginning


分区副本

主分区 数据进行读写都是针对主分区,备份分区时时刻刻与主分区同步数据

主分区压力很大,为了负载均衡,有以下设计


kafka第一天_第5张图片
主分区和备份分区

kafka的设计:kafka是架构在文件系统(磁盘)之上的。

要保证高性能(因为kafka是与storm ,sparkStreaming这些实时流打交道)

kafka写数据与HBase类似,都是顺序写进去;读数据也是顺序读出来。

kafka架构在磁盘上的优点:

1)没有容量的限制(磁盘便宜)  扩大容量的方式:横向扩展:加机器;垂直扩展:加大硬盘

2)顺序访问数据的,性能上没有多大影响

内存缺点:1)容易达到瓶颈 2)kafka重启 ,需要花的时间较多


kafka的javaAPI 

producer consumer kafkaproperties

producer.java 的作用:run方法发送数据

consumer.java extends Thread作用:run方法消费数据

首先构造器初始化一个连接器,properties里面put属性名和值

kafkaStream   key代表偏移位置,value代表数据

写数据不需要zookeeper,但消费数据需要zookeeper的地址


低端的API,偏移量是由自己来维护的,每消费一次数据,就更新一次偏移量。

保存上一次消费的偏移量:auto.commit.interval.ms ==1000 表示每1秒记录一次偏移量,由zookeeper记录的。

你可能感兴趣的:(kafka第一天)