编写Flume数据迁移文件

目录

一、编辑配置文件

1.打开目录

2.创建 user_behavior-mem-hdfs.conf 文件

3.打开Flume中文网

3.1查找Exec Source 

3.2查找Memory Channel

3.3查找HDFS Sink

4.修改 user_behavior-mem-hdfs.conf 文件

二、执行程序完成数据迁移

1.另起hadoop节点,启动集群

2.查看进程

3.运行python文件

4.查看 user_shopping_behavior.txt 文件

5.启动 flume 配置文件

5.1切换到flume配置文件目录 /opt/server/flume/file

5.2启动成功​编辑

6.查看HDFS文件

遇到的问题

问题1:Hadoop中的 guava 版本和 Flume中的 guava 版本不一致

问题2:第二台和第三台没关闭防火墙

1.查看第二台和第三台的防火墙状态

2.关闭集群

3.关闭防火墙


一、编辑配置文件

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配置文件。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: 要使用 Java 编写 Flume 采集数据到 MySQL,需要按照以下步骤进行: 1. 配置 Flume 的 agent 在 Flume 的 agent 配置文件中,需要指定 source、channel 和 sink,具体如下: ``` #定义 agent 名称和监听端口 agent1.sources = r1 agent1.channels = c1 agent1.sinks = k1 #配置 source agent1.sources.r1.type = netcat agent1.sources.r1.bind = localhost agent1.sources.r1.port = 44444 #配置 channel agent1.channels.c1.type = memory #配置 sink agent1.sinks.k1.type = org.apache.flume.sink.jdbc.JDBCSink agent1.sinks.k1.channel = c1 agent1.sinks.k1.driver = com.mysql.jdbc.Driver agent1.sinks.k1.url = jdbc:mysql://localhost:3306/testdb agent1.sinks.k1.username = root agent1.sinks.k1.password = root agent1.sinks.k1.batchSize = 100 agent1.sinks.k1.sqlDialect = MYSQL agent1.sinks.k1.table = test_table agent1.sinks.k1.channel = c1 ``` 其中,source 部分的配置需要根据具体情况进行修改,channel 部分使用 memory 类型即可,sink 部分的配置需要指定 MySQL 数据库的连接信息和表名。 2. 编写 Java 程序 编写 Java 程序,用于启动 Flume agent,代码如下: ``` import org.apache.flume.node.Application; public class FlumeApp { public static void main(String[] args) { //指定 Flume 配置文件路径 String confPath = "/path/to/flume/conf/flume-conf.properties"; //启动 Flume agent Application.main(new String[]{"agent", "-f", confPath, "-n", "agent1"}); } } ``` 其中,需要将 `confPath` 修改为实际的 Flume 配置文件路径。 3. 运行程序 运行 Java 程序即可启动 Flume agent,开始采集数据并写入 MySQL 数据库。 以上就是使用 Java 编写 Flume 采集数据到 MySQL 的基本步骤,希望能对你有所帮助。 ### 回答2: 要使用Java编写Flume来采集数据到MySQL,你可以按照以下步骤进行操作: 1. 首先,确保你已经在系统中安装了Java和Flume。如果没有安装,你可以在官方网站上下载并按照给定的说明进行安装。 2. 在你的Java代码中,导入Flume的相关包以便使用Flume的功能。这些包可以在Flume的安装目录中找到。 3. 创建Flume的配置文件,例如名为`flume.conf`。在配置文件中,你需要指定Flume的源和目的地。源可以是你要采集数据的来源,比如一个文件或者一个网络源。目的地则是MySQL数据库。你需要提供MySQL的连接信息,包括主机地址、端口号、数据库名、用户名和密码。 4. 在Java代码中,使用Flume的`FlumeConfiguration`类来读取并解析你的配置文件。 5. 创建一个Flume的`Event`对象,它用于包装你要采集的数据。将数据添加到`Event`对象中。 6. 使用`FlumeAgent`对象将`Event`对象发送到Flume代理。Flume会根据你的配置文件数据传送到MySQL数据库。 7. 在MySQL数据库中验证是否成功采集数据。 以下是一个简单的示例代码,用于将采集的数据发送到MySQL数据库: ```java import org.apache.flume.Event; import org.apache.flume.FlumeAgent; import org.apache.flume.FlumeConfiguration; public class FlumeToMySQL { public static void main(String[] args) { // 读取并解析配置文件 FlumeConfiguration configuration = new FlumeConfiguration("flume.conf"); // 创建Event对象,并添加数据 Event event = new Event(); event.addData("data", "Some data to be collected"); // 创建FlumeAgent对象,并发送Event对象 FlumeAgent agent = new FlumeAgent(configuration); agent.sendEvent(event); // 验证数据是否成功采集到MySQL数据库 // TODO: 添加验证数据库的代码 } } ``` 请注意,以上示例只是一个简单的框架,具体的实现可能需要根据你的需求进行调整。你需要根据实际情况修改配置文件和验证数据库的代码。同时,还需要确保你已经正确配置了Flume的相关参数,以确保Flume能够正确连接到MySQL数据库并将数据插入到正确的表中。 ### 回答3: 要用Java编写Flume来采集数据到MySQL,您可以按照以下步骤进行操作: 1. 首先,您需要在Java项目中引入Flume的依赖。您可以在项目的pom.xml文件中添加Flume的依赖项,以使其能够在您的项目中使用Flume的相关功能。 2. 接下来,您需要编写一个自定义的Flume拦截器。拦截器是用于过滤和处理采集到的数据的关键组件。您可以根据自己的需求编写一个扩展自Flume的AbstractInterceptor类的自定义拦截器,以实现数据处理的逻辑。 3. 在您的代码中,创建一个Flume的配置文件。这个配置文件将指定Flume从哪个源获取数据,并将数据发送到MySQL数据库中的哪个表。配置文件将包含必要的信息,如源类型、Flume Agent名称、自定义拦截器等。 4. 创建一个Flume Agent并启动它。在Java代码中,您可以通过Flume的Agent对象来实现这一步骤。通过Agent对象,您可以读取Flume配置文件并启动Flume Agent来通过拦截器将数据从源发送到目标。 5. 编写代码来连接到MySQL数据库并将数据插入到数据库表中。您可以使用Java的JDBC API与MySQL数据库建立连接,并使用SQL语句将采集到的数据插入到指定的表中。 6. 最后,您需要编译并执行您的Java代码。当代码执行时,Flume将从源获取数据并通过自定义拦截器将其发送到MySQL数据库中的指定表中。 需要注意的是,以上步骤是一个简单的指导,您可能会根据实际情况进行相应的调整和扩展。此外,Java编写Flume采集数据到MySQL还涉及到Flume的其他概念和组件,您可以通过官方文档或其他相关资源深入了解并应用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值