Kafka1 利用虚拟机搭建自己的Kafka集群
前言:
上周末自己学习了一下Kafka,参考网上的文章,学习过程中还是比较顺利的,遇到的一些问题最终也都解决了,现在将学习的过程记录与此,供以后自己查阅,如果能帮助到其他人,自然是更好的。
===============================================================长长的分割线====================================================================
正文:
关于Kafka的理论介绍,网上可以搜到到很多的资料,大家可以自行搜索,我这里就不在重复赘述。
本文中主要涉及三块内容: 第一,就是搭建Zookeeper环境;第二,搭建Kafka环境,并学习使用基本命令发送接收消息;第三,使用Java API完成操作,以便初步了解在实际项目中的使用方式。
闲话少说,言归正传,本次的目的是利用VMware搭建一个属于自己的ZooKeeper和Kafka集群。本次我们选择的是VMware10,具体的安装步骤大家可以到网上搜索,资源很多。
第一步,确定目标:
ZooKeeperOne 192.168.224.170 CentOS
ZooKeeperTwo 192.168.224.171 CentOS
ZooKeeperThree 192.168.224.172 CentOS
KafkaOne 192.168.224.180 CentOS
KafkaTwo 192.168.224.181 CentOS
我们安装的ZooKeeper是3.4.6版本,可以从这里下载zookeeper-3.4.6; Kafka安装的是0.8.1版本,可以从这里下载kafka_2.10-0.8.1.tgz; JDK安装的版本是1.7版本。
另: 我在学习的时候,搭建了两台Kafka服务器,正式环境中我们最好是搭建2n+1台,此处仅作为学些之用,暂不计较。
第二步,搭建Zookeeper集群:
此处大家可以参照我之前写的一篇文章 ZooKeeper1 利用虚拟机搭建自己的ZooKeeper集群 ,我在搭建Kafka的环境的时候就是使用的之前搭建好的Zookeeper集群。
第三步,搭建Kafka集群:
(1). 将第一步中下载的 kafka_2.10-0.8.1.tgz 解压缩后,进入config目录,会看到如下图所示的一些配置文件,我们准备编辑server.properties文件。

(2). 打开 server.properties 文件,需要编辑的属性如下所示:
broker.id=0
port=9092
host.name=192.168.224.180 log.dirs=/opt/kafka0.8.1/kafka-logs zookeeper.connect=192.168.224.170:2181,192.168.224.171:2181,192.168.224.172:2181
注意:
a. broker.id: 每个kafka对应一个唯一的id,自行分配即可
b. port: 默认的端口号是9092,使用默认端口即可
c. host.name: 配置的是当前机器的ip地址
d. log.dirs: 日志目录,此处自定义一个目录路径即可
e. zookeeper.connect: 将我们在第二步搭建的Zookeeper集群的配置全部写上
(3). 上边的配置完毕后,我们需要执行命令 vi /etc/hosts,将相关服务器的host配置如下图,如果没有执行此步,后边我们在执行一些命令的时候,会报无法识别主机的错误。

(4). 经过上述操作,我们已经完成了对Kafka的配置,很简单吧?!但是如果我们执行 bin/kafka-server-start.sh config/server.properties & 这个启动命令,可能我们会遇到如下两个问题:
a. 我们在启动的报 Unrecognized VM option '+UseCompressedOops'.Could not create the Java virtual machine. 这个错误。

解决方式:
查看 bin/kafka-run-class.sh
找到下面这段代码,去掉-XX:+UseCompressedOops
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
b. 解决了第一个问题,我们还有可能在启动的时候遇到 java.lang.NoClassDefFoundError: org/slf4j/impl/StaticLoggerBinder 这个错误。

解决方式:
从网上的下载 slf4j-nop-1.6.0.jar 这个jar包,然后放到kafka安装目录下的libs目录中即可。注意,基于我目前的kafka版本,我最开始从网上下载的slf4j-nop-1.5.0.jar 这个jar包,但是启动的时候依然会报错,所以一定要注意版本号哦~
(5). 现在我们执行 bin/kafka-server-start.sh config/server.properties & 这个启动命令,应该就可以正常的启动Kafka了。命令最后的 & 符号是为了让启动程序在后台执行。如果不加这个 & 符号,当执行完启动后,我们通常会使用 ctrl + c 退出当前控制台,kafka此时会自动执行shutdown,所以此处最好加上 & 符号。
第三步,使用基本命令创建消息主题,发送和接收主题消息:
(1). 创建、查看消息主题
#连接zookeeper, 创建一个名为myfirsttopic的topic
bin/kafka-topics.sh --create --zookeeper 192.168.224.170:2181 --replication-factor 2 --partitions 1 --topic myfirsttopic # 查看此topic的属性
bin/kafka-topics.sh --describe --zookeeper 192.168.224.170:2181 --topic myfirsttopic # 查看已经创建的topic列表
bin/kafka-topics.sh --list --zookeeper 192.168.224.170:2181
上述命令执行完毕后,截图如下:


(2). 创建一个消息的生产者:
#启动生产者,发送消息
bin/kafka-console-producer.sh --broker-list 192.168.224.180:9092 --topic myfirsttopic #启动消费者,接收消息
bin/kafka-console-consumer.sh --zookeeper 192.168.224.170:2181 --from-beginning --topic myfirsttopic
上述命令执行完毕后,截图如下:

(3). 按照(1)、(2)这两步,你应该可以利用Kafka感受到了分布式消息系统。这里需要着重的再说一下我在这个过程中发现的一个问题: 大家可以看下上图中的consumer的命令,我选择了zookeeper的其中一台192.168.224.170:2181接收消息是可以正常接收的!不要忘了,我是三台zookeeper的,所以我又尝试了向192.168.224.171:2181和192.168.224.172:2181接收myfirsttopic这个主题的消息。正常情况下,三台访问的结果应该都是可以正常的接收消息,但是当时我的情况在访问了192.168.224.171:2181这台时会报 org.apache.zookeeper.clientcnxn 这个错误!!!
我当时多试了两遍,发现我的三台zookeeper中,谁是leader(zkServer.sh status命令),concumer连接的时候就会报上面的那个异常。后来定位到了zookeeper的zoo.cfg配置文件中的maxClientCnxns属性,即客户端最大连接数,我当时使用的是默认配置是2。后来我把这个属性的值调大一些,consumer连接zookeeper leader时,就不会报这个错误了。如果你选择将这个属性注释掉(从网上查询到注释掉该属性默认值是10),也不会报这个错误了。其实网上的很多文章也只是说了此属性可以尽量设置的大一些,没有解释其他的。
但我后来还是仔细想了想,当我把maxClientCnxns这个属性设置为2时,如果两台kafka启动时,每个kafka和zookeeper的节点之间建立了一个客户端连接,那么此时zookeeper的每个节点的客户端连接数就已经达到了最大连接数2,那么我创建consumer的时候,应该是三台zookeeper连接都有问题,而不是只有leader会有问题。所以,此处需要各位有见解的再帮忙解释一下!!!
第四步,使用Java API 操作Kafka:
其实Java API提供的功能基本也是基于上边的客户端命令来实现的,万变不离其宗,我将我整理的网上的例子贴到下面,大家可以在本地Java工程中执行一下,即可了解调用方法。
(1). 我的maven工程中pom.xml的配置
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.ismurf.study</groupId>
<artifactId>com.ismurf.study.kafka</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>Kafka_Project_0001</name>
<packaging>war</packaging> <dependencies>
<dependency>
<groupId>org.apache.kafka</groupId>
<artifactId>kafka_2.10</artifactId>
<version>0.8.1.1</version>
</dependency>
</dependencies> <build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<version>2.1.1</version>
<configuration>
<outputFileNameMapping>@{artifactId}@.@{extension}@</outputFileNameMapping>
</configuration>
</plugin> <!-- Ensures we are compiling at 1.6 level -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.6</source>
<target>1.6</target>
</configuration>
</plugin> <plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<configuration>
<skipTests>true</skipTests>
</configuration>
</plugin>
</plugins>
</build> </project>
(2). 实例代码: 大家可以参考这片文章的 http://blog.csdn.net/honglei915/article/details/37563647 中的代码,粘贴到工程后即可使用,上述文章中的代码整理后目录截图如下:

Kafka1 利用虚拟机搭建自己的Kafka集群的更多相关文章
- ZooKeeper1 利用虚拟机搭建自己的ZooKeeper集群
前言: 前段时间自己参考网上的文章,梳理了一下基于分布式环境部署的业务系统在解决数据一致性问题上的方案,其中有一个方案是使用ZooKeeper,加之在大数据处理中,ZooKeeper确实起 ...
- Docker快速搭建Zookeeper和kafka集群
使用Docker快速搭建Zookeeper和kafka集群 镜像选择 Zookeeper和Kafka集群分别运行在不同的容器中zookeeper官方镜像,版本3.4kafka采用wurstmeiste ...
- 使用Docker快速搭建Zookeeper和kafka集群
使用Docker快速搭建Zookeeper和kafka集群 镜像选择 Zookeeper和Kafka集群分别运行在不同的容器中zookeeper官方镜像,版本3.4kafka采用wurstmeiste ...
- 学习Hadoop+Spark大数据巨量分析与机器学习整合开发-windows利用虚拟机实现模拟多节点集群构建
记录学习<Hadoop+Spark大数据巨量分析与机器学习整合开发>这本书. 第五章 Hadoop Multi Node Cluster windows利用虚拟机实现模拟多节点集群构建 5 ...
- 搭建zookeeper和Kafka集群
搭建zookeeper和Kafka集群: 本实验拥有3个节点,均为CentOS 7系统,分别对应IP为10.211.55.11.10.211.55.13.10.211.55.14,且均有相同用户名 ( ...
- 用三台虚拟机搭建Hadoop全分布集群
用三台虚拟机搭建Hadoop全分布集群 所有的软件都装在/home/software下 虚拟机系统:centos6.5 jdk版本:1.8.0_181 zookeeper版本:3.4.7 hadoop ...
- CentOS 7搭建Zookeeper和Kafka集群
环境 CentOS 7.4 Zookeeper-3.6.1 Kafka_2.13-2.4.1 Kafka-manager-2.0.0.2 本次安装的软件全部在 /home/javateam 目录下. ...
- Hadoop4 利用VMware搭建自己的hadoop集群
前言: 前段时间自己学习如何部署伪分布式模式的hadoop环境,之前由于工作比较忙,学习的进度停滞了一段时间,所以今天抽出时间把最近学习的成果和大家分享一下. 本文要介绍的是如 ...
- ZooKeeper学习之路 (九)利用ZooKeeper搭建Hadoop的HA集群
Hadoop HA 原理概述 为什么会有 hadoop HA 机制呢? HA:High Available,高可用 在Hadoop 2.0之前,在HDFS 集群中NameNode 存在单点故障 (SP ...
随机推荐
- 基于DDD的现代ASP.NET开发框架--ABP系列文章总目录
ABP相关岗位招聘:给热爱.NET新技术和ABP框架的朋友带来一个高薪的工作机会 ABP交流会录像视频:ABP架构设计交流群-7月18日上海线下交流会的内容分享(有高清录像视频的链接) 代码自动生成: ...
- AngularJs之九(ending......)
今天继续angularJs,但也是最后一篇关于它的了,基础部分差不多也就这些,后续有机会再写它的提升部分. 今天要写的也是一个基础的选择列表: 一:使用ng-options,数组进行循环. <d ...
- 《Django By Example》第三章 中文 翻译 (个人学习,渣翻)
书籍出处:https://www.packtpub.com/web-development/django-example 原作者:Antonio Melé (译者注:第三章滚烫出炉,大家请不要吐槽文中 ...
- 运用php做投票题,例题
要求大概是这样的,有一个题目,题目下面是复选框,要求点完复选框提交后会变成进度条,各选项的进度条百分比,和投票数量 首先还是要在数据库建两张表,如下: 要完成这个题目,需要建两个页面 <!DOC ...
- PHP中PDO事务的使用方法
事务 (Transaction) 是操作数据库中很重要的一个功能, 它可以让你预定一条, 或者一系列 SQL 语句, 然后一起执行. 在执行的过程中, 如果其中的某条执行失败, 可以回滚所有已更改的操 ...
- 浅谈JSP中include指令与include动作标识的区别
JSP中主要包含三大指令,分别是page,include,taglib.本篇主要提及include指令. include指令使用格式:<%@ include file="文件的绝对路径 ...
- HTML5 标签 details 展开 搜索
details有一个新增加的子标签--summary,当鼠标点击summary标签中的内容文字时,details标签中的其他所有元素将会展开或收缩. 默认状态为 收缩状态 设置为展开状态为 <d ...
- 分布式中使用Redis实现Session共享(二)
上一篇介绍了一些redis的安装及使用步骤,本篇开始将介绍redis的实际应用场景,先从最常见的session开始,刚好也重新学习一遍session的实现原理.在阅读之前假设你已经会使用nginx+i ...
- Photoshop、Illustrator思维导图笔记
半年前学习Photoshop时记得的思维导图笔记,可能不是很全,常用的基本都记下了.
- JS高级前端开发群加群说明及如何晋级
JS高级前端开发群加群说明 一.文章背景: 二. 高级群: 三. 加入方式: 四. 说明: 一.文章背景: 去年年初建了几个群,在不经意间火了,一直排在“前端开发”关键字搜索结果第一名.当然取得这 ...