需求:
使用Kafka做日志收集
一、需要收集的信息:
1、用户ID(user_id)
2、时间(act_time)
3、操作(action,可以是:点击:click,收藏:job_collect,投简历:cv_send,上传简历:cv_upload)
4、对方企业编码(job_code)
二、工作流程:
1、HTML可以理解为拉勾的职位浏览页面
2、用户的操作会由Web服务器进行响应。
3、同时用户的操作也会使用ajax向Nginx发送请求,nginx用于收集用户的点击数据流。
4、Nginx收集的日志数据使用ngx_kafka_module将数据发送到Kafka集群的主题中。
5、只要数据保存到Kafka集群主题,后续就可以使用大数据组件进行实时计算或其他的处理了,比如职位推荐,统计报表等。
三、架构:
HTML+Nginx+ngx_kafka_module+Kafka
ngx_kafka_module网址:https://github.com/brg-liuwei/ngx_kafka_module
注意问题:由于使用ngx_kafka_module,只能接收POST请求,同时一般Web服务器不会和数据收集的Nginx在同一个域名,会涉及到使用ajax发送请求的跨域问题,可以在nginx中配置跨域来解决。
四、实战步骤:
安装Kafka
安装Nginx
配置ngx_kafka_module,注意跨域配置
开发HTML页面
安装JDK1.8
wget --no-cookies --no-check-certificate --header "Cookie: gpw_e24=http%3A%2F%2Fwww.oracle.com%2F; oraclelicense=accept-securebackup-cookie" "http://download.oracle.com/otn-pub/java/jdk/8u141-b15/336fa29ff2bb4ef291e347e091f7f4a7/jdk-8u261-linux-x64.tar.gz"
tar -xzf jdk-8u141-linux-x64.tar.gz
配置环境变量
vim /etc/profile
export JAVA_HOME=/root/kafka/jdk1.8.0_141
export PATH=$PATH:$JAVA_HOME/bin
# 生效
source /etc/profile
# 验证
java -version
zookeeper 安装
wget http://archive.apache.org/dist/zookeeper/zookeeper-3.4.14/zookeeper-3.4.14.tar.gz
tar -zxf zookeeper-3.4.14.tar.gz -C /opt
cd /opt/zookeeper-3.4.14/conf
# 复制zoo_sample.cfg命名为zoo.cfg
cp zoo_sample.cfg zoo.cfg
# 编辑zoo.cfg文件
vim zoo.cfg
修改Zookeeper保存数据的目录,dataDir:
dataDir=/var/zookeeper/data
编辑/etc/profile
vim /etc/profile
# ZOOKEEPER_PREFIX指向Zookeeper的解压目录
export ZOOKEEPER_PROFIX=/opt/zookeeper-3.4.14/
# 将Zookeeper的bin目录添加到PATH中
export PATH=$PATH:$ZOOKEEPER_PROFIX/bin
# 设置环境变量ZOO_LOG_DIR,指定Zookeeper保存日志的位置
export ZOO_LOG_DIR=/var/zookeeper/log
使配置生效
source /etc/profile
验证
[root@mysql-slave1 bin]# cd /opt/zookeeper-3.4.14/bin
[root@mysql-slave1 bin]# zkServer.sh status
ZooKeeper JMX enabled by default
Using config: /opt/zookeeper-3.4.14/bin/../conf/zoo.cfg
Error contacting service. It is probably not running.
kafka安装
- 软件下载
wget http://archive.apache.org/dist/kafka/1.0.2/kafka_2.12-1.0.2.tgz
tar -zxf kafka_2.12-1.0.2.tgz -C /opt
- 配置环境变量
vim /etc/profile
export KAFKA_HOME=/opt/kafka_2.12-1.0.2
export PATH=$PATH:$KAFKA_HOME/bin
source /etc/profile
- 配置kafka 连接Zookeeper地址
vim /opt/kafka_2.12-1.0.2/config/server.properties
log.dirs=/var/kafka-logs
zookeeper.connect=localhost:2181/myKafka
- 启动zookeeper
[root@mysql-slave1 bin]# cd /opt/zookeeper-3.4.14/bin/
[root@mysql-slave1 bin]# zkServer.sh start
ZooKeeper JMX enabled by default
Using config: /opt/zookeeper-3.4.14/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED
[root@mysql-slave1 bin]# zkServer.sh status
ZooKeeper JMX enabled by default
Using config: /opt/zookeeper-3.4.14/bin/../conf/zoo.cfg
Mode: standalone
- 启动kafka
cd /opt/kafka_2.12-1.0.2
bin/kafka-server-start.sh config/server.properties
# 此时Kafka是前台模式启动,要停止,使用Ctrl+C; 使用后台启动参数-daemon
bin/kafka-server-start.sh -daemon config/server.properties
# 查看Kafka的后台进程:
ps aux | grep kafka
- 停止kafka
cd /opt/kafka_2.12-1.0.2
bin/kafka-server-stop.sh
kafka常用命令
-
kafka-topics.sh用户管理主题
# 列出所有主题 kafka-topics.sh --list --zookeeper localhost:2181/myKafka # 创建主题 kafka-topics.sh --zookeeper localhost:2181/myKafka --create --topic topic_1 --partitions 1 --replication-factor 1 # 查询指定主题信息 kafka-topics.sh --zookeeper localhost:2181/myKafka --describe --topic topic_1 # 删除指定主题【真正删除还需要在/var/目录下删除kafka-logs文件夹,然后重启kafka】 kafka-topics.sh --zookeeper localhost:2181/myKafka --delete --topic topic_1
-
kafka-console-producer.sh用于生产消息
# 开启生产者 kafka-console-producer.sh --broker-list localhost:9020 --topic topic_1
-
kafka-console-consumer.sh 用于消费消息
# 开启消费者 kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic topic_1 # 开启消费者方式二: 从头消费,不按照偏移量消费 kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic topic_1 --from-beginning
启动异常处理
Caused by: java.net.UnknownHostException: mysql-slave1: 未知的名称或服务
解决方法
vim /etc/hosts
127.0.0.1 mysql-slave1
启动kafka报内存不足的错误
修改kafka-server-start.sh启动参数
export KAFKA_HEAP_OPTS="-Xmx256M -Xms128M"
安装nginx
备注:如果软件下载失败,需要自行下载并上传服务器,注意文件名称要一致
wget http://nginx.org/download/nginx-1.8.0.tar.gz
tar -zxvf nginx-1.8.0.tar.gz -C /usr/local/src/
# 安装git
yum install -y git
# 切换到/usr/local/src目录,然后将kafka的c客户端源码clone到本地
cd /usr/local/src
git clone https://github.com/edenhill/librdkafka
# 进入到librdkafka,然后进行编译
cd librdkafka
yum install -y gcc gcc-c++ pcre-devel zlib-devel
./configure
make && make install
# 安装nginx整合kafka的插件,进入到/usr/local/src,clone nginx整合kafka的源码
cd /usr/local/src
git clone https://github.com/brg-liuwei/ngx_kafka_module
# 进入到nginx的源码包目录下(编译nginx,然后将将插件同时编译)
cd /usr/local/src/nginx-1.12.2
./configure --add-module=/usr/local/src/ngx_kafka_module/
make & make install
修改nginx的配置文件
http {
kafka;
kafka_broker_list localhost:9092;
# kafka_broker_list 118.25.213.188:9092 118.24.12.122:9092 118.25.213.36:9092;
server {
# topic 消息转发到kafka
location = /log {
# 开启跨域
add_header 'Access-Control-Allow-Origin' '*';
add_header 'Access-Control-Allow-Credentials' 'true';
kafka_topic topic_1;
}
}
}
# 启动nginx
/usr/local/nginx/sbin/nginx
# 查看nginx进程
ps -ef | grep nginx
netstat -anpt | grep nginx
异常处理
#【启动nginx,报错,找不到 librdkafka.so.1的文件】
error while loading shared libraries: librdkafka.so.1: cannot open shared object file: No such file or directory
# 解决办法:加载so库
echo "/usr/local/lib" >> /etc/ld.so.conf
ldconfig
测试消息发送
# 启动成功后,向kafka集群发送消息测试
curl localhost/kafka/track -d "message send to kafka topic_1"
消息发送HTML
<!doctype html>
<html>
<head>
<meta charSet="utf-8"/>
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=5.0, minimum-scale=1.0"/>
<title>kafka测试</title>
</head>
<body>
<button onclick="lk('login')">登录</button>
<button onclick="lk('click')">点击</button>
<button onclick="lk('jobCollect')">收藏</button>
<button onclick="lk('cvSend')">投简历</button>
<button onclick="lk('cvUpload')">上传简历</button>
<script type="text/javascript" src='https://cdn.bootcss.com/jquery/3.3.1/jquery.min.js'></script>
<script>
function lk(_action){
var info = {};
info.userId = 123;
info.actTime = new Date();
info.action = _action;
info.jobCode = "lagou";
$.ajax({
type: "post",
url: "/log",
data: JSON.stringify(info),
success: function(res){
}
});
}
</script>
</body>
</html>