Kafka集群对消息的保存是根据Topic进行归类的,由消息生产者(Producer)和消息消费者(Consumer)组成,另外,每一个Server称为一个Broker(经纪人)。对于Kafka集群而言,Producer和Consumer都依赖于ZooKeeper来保证数据的一致性。

  在每条消息输送到Kafka集群后,消息都会有一个Type,这个Type被称为一个Topic,不同的Topic的消息是分开存储的。每个Topic可以被分割为多个Partition,在每条消息中,它在文件中的位置称为Offset,用于标记唯一一条消息。在Kafka中,消息被消费后,消息仍然会被保留一定时间后在删除,比如在配置信息中,文件信息保留7天,那么7天后,不管Kafka中的消息是否被消费,都会被删除;以此来释放磁盘空间,减少磁盘的IO消耗。

  在Kafka中,一个Topic的多个分区,被分布在Kafka集群的多个Server上,每个Server负责分区中消息的读写操作。另外,Kafka还可以配置分区需要备份的个数,以便提高可用行。由于用到ZK来协调,每个分区都有一个Server为Leader状态,服务对外响应(如读写操作),若该Leader宕机,会由其他的Follower来选举出新的Leader来保证集群的高可用性。

一个Topic中的消息数据按照多个分区组织,分区是kafka消息队列组织的最小单位,一个分区可以看作是一个FIFO( First Input First Output)的队列。

kafka分区是提高kafka性能的关键所在,当你发现你的集群性能不高时,常用手段就是增加Topic的分区,分区里面的消息是按照从新到老的顺序进行组织,消费者从队列头订阅消息,生产者从队列尾添加消息。

编译报错:WARN Selector: Error in I/O with localhost/127.0.0.1

java.io.EOFException

错误:https://issues.apache.org/jira/browse/KAFKA-3205

环境准备:

1. Java JDK (jdk1.8.0_112 64-bit)

安装完成后添加系统变量:

JAVA_HOME= C:\Program Files\Java\jdk1.8.0_112

并在系统变量Path后添加 ;%JAVA_HOME%\bin;

2. Apache ZooKeeper

① 解压进入目录E:\Zookeeper\zookeeper-3.4.11\conf

② 将“zoo_sample.cfg”重命名为“zoo.cfg”

③ 打开“zoo.cfg”找到并编辑dataDir=E:\Zookeeper\zookeeper-3.4.11\data

④ 添加系统变量:ZOOKEEPER_HOME= E:\Zookeeper\zookeeper-3.4.11,并在系统变量Path后添加;%ZOOKEEPER_HOME%\bin;

⑤ 查看zoo.cfg文件clientPort默认值是否为2181

⑥ cmd中输入zkServer ,如下图则表示ZooKeeper启动成功(窗口不要关闭)

3. Apache Kafka(请选择Binary downloads)

① 压进入目录E:\kafka_2.12-1.0.0\config

② 打开server.properties并编辑log.dirs=E:\kafka_2.12-1.0.0\kafka-logs

③ 确认zookeeper.connect=localhost:2181

④ 进入目录E:\kafka_2.12-1.0.0\并Shift+右键,选择“打开命令窗口”,输入:

.\bin\windows\kafka-server-start.bat .\config\server.properties

如果是第二次启动,则需要进入目录删除文件夹kafka_2.12-1.0.0kafka-logs后重新运行命令。

代码测试(scala maven项目):

1. pom.xml

<dependency>

<groupId>org.apache.spark</groupId>

<artifactId>spark-core_2.10</artifactId>

<version>1.5.1</version>

</dependency>

<dependency>

<groupId>org.apache.kafka</groupId>

<artifactId>kafka-clients</artifactId>

<version>0.9.0.1</version>

</dependency>

说明:kafka-clients不要使用0.8.2.1版本,因为它的poll函数直接返回了null

另外在0.9.0版本之后,consumer api不再区分high-level和low-level了。

2. producer.scala

import java.io.{File, FileInputStream}

import java.util.Properties

import org.apache.kafka.clients.producer.{KafkaProducer, ProducerConfig, ProducerRecord}

import org.apache.spark.rdd.RDD

import org.apache.spark.{SparkConf, SparkContext}

object producer {

def main(args: Array[String]): Unit = {

val sparkConf = new SparkConf()

sparkConf.setAppName("kafka").setMaster("local[4]").set("SPARK_EXECUTOR_CORES","1")

val sc = new SparkContext(sparkConf)

val topic: RDD[String] = sc.textFile(s"F:/123456.txt")

val kafkaProducerCfg = "E:\\kafka_2.12-1.0.0\\config\\producer.properties"

val kafkaprop = new Properties()

kafkaprop.load(new FileInputStream(new File(kafkaProducerCfg)))

topic.repartition(1).foreachPartition((partisions: Iterator[String]) => {

val producer: KafkaProducer[String, String] = new KafkaProducer[String, String](kafkaprop)

var pr = new ProducerRecord[String, String]("my-topic","my-key", "hi laosiji ")

producer.send(pr)

pr = new ProducerRecord[String, String]("finally","kafka", "可用了 ")

producer.send(pr)

partisions.foreach((line: String) => {

try {

val pr = new ProducerRecord[String, String]("my-topic","my-key", line)

producer.send(pr)

} catch {

case ex: Exception => println(ex.getMessage, ex)

}

})

producer.close()

})

}

}

3. consumer.scala

import java.io.{File, FileInputStream}

import java.util.Properties

import scala.collection.JavaConverters._

import org.apache.kafka.clients.consumer.{ConsumerRecords, KafkaConsumer}

object consumer {

def main(args: Array[String]): Unit = {

val kafkaProducerCfg = "E:\\kafka_2.12-1.0.0\\config\\consumer.properties"

val is = new FileInputStream(new File(kafkaProducerCfg))

val kafkaprop = new Properties()

// kafkaprop.load(is)

is.close()

kafkaprop.put("key.deserializer", "org.apache.kafka.common.serialization.StringDeserializer")

kafkaprop.put("value.deserializer", "org.apache.kafka.common.serialization.StringDeserializer")

// kafkaprop.put("partition.assignment.strategy", "range")

kafkaprop.put("group.id", "test")

kafkaprop.put("enable.auto.commit", "true")

kafkaprop.put("auto.commit.interval.ms", "1000")

kafkaprop.put("session.timeout.ms", "6000")

kafkaprop.put("bootstrap.servers","localhost:9092")

try{

val consumer: KafkaConsumer[String,String] = new KafkaConsumer[String,String](kafkaprop)

consumer.subscribe(java.util.Arrays.asList("my-topic","finally"))

while (true) {

val records = consumer.poll(1000)

var it = records.records("my-topic").iterator()

while (it.hasNext){

println(it.next())

}

it = records.records("finally").iterator()

while (it.hasNext){

println(it.next())

}

}

consumer.close()

} catch {

case e => e.printStackTrace()

}

}

}

4. 先启动consumer,再启动producer,可以在控制台看到运行结果。

控制台测试:

1. 进入目录E:\kafka_2.12-1.0.0创建Topic

.\bin\windows\kafka-topics.bat --create --zookeeper localhost:2181 --replication-factor 1 --partitions 1 –topic HelloKafka

查看Topic:

.\bin\windows\kafka-topics.bat --list --zookeeper localhost:2181

2. 进入目录E:\kafka_2.12-1.0.0打开cmd创建生产者:

.\bin\windows\kafka-console-producer.bat --broker-list localhost:9092 --topic HelloKafka

3. 进入目录E:\kafka_2.12-1.0.0打开cmd创建消费者:

.\bin\windows\kafka-console-consumer.bat --bootstrap-server localhost:9092 --topic HelloKafka --from-beginning

让Kafka在scala里面跑起来的更多相关文章

  1. 启动kafka时报scala相关错误:java.lang.NoSuchMethodError: scala.Predef$.ArrowAssoc()

    1.报错现象: 启动kafka的时候启动失败,并且会报告下面的错误: java.lang.NoSuchMethodError: scala.Predef$.ArrowAssoc(Ljava/lang/ ...

  2. Spark集群 + Akka + Kafka + Scala 开发(1) : 配置开发环境

    目标 配置一个spark standalone集群 + akka + kafka + scala的开发环境. 创建一个基于spark的scala工程,并在spark standalone的集群环境中运 ...

  3. Spark集群 + Akka + Kafka + Scala 开发(4) : 开发一个Kafka + Spark的应用

    前言 在Spark集群 + Akka + Kafka + Scala 开发(1) : 配置开发环境中,我们已经部署好了一个Spark的开发环境. 在Spark集群 + Akka + Kafka + S ...

  4. 使用Scala开发Apache Kafka的TOP 20大好用实践

    本文作者是一位软件工程师,他对20位开发人员和数据科学家使用Apache Kafka的方式进行了最大限度得深入研究,最终将生产实践环节需要注意的问题总结为本文所列的20条建议. Apache Kafk ...

  5. Kafka 学习笔记之 Producer/Consumer (Scala)

    既然Kafka使用Scala写的,最近也在慢慢学习Scala的语法,虽然还比较生疏,但是还是想尝试下用Scala实现Producer和Consumer,并且用HashPartitioner实现消息根据 ...

  6. RocketMQ与Kafka对比(18项差异)

          转自:https://github.com/alibaba/RocketMQ/wiki/rmq_vs_kafka 淘宝内部的交易系统使用了淘宝自主研发的Notify消息中间件,使用Mysq ...

  7. RocketMQ与Kafka对比(18项差异)评价版

    此文是rocketmq作者vintage.wang所写,对于每项对比,后面都增加了我的观点,有不对的地方,请各位指出. 淘宝内部的交易系统使用了淘宝自主研发的Notify消息中间件,使用Mysql作为 ...

  8. RocketMQ与Kafka对比

    转自:https://github.com/alibaba/RocketMQ/wiki/rmq_vs_kafka 淘宝内部的交易系统使用了淘宝自主研发的Notify消息中间件,使用MySQL作为消息存 ...

  9. Apache Kafka 快速入门

    概述 Apache Kafka是一个分布式发布-订阅消息系统和强大的队列,可以处理大量的数据,将消息从一个端点传递到另一个端点.Kafka适合离线和在线消息消费,Kafka消息保存在磁盘上,并在集群内 ...

随机推荐

  1. 【转载自JHBlogs的博客】postman接口自动化,环境变量的用法详解(附postman常用的方法)

    在实现接口自动测试的时候,会经常遇到接口参数依赖的问题,例如调取登录接口的时候,需要先获取登录的key值,而每次请求返回的key值又是不一样的,那么这种情况下,要实现接口的自动化,就要用到postma ...

  2. eas之获取单据编码规则

    //获取单据编码规则  /*** @Title: getNumber* @Description: TODO(获取单据编码规则)*               <p>* @date 201 ...

  3. [luogu4161 SCOI2009]游戏 (DP)

    传送门 Solution 可以发现实际上是把n分为几个循环节,然后找循环节的\(lcm\)是这次的排数 而\(lcm\)必然是一些最高次幂的质数的成积,那么就dp求一下所有情况就好了 PS:注意并不是 ...

  4. Codeforces 919D Substring (拓扑图DP)

    手动博客搬家: 本文发表于20180716 10:53:12, 原地址https://blog.csdn.net/suncongbo/article/details/81061500 给定一个\(n\ ...

  5. 0613pt-query-digest分析慢查询日志

    转自http://www.jb51.net/article/107698.htm 这篇文章主要介绍了关于MySQL慢查询之pt-query-digest分析慢查询日志的相关资料,文中介绍的非常详细,对 ...

  6. qsort快速排序

    C库函数qsort七种使用方法示例 七种qsort排序方法<本文中排序都是采用的从小到大排序> 一.对int类型数组排序C++ / C 代码 int num[100]; Sample: i ...

  7. mongodb--安全

    安全和认证 mongodb和redis比较像,安全部分依赖于其所存在的环境 一定要把mongodb放在一个可信的环境下去运行,mongodb只能被web服务器所访问,禁止开外网端口访问mongodb, ...

  8. [bzoj3307]雨天的尾巴_线段树合并

    雨天的尾巴 bzoj-3307 题目大意:N个点,形成一个树状结构.有M次发放,每次选择两个点x,y对于x到y的路径上(含x,y)每个点发一袋Z类型的物品.完成所有发放后,每个点存放最多的是哪种物品. ...

  9. Udp发送端和接收端

    //UdpReceive.java /* 定义udp的接收端. 思路: 1.定义udpSocket服务.一般会监听一个端口,事实上就是这个接收网络应用程序定义一个数字标示. 2.定义一个数据包.用来存 ...

  10. Android入门:短信和拨打电话

    watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/ ...