最近开发的项目计划使用Kafka来实现日志系统,开发的过程中在自己的服务器上搭建了Kafka的开发环境,由于我的服务器是Ubuntu 16.04.7 LTS (GNU/Linux 5.6.7-050607-generic x86_64),下面以Ubuntu 16.04为例讲解Kafka的安装步骤。
Kafka的运行依赖Java 8和ZooKeeper两个环境,所以下面将从安装JDK 8和ZooKeeper的环境开始的。
1. 安装Java环境
- 首先验证本机安装的Java版本:请在命令行中执行以下命令查看当前机器上安装的java版本,如果不是Java 8请按照第2、3、4、5步安装Java 8。
java -version
- 第2步,下载JDK 1.8:由于Oracle官网下载JDK1.8需要账号登录,请使用备份网站的下载地址下载。在命令行执行以下命令下载Java 8 SDK
wget https://storage.tyyod.com/jdk-8u261-linux-x64.tar.gz ~/
- 第3步,解压JDK安装包:请执行以下命令将最新版本的JDK解压到对应的目录
//创建目录
mkdir /opt/jdk
//将文件移动到目标目录
mv ~/jdk-8u261-linux-x64.tar.gz /opt/jdk/
cd /opt/jdk/
//再执行解压缩命令
unzip -zxvf ~/jdk-8u261-linux-x64.tar.gz
- 第4步,配置环境变量:请将配置信息添加到〜/ .bashrc文件:
export JAVA_HOME =/opt/jdk/jdk1.8.0_261
export PATH=$PATH:$JAVA_HOME/bin
- 第5步,现在将所有更改应用到当前运行的系统,执行以下命令即可:
source ~/.bashrc
- 第6步,再次在命令行执行java -version检查环境是否配置成功,如果配置正确您将会看到如下内容:
java version "1.8.0_261"
Java(TM) SE Runtime Environment (build 1.8.0_261-b12)
Java HotSpot(TM) 64-Bit Server VM (build 25.261-b12, mixed mode)
2. 下载ZooKeeper
- 首先打开ZooKeeper官方网址,找到最新版本的链接下载,这里以3.6.2版本的下载链接示例
wget http://apache.communilink.net/zookeeper/zookeeper-3.6.2/apache-zookeeper-3.6.2-bin.tar.gz ~/
- 然后解压提取文件:
mv ~/apache-zookeeper-3.6.2-bin.tar.gz /opt
cd /opt
tar -zxf apache-zookeeper-3.6.2-bin.tar.gz
cd apache-zookeeper-3.6.2-bin
- 创建配置文件:使用命令vim conf/zoo.cfg打开名为 conf/zoo.cfg 的配置文件,并将所有以下参数添加到文件中:
tickTime=2000
dataDir=/tmp/zookeeper/data
clientPort=2181
initLimit=5
syncLimit=2
- 启动ZooKeeper服务,在ZooKeeper根目录执行以下代码即可:
bin/zkServer.sh start
- 启动成功后,您将看到以下信息:
ZooKeeper JMX enabled by default
Using config: /opt/apache-zookeeper-3.6.2-bin/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED
- 启动CLI,连接ZooKeeper服务器
bin/zkCli.sh
成功连接到ZooKeeper服务器后,将得到以下响应:
Connecting to localhost:2181
................
................
................
Welcome to ZooKeeper!
................
................
WATCHER::
WatchedEvent state:SyncConnected type: None path:null
[zk: localhost:2181(CONNECTED) 0]
- 如果需要停止ZooKeeper服务,可以执行以下命令:
bin/zkServer.sh stop
3. 安装Kafka
执行完第1步和第2步后,我们的机器上已经成功安装了Java和ZooKeeper。 下面让我们看看安装Apache Kafka的步骤。
- 下载Kafka:进入Kafka官网下载页,找到最新的下载地址,并执行以下命令:
wget http://ftp.cuhk.edu.hk/pub/packages/apache.org/kafka/2.6.0/kafka_2.12-2.6.0.tgz ~/
- 解压提取文件
mv ~/kafka_2.12-2.6.0.tgz /opt
cd /opt
tar -zxf kafka_2.12-2.6.0.tgz
cd kafka_2.12-2.6.0/
- 启动Kafka服务,可以使用以下命令来启动kafka服务:
bin/kafka-server-start.sh config/server.properties
到此为止,Kafka就已经安装并启动完成了。
4. 常见问题及解决方法
- 问题1: 在启动的过程中遇到 error='Cannot allocate memory',具体错误如下:
Java HotSpot(TM) 64-Bit Server VM warning: INFO: os::commit_memory(0x00000000c0000000, 1073741824, 0) failed; error='Cannot allocate memory' (errno=12)
#
# There is insufficient memory for the Java Runtime Environment to continue.
# Native memory allocation (mmap) failed to map 1073741824 bytes for committing reserved memory.
# An error report file with more information is saved as:
# /opt/kafka_2.12-2.6.0/hs_err_pid8807.log
解决方案是调低Kafka启动时使用的内存,具体方法是修改bin目录下的 zookeeper-server-start.sh
,将初始堆的大小(-Xms)设置小一些:
//将启动内存设置为512M
export KAFKA_HEAP_OPTS="-Xmx512M -Xms512M"
//如果还不行,可以把内存再调一下,改为128M
export KAFKA_HEAP_OPTS="-Xmx1G -Xms128M"
还可以将config目录下的server.properties中调整初始化LogManager时候用到的buffer size参数:
log.cleaner.dedupe.buffer.size= prefered buffer size in byte
- 问题2: 在启动过程中遇到java.net.UnknownHostException,具体错误如下:
java.net.UnknownHostException: iZ2zefpdklq0jwgbz3mc21Z: iZ2zefpdklq0jwgbz3mc21Z: Name or service not known
at java.net.InetAddress.getLocalHost(InetAddress.java:1506)
at kafka.server.KafkaServer.$anonfun$createBrokerInfo$7(KafkaServer.scala:469)
at scala.collection.TraversableLike.$anonfun$map$1(TraversableLike.scala:273)
at scala.collection.mutable.ResizableArray.foreach(ResizableArray.scala:62)
at scala.collection.mutable.ResizableArray.foreach$(ResizableArray.scala:55)
at scala.collection.mutable.ArrayBuffer.foreach(ArrayBuffer.scala:49)
at scala.collection.TraversableLike.map(TraversableLike.scala:273)
at scala.collection.TraversableLike.map$(TraversableLike.scala:266)
at scala.collection.AbstractTraversable.map(Traversable.scala:108)
at kafka.server.KafkaServer.createBrokerInfo(KafkaServer.scala:467)
at kafka.server.KafkaServer.startup(KafkaServer.scala:292)
at kafka.server.KafkaServerStartable.startup(KafkaServerStartable.scala:44)
at kafka.Kafka$.main(Kafka.scala:82)
at kafka.Kafka.main(Kafka.scala)
Caused by: java.net.UnknownHostException: iZ2zefpdklq0jwgbz3mc21Z: Name or service not known
at java.net.Inet4AddressImpl.lookupAllHostAddr(Native Method)
at java.net.InetAddress$2.lookupAllHostAddr(InetAddress.java:929)
at java.net.InetAddress.getAddressesFromNameService(InetAddress.java:1324)
at java.net.InetAddress.getLocalHost(InetAddress.java:1501)
... 13 more
解决方案:在系统的/etc/hosts
文件中增加主机名iZ2zefpdklq0jwgbz3mc21Z的IP地址
127.0.0.1 iZ2zefpdklq0jwgbz3mc21Z