最近学习推荐系统, 想做一个类似于企业上的那种推荐系统(采用的阿里天池赛的一个电商数据集, 然后基于大数据的Lambda架构, 实现离线和在线相结合的实时推荐系统), 这样可以熟悉一下真实环境中的推荐系统流程, 但是这里面需要大数据的开发环境, 所以这里的这个系列是记录自己搭建大数据开发环境的整个过程, 这里面会涉及到Hadoop集群,Spark, zookeeper, HBase, Hive, Kafka等的相关安装和配置,当然后面也会整理目前学习到的关于前面这些东西的相关理论知识和最终的那个推荐系统, 经过这一段时间的摸索学习, 希望能对大数据开发和工业上的推荐系统流程有个宏观的初识,这一块涉及到技术上的细节偏多, 所以想记录一下, 方便以后查看和回练, 开始
上一篇文章完成了Hive和MySQL的安装和环境搭建, 其实大数据的开发环境基本上完成了, 今天的这篇是再安装两个有关于日志采集的两个软件,一个是Kafka,另一个是flume。 Kafka是一个分布式的基于发布或者订阅模式的消息队列,主要是应用于大数据实时处理的领域。Flume是Cloudera提供的一个高可用,高可靠,分布式的海量日志采集、聚合和传输的系统,主要的作用是读取服务器本地磁盘的数据, 将数据写入到HDFS。
由于目前我没有用过,具体的原理后面整理,这里先把这两个搭建起来。
依然是基于我们已经下载好的安装包,三步走:
tar zxvf kafka_2.12-1.0.0.tgz
sudo mkdir /opt/bigdata/kafka/
sudo mv kafka_2.12-1.0.0 /opt/bigdata/kafka/kafka2.12
这里依然是环境变量的配置, 这里换了版本了,前面的环境变量那里需要改一下
# kafka config
export KAFKA_HOME=/opt/bigdata/kafka/kafka2.12
# 其他的不用动
修改配置文件夹, kafka2.12/config/server.properties
里面:
broker.id=0 # 标识符, 相当于zookeeper的myid, 三台机器上不能一样
host.name=master
# 改一下日志路径
log.dirs=/opt/bigdata/kafka/kafka2.12/kafka-logs
# 改一下zookeeper连接主机
zookeeper.connect=master:2181, slave01:2181, slave02:2181
然后将kafka拷贝到其他集群上,因为这个东西是基于zookeeper的, 所以和zookeeper有点像,得每台机器上都有。
scp -r /opt/bigdata/kafka icss@slave01:/opt/bigdata
scp -r /opt/bigdata/kafka icss@slave02:/opt/bigdata
然后进入每台机器,修改他们的broker.id和host.name
ssh slave01
cd /opt/bigdata/kafka/kafka2.12/config
sudo vi server.properties # broker.id 1 host.name slave01
# slave02同理
接下来启动kafka, 首先要先启动zookeeper集群
# 开启slave01的zookeeper
ssh slave01
cd /opt/bigdata/zookeeper/zookeeper3.4/bin
zkServer.sh start
exit
# 开始slave02的zookeeper
ssh slave02
cd /opt/bigdata/zookeeper/zookeeper3.4/bin
zkServer.sh start
exit
# 开启自己的zookeeper
cd /opt/bigdata/zookeeper/zookeeper3.4/bin
zkServer.sh start
然后用类似的方式启动kafka
ssh slave01
cd /opt/bigdata/kafka/kafka2.12
bin/kafka-server-start.sh -daemon config/server.properties
exit
# 开始slave02的zookeeper
ssh slave02
cd /opt/bigdata/kafka/kafka2.12
bin/kafka-server-start.sh -daemon config/server.properties
exit
# 开启自己的zookeeper
cd /opt/bigdata/kafka/kafka2.12
bin/kafka-server-start.sh -daemon config/server.properties # -daemon 守护进程, 这样就没有日志了
这样就都启动起来了。 上面的这种切换方式太麻烦了,无意中get到了一种shell脚本的方式, 可以在master上同时启动或者关闭三台机器上的kafka, 当然zookeeper,还有一些其他的那种需要三台机器同时启动的也是一样的原理,下面我们就来试一下。 在icss家目录下的bin目录下新建立一个kfk_manage.sh
文件, 然后在里面输入:
#!/bin/bash
case $1 in
"start"){
for i in master slave01 slave02
do
echo "**********$i***********"
ssh $i "/opt/bigdata/kafka/kafka2.12/bin/kafka-server-start.sh -daemon /opt/bigdata/kafka/kafka2.12/config/server.properties"
done
};;
"stop"){
for i in master slave01 slave02
do
echo "**********$i***********"
ssh $i "/opt/bigdata/kafka/kafka2.12/bin/kafka-server-stop.sh
done
};;
esac
然后保存,给他一个权限 chmod 777 kfk_manage.sh
, 然后先把kafka关闭,然后再启动。
kfk_manage.sh stop
kfk_manage.sh start
既然学习了shell,那就借机再练一下, 这里再搞一个同时看三台机器jps进程的一个脚本,这个在/usr/local/bin目录下,新建一个xcall.sh脚本, 在里面输入:
#!/bin/bash
params=$@
for i in master slave01 slave02
do
echo "***********$i $params*************"
ssh $i "$params"
done
这是为了能够在任何地方都能执行这个命令, 然后就是在这个目录下为jps建立一个软连接, 要不然不知道这里的jps命令是啥意思, 命令如下;
ln -s /opt/bigdata/java/jdk1.8/bin/jps jps
这个要在三台机器的/usr/local/bin目录下都建立才行, 这样, 就可以在master的任何地方输入
chmod 777 xcall.sh
xcall.sh jps
效果如下, 直接看三台机器上的jps进程,简直太爽了:
好了,现在继续回到kafka上来,现在是kafka装好了, 接下来就是简单的用一下。master上:
cd /opt/bigdata/kafka/kafka2.12/bin
# 查看一下当前的topic
kafka-topics.sh --zookeeper master:2181 --list
# 新建立一个主题
kafka-topics.sh --zookeeper master:2181 --create --topic test --partitions 2 --replication-factor 2
# 看主题详情
kafka-topics.sh --zookeeper master:2181 --describe --topic test
# 删除主题
kafka-topics.sh --zookeeper master:2181 --delete --topic test
下面就来测试一下, 在master上建立一个生产者负责发送消息
kafka-console-producer.sh --broker-list master:9092 --topic test
在slave01和slave02上建立两个消费者负责读取信息:
# salve01
kafka-console-consumer.sh --bootstrap-server master:9092 --topic test
# slave02 不加后面的from beginning的话, 只能从当前开始取,之前的信心拿不到
kafka-console-consumer.sh ---bootstrap-server master:9092 --topic test --from-beginning
测试结果如下:
走到这里会发现,这些框架的安装方式基本上的套路差不多,依然基于下载好的安装包,三步走:
tar -zxvf apache-flume-1.9.0-bin.tar.gz
sudo mkdir /opt/bigdata/flume/
sudo mv apache-flume-1.9.0-bin /opt/bigdata/flume/flume1.9
配置一下环境变量
gedit /etc/profile
# 里面加入flume_home,然后修改path
# 生效
source /etc/profile
flume简单配置一下即可使用, 依然是进入flume1.2/conf目录,修改一下env.sh
cp flume-env.sh.template flume-env.sh
sudo gedit flume-env.sh
# 把这个注释打开修改即可
export JAVA_HOME=/opt/bigdata/java/jdk1.8
这样flume就搞定了,因为这个东西是一个传输的工具。下面用一个案例测试一下:
需求: Flume监听一个端口, 收集该端口的数据,打印到控制台。
首先,安装netcat工具:
sudo yum install -y nc
创建Flume Agent配置文件flume-netcat-logger.conf, 在flume目录下创建job文件夹并进入job文件
mkdir job
cd job/
# 创建Flume Agent配置文件flume-netcat-logger.conf
sudo gedit flume-netcat-logger.conf # 这个gedit这个编辑器只能在本地窗口打开,远程的话用vim
# 文件中添加下面内容
# Name the components on this agent
a1.sources = r1
a1.sinks = k1
a1.channels = c1
# Describe/configure the source
a1.sources.r1.type = netcat
a1.sources.r1.bind = localhost
a1.sources.r1.port = 44444
# Describe the sink
a1.sinks.k1.type = logger
# Use a channel which buffers events in memory
a1.channels.c1.type = memory
a1.channels.c1.capacity = 1000
a1.channels.c1.transactionCapacity = 100
# Bind the source and sink to the channel
a1.sources.r1.channels = c1
a1.sinks.k1.channel = c1
开启flume的监听端口
cd /opt/bigdata/flume/flume1.9
bin/flume-ng agent --conf conf/ --conf-file job/flume-netcat-logger.conf --name a1 -Dflume.root.logger=INFO,console
# 或者简单一点的这个
bin/flume-ng agent -c conf/ -n a1 -f job/flume-netcat-logger.conf -Dflume.root.logger=INFO,console
这里又报了一个错误:找不到或无法加载主类 org.apache.flume.tools.GetJavaProperty
, 这里的原因据说是版本不兼容的问题,需要改个地方:
vim bin/flume-ng
使用netcat工具向本机的44444端口发送内容
nc localhost 44444
测试结果如下:
当然也可以实时监控单个追加文件,多个追加文件到HDFS等,这样就能把日志里的数据采集出来了。 不过flume-netcat-logger.conf里面的配置内容要改。 这些操作这里不演示了,具体可以参考其他的文章,这些东西等具体用到再研究。
好了,关于日志采集的两个工具也安装完毕, 下面再简单的整理一下master上安装anaconda环境并配置远程jupyter连接pyspark,还有redis的安装搭建过程, 有了这一套环境,就可以搞后面的推荐系统任务了, 还有最后一篇,继续Rush!