(一)Apache Kafka安装

1、安装环境与前提条件

  安装环境:Ubuntu16.04

  前提条件:

  • ubuntu系统下安装好jdk 1.8以上版本,正确配置环境变量
  • ubuntu系统下安装好scala 2.11版本
  • 安装ZooKeeper(注:kafka自带一个Zookeeper服务,如果不单独安装,也可以使用自带的ZK)

2、安装步骤

  Apache基金会开源的这些软件基本上安装都比较方便,只需要下载、解压、配置环境变量三步即可完成,kafka也一样,官网选择对应版本下载后直接解压到一个安装目录下就可以使用了,如果为了方便可以在~/.bashrc里配置一下环境变量,这样使用的时候就不需要每次都切换到安装目录了。

3、测试

  接下来可以通过简单的console窗口来测试kafka是否安装正确。

  (1)首先启动ZooKeeper服务

  如果启动自己安装的ZooKeeper,使用命令zkServer.sh start即可。

  如果使用kafka自带的ZK服务,启动命令如下(启动之后shell不会返回,后续其他命令需要另开一个Terminal):

$ cd /opt/tools/kafka #进入安装目录
$ bin/zookeeper-server-start.sh config/zookeeper.properties

  (2)第二步启动kafka服务

  启动Kafka服务的命令如下所示:

$ cd /opt/tools/kafka #进入安装目录
$ bin/kafka-server-start.sh config/server.properties

  (3)第三步创建一个topic,假设为“test”

  创建topic的命令如下所示,其参数也都比较好理解,依次指定了依赖的ZooKeeper,副本数量,分区数量,topic的名字:

$ cd /opt/tools/kafka #进入安装目录
$ bin/kafka-topics.sh --create --zookeeper localhost:2181 --replication-factor 1 --partitions 1 --topic test1

  创建完成后,可以通过如下所示的命令查看topic列表:

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

  (4)开启Producer和Consumer服务

  kafka提供了生产者和消费者对应的console窗口程序,可以先通过这两个console程序来进行验证。

  首先启动Producer:

$ cd /opt/tools/kafka #进入安装目录
$ bin/kafka-console-producer.sh --broker-list localhost:9092 --topic test

  然后启动Consumer:

$ cd /opt/tools/kafka #进入安装目录
$ bin/kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic test --from-beginning

  在打开生产者服务的终端输入一些数据,回车后,在打开消费者服务的终端能看到生产者终端输入的数据,则说明kafka安装成功。


(二)Apache Kafka简单示例

  安装好Kafka之后,本节我们通过一些实例来使用kafka,了解其基本的API和使用方法。

1、验证同一个消费组的两个消费者不会同时消费一个partition

  我们通过一个简单的例子来验证同一个消费组的两个消费者不会同时消费一个partition中的数据,首先,启动一个生产者服务,对应的topic只有一个分区,然后创建4个消费者,其中两个属于同一组,另外两个属于另一组,即可验证则原理,验证情况如下图所示:

2、Kafka的Java API

  通过以下程序给出一个kafka的java简单示例:

package com.kafka.sgz;

import java.util.Properties;

import org.apache.kafka.clients.producer.KafkaProducer;
import org.apache.kafka.clients.producer.Producer;
import org.apache.kafka.clients.producer.ProducerRecord; /**生产者示例*/
public class KafkaProducerTest {
private static Producer<String, String> producer;
public final static String TOPIC="test1";
public KafkaProducerTest(){
Properties props=new Properties();
props.put("bootstrap.servers","localhost:9092");
props.put("acks","all");
props.put("retries",0);
props.put("batch.size",16384);
props.put("linger.ms",1);
props.put("buffer.memory",33554432);
props.put("key.serializer","org.apache.kafka.common.serialization.StringSerializer");
props.put("value.serializer","org.apache.kafka.common.serialization.StringSerializer"); producer = new KafkaProducer<String,String>(props);
} public void produce(){
int messageNum=100;
final int count=120;
while(messageNum<count){
String key=String.valueOf(messageNum);
String data="@@@@hello kafka message"+key;
producer.send(new ProducerRecord<String,String>(TOPIC,key,data));
System.out.println(data);
messageNum++;
}
producer.close(); //注意发送完数据要关闭,否则可能出错
}
public static void main(String[] args){
new KafkaProducerTest().produce();
}
}
package com.kafka.sgz;

import java.util.Arrays;
import java.util.Properties; import org.apache.kafka.clients.consumer.Consumer;
import org.apache.kafka.clients.consumer.ConsumerRecord;
import org.apache.kafka.clients.consumer.ConsumerRecords;
import org.apache.kafka.clients.consumer.KafkaConsumer; public class KafkaConsumerTest { private static Consumer<String,String> consumer;
public final static String TOPIC="test1"; public KafkaConsumerTest(){
Properties props=new Properties();
props.put("bootstrap.servers","localhost:9092");
props.put("group.id","test-consumer-group"); //组号 props.put("enable.auto.commit","true"); //如果value合法,将自动提交偏移量
props.put("auto.commit.interval.ms","1000"); //设置多久更新一次被消费信息的偏移量
props.put("session.timeout.ms","30000"); //设置会话响应时间,超过可以放弃消费或者直接消费下一条
props.put("auto.offset.reset","earliest"); //自动重置Offset
props.put("key.deserializer","org.apache.kafka.common.serialization.StringDeserializer");
props.put("value.deserializer","org.apache.kafka.common.serialization.StringDeserializer");
consumer=new KafkaConsumer<String,String>(props);
} public void consume(){
consumer.subscribe(Arrays.asList(TOPIC));
while(true){
ConsumerRecords<String,String> records=consumer.poll(100);
for(ConsumerRecord<String,String> record:records){
System.out.println("get message:"+record.key()+"---"+record.value());
}
}
} public static void main(String[] args){
new KafkaConsumerTest().consume();
}
}

3、Kafka的python API

  通过以下程序给出一个kafka的python简单示例:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
from kafka import KafkaProducer
from kafka import KafkaConsumer
from kafka.errors import KafkaError
import json class Kafka_producer():
'''
使用kafka的生产模块
'''
def __init__(self, kafkahost,kafkaport, kafkatopic):
self.kafkaHost = kafkahost
self.kafkaPort = kafkaport
self.kafkatopic = kafkatopic
self.producer = KafkaProducer(bootstrap_servers = '{kafka_host}:{kafka_port}'.format(
kafka_host=self.kafkaHost,
kafka_port=self.kafkaPort
)) def sendjsondata(self, params):
try:
parmas_message = json.dumps(params)
producer = self.producer
producer.send(self.kafkatopic, parmas_message.encode('utf-8'))
producer.flush()
except KafkaError as e:
print e class Kafka_consumer():
'''
使用Kafka—python的消费模块
'''
def __init__(self, kafkahost, kafkaport, kafkatopic, groupid):
self.kafkaHost = kafkahost
self.kafkaPort = kafkaport
self.kafkatopic = kafkatopic
self.groupid = groupid
self.consumer = KafkaConsumer(self.kafkatopic, group_id = self.groupid,
bootstrap_servers = '{kafka_host}:{kafka_port}'.format(
kafka_host=self.kafkaHost,
kafka_port=self.kafkaPort )) def consume_data(self):
try:
for message in self.consumer:
# print json.loads(message.value)
yield message
except KeyboardInterrupt, e:
print e def main():
'''
测试consumer和producer
:return:
'''
# 测试生产模块
producer = Kafka_producer("127.0.0.1", 9092, "ranktest")
for id in range(10):
params = '{abetst}:{null}---'+str(i)
producer.sendjsondata(params)
##测试消费模块
#消费模块的返回格式为ConsumerRecord(topic=u'ranktest', partition=0, offset=202, timestamp=None,
#\timestamp_type=None, key=None, value='"{abetst}:{null}---0"', checksum=-1868164195,
#\serialized_key_size=-1, serialized_value_size=21)
consumer = Kafka_consumer('127.0.0.1', 9092, "ranktest", 'test-python-ranktest')
message = consumer.consume_data()
for i in message:
print i.value if __name__ == '__main__':
main()

总结

  本文从实践的角度介绍了kafka的安装和相关API的使用,结合上一篇文章的原理,可以对Kafka有一个比较基础的理解和认识。

【Apache Kafka】二、Kafka安装及简单示例的更多相关文章

  1. Redis 安装与简单示例

    Redis 安装与简单示例 一.Redis的安装 Redis下载地址如下:https://github.com/dmajkic/redis/downloads 解压后根据自己机器的实际情况选择32位或 ...

  2. 【Redis】三、Redis安装及简单示例

    (四)Redis安装及使用   Redis的安装比较简单,仍然和大多数的Apache开源软件一样,只需要下载,解压,配置环境变量即可.具体安装过程参考:菜鸟教程Redis安装.   安装完成后,通过r ...

  3. kafka集群安装及简单使用

    关于kafka是什么及原理,请参考kafka官方文档的介绍:http://kafka.apache.org/documentation/#introduction ,英文不好的同学可以看这里http: ...

  4. kafka可视化工具安装及简单使用

    一.安装 双击kafkatool_64bit.exe安装kafka可视化工具,并且C:\Windows\System32\drivers\etc配置HOSTS,打开HOSTS并添加: HOSTS添加: ...

  5. Redis 安装与简单示例 01_转

    一.Redis的安装 Redis下载地址如下:https://github.com/dmajkic/redis/downloads 解压后根据自己机器的实际情况选择32位或者64位.下载解压后图片如下 ...

  6. Redis 安装与简单示例 <第一篇>

    一.Redis的安装 Redis下载地址如下:https://github.com/dmajkic/redis/downloads 解压后根据自己机器的实际情况选择32位或者64位.下载解压后图片如下 ...

  7. Redis 安装与简单示例 <第一篇>【转】

    一.Redis的安装 Redis下载地址如下:https://github.com/dmajkic/redis/downloads 解压后根据自己机器的实际情况选择32位或者64位.下载解压后图片如下 ...

  8. Redis 安装与简单示例(转)

    本文转载自:http://www.cnblogs.com/kissdodog/p/3570984.html Redis的安装 Redis下载地址如下:https://github.com/dmajki ...

  9. maven 3.2.5 的安装及简单示例

    http://www.mvnrepository.com 一直没有使用maven,它的作用就不说了,这二天需要用到,发现网上都是以前的版本,所以,我一边配置,一边记录. 一 下载maven 现在很多I ...

随机推荐

  1. Xsolla带你走进印度移动游戏市场

    作为世界上人口第二大国的印度.随着移动时代的到来,越来越多的开发人员将目光瞄准了这个国家.今天Xsolla就带领大家一起来了解这样一个新兴的移动游戏市场. 印度移动市场潜力巨大 作为世界四大宗教和数字 ...

  2. JAVA学习(三):Java基础语法(变量、常量、数据类型、运算符与数据类型转换)

    Java基础语法(变量.常量.数据类型.运算符与数据类型转换) 1.变量 Java中.用户能够通过指定数据类型和标识符来声明变量.其基本的语法为: DataType identifier; 或 Dat ...

  3. Unity游戏小地图生成

    孙广东  2015.6.25 这个在AssetStore上有几个不错的插件, 除了知道原理,能自己实现还是好的. 非常多插件是不会直接使用的.而是要依据自己项目的需求进行改动或者就是自己写. 那么我们 ...

  4. 字节数组byte[]和整型,浮点型数据的转换——Java代码

    近期在写C++ socket和java socket之间的通信程序,涉及到整数浮点数的传输.须要从字节数组还原数据,查了一些资料.总结例如以下 1.       整数和浮点数的机器表示 在机器内部.不 ...

  5. c++ vector数组的定义使用

    /* *********************************************** Author :guanjun Created Time :2017/3/18 13:32:52 ...

  6. ubuntu多版本jdk安装及切换

    系统:ubuntu14.04 一.安装openjdk1.7 sudo apt-get install openjdk-7-jre openjdk-7-jdk 安装完成后找到其安装路径: dpkg -L ...

  7. spring web中的filter

    昨天看了会spring web中部分代码,主要是各种filter,回顾一下: Spring的web包中中有很多过滤器,这些过滤器位于org.springframework.web.filter并且理所 ...

  8. JSP-Runoob:JSP 页面重定向

    ylbtech-JSP-Runoob:JSP 页面重定向 1.返回顶部 1. JSP 页面重定向 当需要将文档移动到一个新的位置时,就需要使用JSP重定向了. 最简单的重定向方式就是使用respons ...

  9. 如何在vue项目中引入阿里巴巴的iconfont图库

    1. 打开 http://www.iconfont.cn/ 2. 选择我们喜欢的图标,点击上面的小车,加入图标库,即右侧的购物车 3.点击购物车,点击下载代码 4.解压下载的文件夹,将文件夹复制到 a ...

  10. 一、Linux文件权限与目录配置

    行文结构如下: 用户和用户组 Linux文件权限概念 Linux目录配置 重点回顾 1.用户与用户组 Linux是个多用户.多任务的系统,可能有多人同时使用这台机器进行工作,为了考虑每个人的隐私和工作 ...