Kafka环境搭建

来源:互联网 发布:广州房产成交数据 编辑:程序博客网 时间:2024/06/06 19:09

Kafka介绍

概念:
1. 分布式流计算平台
2. 类似于消息系统发布订阅消息平台
3. 以分布式、副本集群方式存储数据流
4. 实时处理数据流
5. 构建实时数据流管道,水平可伸缩,容错,速度快

特点:
1. 巨量数据,TB级
2. 高吞吐量,支持每秒百万消息
3. 分布式,支持在多个server之间进行消息分区
4. 多客户端支持,和多语言进行协同。

kafka搭建

  1. jdk1.6+
  2. 安装scala
  3. 下载kafka
  4. 解压

启动kafka
1. 启动zk,bin/zookeeper-server-start.sh config/zookeeper.properties
2. 启动kafka,执行 bin/kafka-server-start.sh config/server.properties
3. 创建topic,创建一个分区,一个副本的主题

   bin/kafka-topics.sh --create --zookeeper localhost:2181 --replication-factor 1 --partitions 1 --topic test   #查看主题   ./kafka-topics.sh --list --zookeeper localhost:2181

4. 发送消息
bin/kafka-console-producer.sh –broker-list localhost:9092 –topic test

Kafka的核心部分
1. 消息缓存与FileSystem的存储,数据被即刻写入os内核页,并缓存以及清理磁盘(可以配置)
2. 消息被消费后,kafka长时间驻留消息,如有必要,可以实现重复消费。
3. 对分组消息使用消息set,设置网络过载。
4. 使用消费者保持着消息元数据。
5. 消费者状态默认存在zk中,也可以存在于其他OLTP中。
6. kafka中的生产生产和消费是pull-push模式。
7. kafka没有主从模式,所有broker地位相同。broker数据均在zk中维护,并在producer和consumer之间共享。
8. kafka的LB(load balance)策略运行producer动态发现broker。
9. producer维护了broker的连接池,并能够通过zk的warcher call机制实时进行更新。
10. producer可以选择同步或者异步的方式向broker发送消息。

kafka消息压缩
1. proceduer压缩消息(GZIP + snappy),consumer解压缩。
2. 压缩的消息的没有深度限制。
3. 在message的header中有一个compress type。

kafka的副本机制
每个分区有n个副本,可以承受n-1节点故障。每个副本都有自己的leader,其余的就是flower。zk中存放分区的leader和all replica的信息。每个副本存储消息的部分数据在本地的log和offset中,周期性同步到disk,确保消息写入全部副本或者其中一个。leader故障时,消息或者写入本地log,或者在producer在收到ack消息前,resent msg给new leader。
kafka支持的副本模型:
1. 同步复制,procudure从zk中找leader,并发送message,消息立即写入本地log,而且follow开pull消息,每个follow将消息写各自的本地log,向leader发送确认回执,leader在收到所有的follow确认。回执和本地副本的写入工作均完成后,再向producer发送确认回执。
2. 异步复制
leader的本地log写入完成即向producer发送确认回执。

kafka集群

1、zookeeper集群搭建

对zookeeper-3.4.5.tar.gz进行解压缩:tar -zxvf zookeeper-3.4.5.tar.gz。
对zookeeper目录进行重命名:mv zookeeper-3.4.5 zk

配置zookeeper相关的环境变量

vi ~/.bashrcexport ZOOKEEPER_HOME=/usr/local/zkexport PATH=$ZOOKEEPER_HOME/binsource ~/.bashrccd zk/confcp zoo_sample.cfg zoo.cfgvi zoo.cfg修改:dataDir=/usr/local/zk/data新增:server.0=eshop-cache01:2888:3888    server.1=eshop-cache02:2888:3888server.2=eshop-cache03:2888:3888cd zkmkdir datacd datavi myid0

在另外两个节点上按照上述步骤配置ZooKeeper,使用scp将zk和.bashrc拷贝到eshop-cache02和eshop-cache03上即可。唯一的区别是标识号分别设置为1和2。

分别在三台机器上执行:zkServer.sh start。
检查ZooKeeper状态:zkServer.sh status,应该是一个leader,两个follower
jps:检查三个节点是否都有QuromPeerMain进程

2、kafka集群搭建

scala-2.11.4.tgz使用WinSCP拷贝到/usr/local目录下。
对scala-2.11.4.tgz进行解压缩:tar -zxvf scala-2.11.4.tgz。
对scala目录进行重命名:mv scala-2.11.4 scala

配置scala相关的环境变量
vi ~/.bashrc
export SCALA_HOME=/usr/local/scala
export PATH=$SCALA_HOME/bin
source ~/.bashrc

查看scala是否安装成功:scala -version

按照上述步骤在其他机器上都安装好scala。使用scp将scala和.bashrc拷贝到另外两台机器上即可。

将kafka_2.9.2-0.8.1.tgz使用WinSCP拷贝到/usr/local目录下。
对kafka_2.9.2-0.8.1.tgz进行解压缩:tar -zxvf kafka_2.9.2-0.8.1.tgz。
对kafka目录进行改名:mv kafka_2.9.2-0.8.1 kafka

配置kafka
vi /usr/local/kafka/config/server.properties
broker.id:依次增长的整数,0、1、2,集群中Broker的唯一id
zookeeper.connect=192.168.40.10:2181,192.168.40.11:2181,192.168.40.12:2181

安装slf4j
1. slf4j-1.7.6.zip上传到/usr/local目录下
2. unzip slf4j-1.7.6.zip
3.把slf4j中的slf4j-nop-1.7.6.jar复制到kafka的libs目录下面

解决kafka Unrecognized VM option ‘UseCompressedOops’问题

vi /usr/local/kafka/bin/kafka-run-class.sh if [ -z "$KAFKA_JVM_PERFORMANCE_OPTS" ]; then  KAFKA_JVM_PERFORMANCE_OPTS="-server  -XX:+UseCompressedOops -XX:+UseParNewGC -XX:+UseConcMarkSweepGC -XX:+CMSClassUnloadingEnabled -XX:+CMSScavengeBeforeRemark -XX:+DisableExplicitGC -Djava.awt.headless=true"fi

去掉-XX:+UseCompressedOops即可

按照上述步骤在另外两台机器分别安装kafka。用scp把kafka拷贝到其他机器即可。
唯一区别的,就是server.properties中的broker.id,要设置为1和2。
在三台机器上的kafka目录下,分别执行以下命令:nohup bin/kafka-server-start.sh config/server.properties &
使用jps检查启动是否成功,使用基本命令检查kafka是否搭建成功

bin/kafka-topics.sh --zookeeper 192.168.40.10:2181,192.168.40.11:2181,192.168.40.12:2181 --topic test --replication-factor 1 --partitions 1 --createbin/kafka-console-producer.sh --broker-list 192.168.40.10:2181,192.168.40.11:2181,192.168.40.12:2181 --topic testbin/kafka-console-consumer.sh --zookeeper 192.168.40.10:2181,192.168.40.11:2181,192.168.40.12:2181 --topic test --from-beginning

Kafka基础API

/** * Kafka消费者 */public class KafkaConsumer implements Runnable{    private ConsumerConnector connector;    private String topic;    public KafkaConsumer(String topic) {        this.connector = Consumer.createJavaConsumerConnector(createConsumerConfig());        this.topic = topic;    }    @Override    public void run() {        Map<String,Integer> topicCountMap = new HashMap<String,Integer>();        topicCountMap.put(topic,1);        Map<String,List<KafkaStream<byte[],byte[]>>> consumerMap = connector.createMessageStreams(topicCountMap);        List<KafkaStream<byte[], byte[]>> steams = consumerMap.get(topic);        for (KafkaStream kafkaStream : steams) {            new Thread(new KafkaMessageProcessor(kafkaStream)).start();        }    }    /**     * 创建 kafka consumer config     * @return     */    private static ConsumerConfig createConsumerConfig(){        Properties properties = new Properties();        properties.put("zookeeper.connect", "192.168.40.10:2181,192.168.40.11:2181,192.168.40.12:2181");        properties.put("group.id", "eshop-group");        properties.put("zookeeper.session.timeout.ms", "400");        properties.put("zookeeper.sync.time.ms", "200");        properties.put("auto.commit.interval.ms", "1000");        return new ConsumerConfig(properties);    }}/** * kafka消息处理线程 */public class KafkaMessageProcessor implements Runnable {    private KafkaStream kafkaStream;    public KafkaMessageProcessor(KafkaStream kafkaStream) {        this.kafkaStream = kafkaStream;    }    @Override    public void run() {        ConsumerIterator<byte[],byte[]> it = kafkaStream.iterator();        while(it.hasNext()){            String message = new String(it.next().message());        }    }}/** * 系统初始化监听器  */public class InitListener implements ServletContextListener{    @Override    public void contextInitialized(ServletContextEvent sce) {        new Thread(new KafkaConsumer("eshop-cache")).start();    }    @Override    public void contextDestroyed(ServletContextEvent sce) {    }}
阅读全文
'); })();
0 0
原创粉丝点击
热门IT博客
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 河北安平 安广 安庆 安庆e网 安庆桐城 安庆e 安庆怀宁 安庆师范 安庆潜山 安庆崛起 安庆望江 安庆岳西 安庆崛起吧 合肥安庆 安庆市 安庆论坛 安徽安庆 安庆e网生活 安庆合肥 合肥到安庆 安庆旅游 安庆招聘 安庆哪个省 安庆到合肥 安庆招聘网 安庆邮编 安庆房价 安庆论坛网 安庆先锋网 安庆高铁 安庆景点 安庆人事网 安庆特产 安庆先锋 安庆网 安庆绪 安庆七街 安庆一中 安庆人才网 安庆在哪里 安庆二手房