目录
2.创建 user_behavior-mem-hdfs.conf 文件
4.修改 user_behavior-mem-hdfs.conf 文件
4.查看 user_shopping_behavior.txt 文件
5.1切换到flume配置文件目录 /opt/server/flume/file
问题1:Hadoop中的 guava 版本和 Flume中的 guava 版本不一致
一、编辑配置文件
1.打开目录
在正式做flume数据迁移之前先检查flume是否配置完成、免密是否正常、防火墙是否关闭。打开flume下的file目录,没有file目录就自己创建一个。
cd /opt/server/flume/file/
2.创建 user_behavior-mem-hdfs.conf 文件
vim user_behavior-mem-hdfs.conf
3.打开Flume中文网
Flume 1.9用户手册中文版 — 可能是目前翻译最完整的版本了
3.1查找Exec Source
3.2查找Memory Channel
3.3查找HDFS Sink
4.修改 user_behavior-mem-hdfs.conf 文件
# 别名
a1.sources = r1
a1.channels = c1
a1.sinks = k1
# 编辑sources
a1.sources.r1.type = exec
a1.sources.r1.conmmand = tail -F /opt/data/user_shopping_behavior.txt
# 编辑channels
a1.channels.c1.type = menory
a1.channels.c1.capacity = 10000
a1.channels.c1.transactionCapacity = 10000
a1.channels.c1,byteCapacityBufferPercentage = 20
a1.channels.c1.byteCapacity = 800000
# 编辑sinks
a1.sinks.k1.type = hdfs
a1.sinks.k1.hdfs.path = /flume/events/%y-%m-%d
a1.sinks.k1.hdfs.filePrefixs = user-
a1.sinks.k1.hdfs.round = true
a1.sinks.k1.hdfs.roundValue =10
a1.sinks.k1.hdfs.roundUnit = mimute
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
这是一个Apache Flume配置文件示例,用于定义Flume数据传输流程。Flume是一个用于收集、传输和存储大量数据的分布式数据采集工具。这个配置文件的意义:
1. 别名部分:
- `a1.sources = r1`:定义了一个数据源(source)的别名为 `r1`。
- `a1.channels = c1`:定义了一个通道(channel)的别名为 `c1`。
- `a1.sinks = k1`:定义了一个数据汇(sink)的别名为 `k1`。
2. 编辑sources部分:
- `a1.sources.r1.type = exec`:指定了数据源 `r1` 的类型为 `exec`,表示它将执行一个外部命令来获取数据。
- `a1.sources.r1.command`:指定了执行的命令,这里是使用`tail`命令实时监控文件 `/opt/data/user_shopping_behavior.txt`。
3. 编辑channels部分:
- `a1.channels.c1.type = memory`:指定了通道 `c1` 的类型为 `memory`,表示数据将在内存中缓存。
- `a1.channels.c1.capacity`:指定通道的容量为10000,表示通道可以容纳的事件数量。
- `a1.channels.c1.transactionCapacity`:指定通道的事务容量为10000,表示一次事务中可以处理的事件数量。
- `a1.channels.c1.byteCapacityBufferPercentage`:指定通道的字节容量缓冲区百分比,这里为20%。
- `a1.channels.c1.byteCapacity`:指定通道的字节容量为800,000字节。
4. 编辑sinks部分:
- `a1.sinks.k1.type = hdfs`:指定了数据汇 `k1` 的类型为 `hdfs`,表示数据将被写入Hadoop分布式文件系统(HDFS)。
- 后续的配置项定义了写入HDFS的相关参数,包括写入路径、文件前缀、滚动策略等。
5. 编辑通道部分:
- `a1.sources.r1.channels = c1`:将数据源 `r1` 连接到通道 `c1`,表示从数据源获取的数据将通过通道传输到数据汇。
这个配置文件的意义是定义了一个Flume数据流程,从指定文件实时收集数据,并将数据写入HDFS中的特定路径。通道用于缓存数据,确保数据的可靠传输。根据这个配置,可以启动Flume代理来执行数据采集和传输任务。
二、执行程序完成数据迁移
1.另起hadoop节点,启动集群
2.查看进程
3.运行python文件
cd /opt/data/
python project1.py
project1.py文件:
# -*- coding: utf-8 -*-
import random
import io
# 定义一些示例数据
data = [
("韩会高", 39, "man", "cart", 46259),
("马和学", 49, "woman", "fav", "fav", 6651, 92065),
("孙郑慧", 34, "woman", "buy", "cart", "0808", 11125),
("马开新", 29, "woman", "fav", 5417),
("江建布", 48, "man", "fav", "fav", 3346, 305),
("刘欧风", 30, "man", "pv", 305)
]
# 生成数据并写入文件
with open("user_shopping_behavior.txt", "w") as file:
for item in data:
# 随机生成一些额外的数据(如果有多余的元素)
extra_data = [str(random.randint(10000, 99999)) for _ in range(len(item) - 5)]
# 将数据以特定格式写入文件
data_line = ",".join(map(str, item)) + "," + ",".join(extra_data) + "\n"
file.write(data_line)
print("数据生成完成并已保存到 user_shopping_behavior.txt 文件。")
# 显示生成的数据
with io.open("user_shopping_behavior.txt", "r", encoding="utf-8") as file:
for line in file:
print(line.strip()) # 显示每一行数据
生成 user_shopping_behavior.txt 文件
4.查看 user_shopping_behavior.txt 文件
cat user_shopping_behavior.txt
5.启动 flume 配置文件
5.1切换到flume配置文件目录 /opt/server/flume/file
/opt/server/flume/file
flume-ng agent -n a1 -c ../conf/ -f user_behavior-mem-hdfs.conf -Dflume.root.logger=INFO,console
5.2启动成功
6.查看HDFS文件
IP+端口
添加后缀名.txt
数据迁移完成。
遇到的问题
问题1:Hadoop中的 guava 版本和Flume中的 guava 版本不一致
(SinkRunner-PollingRunner-DefaultSinkProcessor) [ERROR - org.apache.flume.sink.hdfs.HDFSEventSink.process(HDFSEventSink.java:459)] process failed
java.lang.NoSuchMethodError: com.google.common.base.Preconditions.checkArgument(ZLjava/lang/String;Ljava/lang/Object;)V
Hadoop的guava-27.0-jre.jar,Flume的guava-11.0.2.jar:
解决方案:删除Flume的 guava ,把Hadoop的 guava 复制一份放在Flume处。
问题2:第二台和第三台没关闭防火墙
(Thread-9) [INFO - org.apache.hadoop.hdfs.DataStreamer.createBlockOutputStream(DataStreamer.java:1822)] Exception in createBlockOutputStream blk_1073741832_1008
java.io.IOException: Got error, status=ERROR, status message , ack with firstBadLink as 192.168.147.201:9866
1.查看第二台和第三台的防火墙状态
systemctl status firewalld
2.关闭集群
hadoop.sh stop
3.关闭防火墙
#关闭
systemctl stop firewalld.service
#查看
systemctl status firewalld.service
#防火墙失效设置
systemctl disable firewalld.service
重新启动集群、flume配置文件。