Kafka 笔记

 

配置环境变量KAFKA_HOME       和   path     






想创三个副本的topic上面还需要开启一个服务server-3


核心部分:第一条后面是:并缓存以及清理到磁盘

第九条:并能够通过zk的watcher callback机制实时进行更新




每台上的broker.id不同即可,上面zk的连接用逗号分隔

。。。三台


重新指派副本:









还是之前的,加了条属性,运行发现分区未奏效,多了个空格。。。

上面分区不推荐使用了:


发送的回执:


----------------------------------------------------------------------------------------------------------------------------------------------------------




从头开始消费--from-beginning:


不好使啊,还不如进入zk直接把offset偏移量的值改掉:


flume整合kafka:














在开启kafka-console-consumer    再开启net cat  发送消息

----------------------------------------------------------------------------------------------------------------------------------------------------------

5.3 Kafka集群部署

5.3.1、下载安装包

http://kafka.apache.org/downloads.html

kafka_2.10-0.10.0.1.tgz

5.3.2、解压安装包并配置环境变量

>tar-zxvf kafka_2.10-0.10.0.1.tgz

[/etc/environmetn]

KAFKA_HOME=...

Path="...:$KAFKA_HOME/bin"

 

使用Kafka

1.     启动服务器

a)    启动zk

$>bin/zookeeper-server-start.shconfig/zookeeper.properties &

b)启动kafka服务器

       $>bin/kafka-server-start.shconfig/server.properties &

2.     创建topic

a)创建主题

       #创建一个分区,一个副本的主题

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

       $>zkCli.sh-server localhost:2181         //通过zk客户端命令观察zk的数据结构

b)列出主题

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

3.     发送消息

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

              helloworld

              howare you

4.     创建消费者

$>bin/kafka-console-consumer.sh--bootstrap-server localhost:9092 --topic test --from-beginning --zookeeperlocalhost:2181

 

搭建多broker的kafka集群
5.3.3、修改配置文件(创建多个server配置文件)

cp  /export/servers/kafka/config/server.properties

/export/servers/kafka/config/server.properties.bak

vi  /export/servers/kafka/config/server.properties

输入以下内容:

5.3.4、分发安装包

scp-r /export/servers/kafka_2.11-0.8.2.2 kafka02:/export/servers

然后分别在各机器上创建软连

cd/export/servers/

ln-s kafka_2.11-0.8.2.2 kafka

5.3.5、再次修改配置文件(重要)

依次修改各服务器上配置文件的的broker.id,分别是0,1,2不得重复。

5.3.6、启动集群

依次在各节点上启动kafka

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

 

5.4、Kafka常用操作命令

l  查看当前服务器中的所有topic

bin/kafka-topics.sh --list --zookeeper  zk01:2181

l  创建topic

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

l  删除topic

sh bin/kafka-topics.sh --delete --zookeeperzk01:2181 --topic test

需要server.properties中设置delete.topic.enable=true否则只是标记删除或者直接重启。

l  通过shell命令发送消息

kafka-console-producer.sh --broker-list kafka01:9092--topic itheima

l  通过shell消费消息

sh bin/kafka-console-consumer.sh --zookeeperzk01:2181 --from-beginning --topic test1

l  查看消费位置

sh kafka-run-class.shkafka.tools.ConsumerOffsetChecker --zookeeper zk01:2181 --group testGroup

l  查看某个Topic的详情

sh kafka-topics.sh --topic test --describe--zookeeper zk01:2181

 

6、Kafka生产者JavaAPI

7、Kafka消费者JavaAPI

 


--------------------------------------------------------------------------------------------

三、设计原理
kafka 的设计初衷是希望作为一个统一的信息收集平台,能够实时
的收集反馈信息,并需要能够支撑较大的数据量,且具备良好的容错
能力。
1、持久性
kafka 使用文件存储消息,这就直接决定kafka 在性能上严重依赖
文件系统的本身特性。且无论任何OS 下,对文件系统本身的优化几乎
没有可能。文件缓存/直接内存映射等是常用的手段。因为kafka 是
对日志文件进行append 操作,因此磁盘检索的开支是较小的;同时为
了减少磁盘写入的次数,broker 会将消息暂时buffer 起来,当消息的
个数(或尺寸)达到一定阀值时,再flush 到磁盘,这样减少了磁盘IO
调用的次数。
2、性能
需要考虑的影响性能点很多,除磁盘IO 之外,我们还需要考虑网
络IO,这直接关系到kafka 的吞吐量问题。kafka 并没有提供太多高
超的技巧;对于producer 端,可以将消息buffer 起来,当消息的条数
达到一定阀值时,批量发送给broker;对于consumer 端也是一样,批
量fetch 多条消息。不过消息量的大小可以通过配置文件来指定。对
于kafka broker 端,似乎有个sendfile 系统调用可以潜在的提升网
络IO 的性能:将文件的数据映射到系统内存中,socket 直接读取相应
的内存区域即可, 而无需进程再次copy 和交换。其实对于
producer/consumer/broker 三者而言,CPU 的开支应该都不大,因此
启用消息压缩机制是一个良好的策略;压缩需要消耗少量的CPU 资源,
不过对于kafka 而言,网络IO 更应该需要考虑。可以将任何在网络上
传输的消息都经过压缩。kafka 支持gzip/snappy 等多种压缩方式。
3、生产者
负载均衡: producer 将会和Topic 下所有partition leader 保
持socket 连接;消息由producer 直接通过socket 发送到broker,中
间不会经过任何"路由层"。事实上,消息被路由到哪个partition 上,
由producer 客户端决定。比如可以采用"random""key-hash""轮询"
等,如果一个topic 中有多个partitions,那么在producer 端实现"
消息均衡分发"是必要的。
其中partition leader 的位置(host:port)注册在zookeeper
中,producer 作为zookeeper 的client,已经注册了watch 用来监听
partition leader 的变更事件。
异步发送:将多条消息暂且在客户端buffer 起来,并将他们批量
的发送到broker,小数据IO 太多,会拖慢整体的网络延迟,批量延
迟发送事实上提升了网络效率。不过这也有一定的隐患,比如说当
producer 失效时,那些尚未发送的消息将会丢失。
利用Java 进行编程,需要引入相关jar 包,具体如下:
<dependency>
<groupId>org.apache.kafka</groupId>
<artifactId>kafka_2.9.2</artifactId>
<version>0.8.1.1</version>
<scope>compile</scope>
<exclusions>
<exclusion>
<artifactId>jmxri</artifactId>
<groupId>com.sun.jmx</groupId>
</exclusion>
<exclusion>
<artifactId>jms</artifactId>
<groupId>javax.jms</groupId>
</exclusion>
<exclusion>
<artifactId>jmxtools</artifactId>
<groupId>com.sun.jdmk</groupId>
</exclusion>
</exclusions>
</dependency>
如下是一个Java 例子:
import java.util.*;
import kafka.javaapi.producer.Producer;
import kafka.producer.KeyedMessage;
import kafka.producer.ProducerConfig;
public class TestProducer {
public static void main(String[] args) {
long events = 100l;
Random rnd = new Random();
/**生产者相关配置文件项**/
Properties props = new Properties();
props.put("metadata.broker.list", "broker1:9092,broker2:9092 ");
props.put("serializer.class", "kafka.serializer.StringEncoder");
props.put("partitioner.class",
"com.gds.kafa.kafa.partitioner.SimplePartitioner");
props.put("request.required.acks", "1");
//创建生产者配置
ProducerConfig config = new ProducerConfig(props);
//创建生产者
Producer<String, String> producer = new Producer<String, String>(config);
for (long nEvents = 0; nEvents < events; nEvents++) {
long runtime = new Date().getTime();
String ip = "192.168.2." + rnd.nextInt(255);
String msg = runtime + ",www.example.com," + ip;
KeyedMessage<String, String> data = new KeyedMessage<String,
String>("page_visits", ip, msg);
producer.send(data);
}
producer.close();
}
}
package com.gds.kafa.kafa.partitioner;
import kafka.producer.Partitioner;
import kafka.utils.VerifiableProperties;
public class SimplePartitioner implements Partitioner {
public SimplePartitioner (VerifiableProperties props) {
}
/**
* 确定生产者向broker的topic的那个partition中插入数据
*/
public int partition(Object key, int a_numPartitions) {
int partition = 0;
String stringKey = (String) key;
int offset = stringKey.lastIndexOf('.');
if (offset > 0) {
partition = Integer.parseInt( stringKey.substring(offset+1)) %
a_numPartitions;
}
return partition;
}
}
4、消费者
consumer 端向broker 发送"fetch"请求,并告知其获取消息的
offset;此后consumer 将会获得一定条数的消息;consumer 端也可以
重置offset 来重新消费消息。
在kafka 中,producers 将消息推送给broker 端,consumer 在和
broker 建立连接之后,主动去pull(或者说fetch)消息;这中模式有
些优点,首先consumer 端可以根据自己的消费能力适时的去fetch 消
息并处理,且可以控制消息消费的进度(offset);此外,消费者可以良
好的控制消息消费的数量,batch fetch。
在kafka 中,partition 中的消息只有一个consumer 在消费,且
不存在消息状态的控制,也没有复杂的消息确认机制,可见kafka
broker 端是相当轻量级的。当消息被consumer 接收之后,consumer
可以在本地保存最后消息的offset,并间歇性的向zookeeper 注册
offset。由此可见,consumer 客户端也很轻量级。
Kafka 提供了两套API 给Consumer:

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值