目录
一、Flume
1.Flume的特点:
是一个分布式、可靠、和高可用的海量日志采集、汇聚和传输的系统。Flume针对特殊场景也具备良好的自定义扩展能力,因此,flume可以适用于大部分的日常数据采集场景
2、Flume能做什么?
Flume 是可以收集例如日志,事件等数据资源,并将这些数量庞大的数据从各项数据源中集中起来存储的工具/服务。
3、Flume的采集与存储
Flume可以采集文件,文件夹、kafka、mysql数据库等各种形式源数据,又可以将采集到的数据(下沉sink)输出到HDFS、hbase、hive、kafka等众多外部存储系统中。
4、Flume的三大组件
- Source:读取数据
- Channel:接收存储数据;写的方式:内容、文件
- Sink:读取存储数据;写的方式:打印到控制台、HDFS
5.flume官网连接 中文版
https://flume.liyifeng.org/#exec-source
二、安装Flume
(一)上传解压软件包
- 上传软件包:
cd /opt/softwares
- 解压软件包:
tar 命令 软件包名 -C 解压的路径
tar -xf apache-flume-1.9.0-bin.tar.gz -C /opt/modules/
- 设置软连接:(环境变量可以直接使用)
ln -s apache-flume-1.9.0-bin/ flume
(二)配置环境变量
- 路径:
vi /etc/profile
- 配置环境变量:
export FLUME_HOME=/opt/modules/flume
export PATH=$FLUME_HOME/bin:$PATH
- 更新环境变量:
source /etc/profile
- 更改配置文件:
cp flume-env.sh.template flume-env.sh
复制文件去更改,方便我们出错了可以找到原来的文件
- 添加 java 环境变量:
export JAVA_HOME=/opt/modules/jdk1.8.0_241
- 查看版本:
flume-ng version
三、测试Flume
(一)编辑Flume配置文件并启动
1.创建一个新的配置文件
vi nc-flume.conf
2.编辑配置文件
分别选择合适的组件 source、channel、sink
这里测试选择的是netcat 、内存、logger作为组件
#sink的别名
a1.sinks = k1
# 配置source的相关信息 数据源的 netcat 一个主机的一个端口的数据 指定主机 端口
a1.sources.r1.type = netcat
a1.sources.r1.bind = localhost
a1.sources.r1.port = 44444
# 配置channel-内存
a1.channels.c1.type =memory
# 配置sink-控制台打印
a1.sinks.k1.type=logger
# 绑定 source channel sink的对应关系
a1.sources.r1.channels = c1
a1.sinks.k1.channel = c1
3.启动配置文件
flume-ng agent -n a1 --conf-file nc-flume.conf -Dflume.root.logger=INFO,console
4.安装Telnet服务
另起节点!
yum install telnet -y
安装成功:
尝试连接
telnet localhost 44444
连接被拒绝!
5.问题解决:
(1)问题:
- Trying ::1...
telnet: connect to address ::1: Connection refused
Trying 127.0.0.1...
telnet: connect to address 127.0.0.1: Connection refused
(2)原因分析:
这是连接被拒接了,找不到端口
(3)解决方法:
检查配置文件:!
这里发现配置错了
正确的:
# source的别名
a1.sources = r1
# channel的别名
a1.channels = c1
#sink的别名
a1.sinks = k1
# 配置source的相关信息 数据源的 netcat 一个主机的一个端口的数据 指定主机 端口
a1.sources.r1.type = netcat
a1.sources.r1.bind = localhost
a1.sources.r1.port = 44444
# 配置channel-内存
a1.channels.c1.type =memory
# 配置sink-控制台打印
a1.sinks.k1.type=logger
# 绑定 source channel sink的对应关系
a1.sources.r1.channels = c1
a1.sinks.k1.channel = c1
修改后:
再次启动配置文件:
连接成功!!!这个很容易出现问题!!
四、编写数据迁移
尝试编写数据上传到Hdfs网页当中!
1.新建文件夹
2.创建配置文件
- 采用exec、file、hdfs组件去配置 从而上传文件到网页当中
- 指定生成文件的名字以及路径
#别名
a1.sources = r1
a1.channels = c1
a1.sinks = k1
#编辑sources
a1.sources.r1.type = exec
a1.sources.r1.command = tail -F /opt/data/students_info.txt
# 编辑 channels
a1.channels.c1.type = file
a1.channels.c1.checkpointDir = /opt/modules/flume/channels_checkpoints_file/checkpoint
a1.channels.c1.dataDirs = /opt/modules/flume/channels_check_file/data
#编辑sinks
a1.sinks.k1.type = hdfs
a1.sinks.k1.hdfs.path = /flume/events/%y-%m-%d
a1.sinks.k1.hdfs.filePrefix = user-
a1.sinks.k1.hdfs.round = true
a1.sinks.k1.hdfs.roundValue = 1
a1.sinks.k1.hdfs.roundUnit = minute
a1.sinks.k1.hdfs.rollInterval = 0
a1.sinks.k1.hdfs.rollSize = 0
a1.sinks.k1.hdfs.rollCount = 0
a1.sinks.k1.hdfs.useLocalTimeStamp = true
a1.sinks.k1.hdfs.fileType = DataStream
#编辑通道
a1.sources.r1.channels = c1
a1.sinks.k1.channel = c1
3.启动集群并查看进程
4.创建data文件目录,放入数据文件
mkdir data
5.写python文件
1)要求:
- 姓名为3个字且随机 姓名由1,2,3组成(每个字段19个字)
- 性别为男或者女
- 学号为3位(最小001,最大100)
- 年龄15-22岁
- 成绩有四个科目,最小60分,满分100分 (总成绩四个科目加起来)
- 写入日志文件
#!/usr/bin/python
# coding=UTF-8
import random
import time
# 姓名
nameArray1 = ["赵", "钱", "孙", "李", "周", "武", "郑", "王", "邓", "马", "杨", "韩", "苏", "江", "蒋", "钟", "刘",
"陈", "方", "曾"]
nameArray2 = ["明", "和", "建", "超", "洪", "空", "郑", "和", "九", "克", "向", "开", "会", "树", "佳", "普", "鹏",
"家", "欧", "飞"]
nameArray3 = ["慧", "科", "军", "学", "区", "非", "心", "新", "美", "布", "丽", "风", "平", "高", "楼", "机", "表",
"泥", "若", "俄"]
# 性别
sexArr = ["男", "女"]
# 定时(* * * * */1每秒1次)发送文件到students_info.txt文件中
def log():
name1 = nameArray1[random.randint(0, 19)]
name2 = nameArray2[random.randint(0, 19)]
name3 = nameArray3[random.randint(0, 19)]
name = name1 + name2 + name3
# # 学号
# student_id = str(random.randint(0, 100))
# 生成3位数的学号,从001开始,最大为100
student_id = str(random.randint(1, 100)).zfill(3)
# 年龄 (15-22)
age = random.randint(15, 22)
sex = sexArr[random.randint(0, 1)]
# 成绩
chinese_score = random.randint(60, 100)
math_score = random.randint(60, 100)
english_score = random.randint(60, 100)
computer_score = random.randint(60, 100)
total_score = chinese_score + math_score + english_score + computer_score
info = "{},{},{},{},{},{},{},{}".format(student_id, name, sex, chinese_score, math_score, english_score,
computer_score, total_score)
# info = f"{student_id},{name},{sex},{chinese_score},{math_score},{english_score},{computer_score},{total_score}"
print(info)
# 时间写入日志文件
with open('students_info.txt', 'a+') as student_log:
student_log.writelines(info)
student_log.writelines("\n")
while True:
log()
time.sleep(1) # 定时1s看一下
2)运行python文件
python student.py
3)查看生成文件
6.运行配置文件,上传网页
1)运行配置文件:
flume-ng agent -n a1 --conf-file 文件名 +打印到控制台(-Dflume.root.loggger=INFO,console)
flume-ng agent -n a1 --conf-file student-score_exec-file-hdfs.conf -Dflume.root.logger=INFO,console
2)查看是否运行成功
3)查看HDFS网页是否有文件
ip地址:9870
4)尝试下载文件
- 查看是否与虚拟机中的文件一致
- 点击下载
- 下载不了
5)解决问题
a)问题:
下载不了文件
b)原因分析:
可能是防火墙,映射的问题
c)解决问题:
- 查看防火墙状态:
systemctl status firewalld.service
已关闭
- 找到Windows的映射文件,设置映射
C:\Windows\System32\drivers\etc
因为这里面的文件不能更改,要拖到外面去更改
用记事本打开
添加映射
192.168.58.3 hadoop01
192.168.58.4 hadoop02
192.168.58.5 hadoop03
再把它移动回去
6)下载成功
五、文件处理
可以对这个文件进行图表分析以及后续的hive进行操作。