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. BZOJ 1740: [Usaco2005 mar]Yogurt factory 奶酪工厂 贪心 + 问题转化

    Description The cows have purchased a yogurt factory that makes world-famous Yucky Yogurt. Over the ...

  2. USACO 4.1 Fence Loops

    Fence Loops The fences that surround Farmer Brown's collection of pastures have gotten out of contro ...

  3. AtCoder ABC 076D - AtCoder Express

    传送门:http://abc076.contest.atcoder.jp/tasks/abc076_d 本题是一个运动学问题——匀变速运动. 一个质点,从静止开始运动.按照速度限制,可将运动划分成n个 ...

  4. Netty学习总结(2)——Netty的高性能架构之道

    Netty是一个高性能.异步事件驱动的NIO框架,它提供了对TCP.UDP和文件传输的支持,作为一个异步NIO框架,Netty的所有IO操作都是异步非阻塞的,通过Future-Listener机制,用 ...

  5. ASP用户登录代码

    asp+access用户登录代码,其中huiyuan.mdb数据库名pUser213 表名y_username用户名字段,y_password密码字段. login.htm页面<head> ...

  6. 如何预防SQL注入,XSS漏洞(spring,java)

    SQL注入简介 SQL注入是由于程序员对用户输入的参数没有做好校验,让不法分子钻了SQL的空子, 比如:我们一个登录界面,要求用户输入用户名和密码: 用户名: ' or 1=1-- 密码: 点击登录之 ...

  7. spring boot使用外部tomcat部署

    1:pom里面的packaging修改为war(<packaging>war</packaging>) 2:在pom依赖spring-boot-starter-web排除内置的 ...

  8. 5.2 calendar--通用日期的相关函数(4)

    calendar类提供以下的函数来推断日历相关的内容: calendar.setfirstweekday(weekday) 设置一周里那一天作为第一天.0是表示星期一,6是表示星期天. 样例: #py ...

  9. php类似shell脚本的用法

    参考: http://www.cnblogs.com/myjavawork/articles/1869205.html php还可以用于类似于shell脚本,哈哈,对编程语言和对整个计算机系统的认识又 ...

  10. android 点击返回键退出程序的方法

    android 点击返回键退出程序的方法 第一种: 再按一次返回键退出程序 private long exitTime = 0; @Override public boolean onKeyDown( ...