我想看看Flume

我想看看Flume

Flume 是什么

​ 在一个完整的离线大数据处理系统中,除了hdfs+mapreduce+hive组成分析系统的核心之外,还需要数据采集、结果数据导出、任务调度等不可或缺的辅助系统,而这些辅助工具在hadoop生态体系中都有便捷的开源框架。

  • Flume是Cloudera提供的一个高可用的,高可靠的,分布式的==海量日志采集、聚合和传输的系统==
  • Flume支持在日志系统中定制各类数据发送方,用于收集数据
  • Flume提供对数据进行简单处理,并**写到各种数据接受方(可定制)**的能力。

看看百度来的一张图:

Flume 架构

​ Flume的核心时把数据从数据源(Source)端收集过来,再发送到目的地中(Sink),而在发送到目的地前会先缓存数据,待数据真正的到达目的地后,删除自己缓存的数据。

  • Agent
    • Flume分布式系统中,最核心的角色
    • flume采集系统就是由一个个agent所连接形成
  • Souce
    • 采集组件,用于跟数据源对接,以获取数据
  • Channel
    • 传输通道组件,缓存数据,用于从source将数据传递到sink
  • Sink
    • 下沉组件,数据发送给最终存储系统或者下一级agent中
简单结构
  • 单个agent采集数据

在这里插入图片描述

复杂结构
  • 2个agent串联

在这里插入图片描述

  • 多个agent串联

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-QJX2uXqX-1590163129699)(我想看看Flume.assets/1590157952429.png)]

  • 多个channel

在这里插入图片描述

Flume 安装

安装比较简单,可以百度

Source 常见类型

Avro 类型的Source
  • 监听Avro 端口来接收外部avro客户端的事件流。avro-source接收到的是经过avro序列化后的数据,然后 反序列化数据继续传输。所以,如果是avro-source的话,源数据必须是经过avro序列化后的数据。利用 Avro source可以实现多级流动、扇出流、扇入流等效果
-- 下面的参数都是必须要绑定的
a1.sources = r1
a1.channels = c1
a1.sources.r1.type = avro
a1.sources.r1.channels = c1
a1.sources.r1.bind = 0.0.0.0
a1.sources.r1.port = 4141
Thrift Source
  • 监听Thrift端口并接收来自外部Thrift客户端流的事件。与另一个(以前的跃点)Flume代理上的内置ThriftSink配对时,它可以创建分层的集合拓扑。可通过启用kerberos身份验证将节俭源配置为以安全模式启动
a1.sources = r1
a1.channels = c1
a1.sources.r1.type = thrift
a1.sources.r1.channels = c1
a1.sources.r1.bind = 0.0.0.0
a1.sources.r1.port = 4141
Exec Source
  • Exec Source可通过tail -f命令去tail住一个文件,然后实时同步日志到sink。但存在的问题是,当agent进程挂掉重启后,会有重复消费的问题。可以通过增加UUID来解决,或通过改进ExecSource来解决。
a1.sources = r1
a1.channels = c1
a1.sources.r1.type = exec
a1.sources.r1.command = tail -F /var/log/secure
a1.sources.r1.channels = c1
----------------------------------
a1.sources.tailsource-1.type = exec
a1.sources.tailsource-1.shell = /bin/bash -c
a1.sources.tailsource-1.command = for i in /path/*.txt; do cat $i; done
Spooling Directory Source
  • 监视指定目录中的新文件,并在新文件出现时分析它们中的事件

  • 与Exec源不同,此源是可靠的,即使Flume重新启动或终止,也不会丢失数据

  • 监听一个目录,同步目录中的新文件到sink,被同步完的文件可被立即删除或被打上标记。适合用于同步新文件,但不适合对实时追加日志的文件进行监听并同步。如果需要实时监听追加内容的文件,可对SpoolDirectorySource进行改进。

  • 需要注意两点

    1)拷贝到spool目录下的文件不可以再打开编辑。

    1. spool目录下不可包含相应的子目录
a1.channels = ch-1
a1.sources = src-1

a1.sources.src-1.type = spooldir
a1.sources.src-1.channels = ch-1
a1.sources.src-1.spoolDir = /var/log/apache/flumeSpool
a1.sources.src-1.fileHeader = true
Taildir Source
  • Taildir Source可实时监控一批文件,并记录每个文件最新消费位置,agent进程重启后不会有重复消费的问题。 使用时建议用1.8.0版本的flume,1.8.0版本中解决了Taildir Source一个可能会丢数据的bug。
# source的名字
agent.sources = s1
# channels的名字
agent.channels = c1
# sink的名字
agent.sinks = r1

# 指定source使用的channel
agent.sources.s1.channels = c1
# 指定sink使用的channel
agent.sinks.r1.channel = c1

######## source相关配置 ########
# source类型
agent.sources.s1.type = TAILDIR
# 元数据位置
agent.sources.s1.positionFile = /Users/tempData/flume/taildir_position.json
# 监控的目录
agent.sources.s1.filegroups = f1
agent.sources.s1.filegroups.f1=/Users/tempData/flume/data/.*log
agent.sources.s1.fileHeader = true

######## channel相关配置 ########
# channel类型
agent.channels.c1.type = file
# 数据存放路径
agent.channels.c1.dataDirs = /Users/tempData/flume/filechannle/dataDirs
# 检查点路径
agent.channels.c1.checkpointDir = /Users/tempData/flume/filechannle/checkpointDir
# channel中最多缓存多少
agent.channels.c1.capacity = 1000
# channel一次最多吐给sink多少
agent.channels.c1.transactionCapacity = 100

######## sink相关配置 ########
# sink类型
agent.sinks.r1.type = org.apache.flume.sink.kafka.KafkaSink
# brokers地址
agent.sinks.r1.kafka.bootstrap.servers = localhost:9092
# topic
agent.sinks.r1.kafka.topic = testTopic3
# 压缩
agent.sinks.r1.kafka.producer.compression.type = snappy
Kafka Source
  • 用kafka 作为Source
指定多个topic
tier1.sources.source1.type = org.apache.flume.source.kafka.KafkaSource
tier1.sources.source1.channels = channel1
tier1.sources.source1.batchSize = 5000
tier1.sources.source1.batchDurationMillis = 2000
tier1.sources.source1.kafka.bootstrap.servers = localhost:9092
tier1.sources.source1.kafka.topics = test1, test2
tier1.sources.source1.kafka.consumer.group.id = custom.g.id
·正则表达式
tier1.sources.source1.type = org.apache.flume.source.kafka.KafkaSource
tier1.sources.source1.channels = channel1
tier1.sources.source1.kafka.bootstrap.servers = localhost:9092
tier1.sources.source1.kafka.topics.regex = ^topic[0-9]$
Custom Source
  • 用户自定义的source
a1.sources = r1
a1.channels = c1
a1.sources.r1.type = org.example.MySource
a1.sources.r1.channels = c1

Sink 常见类型

HDFS Sink
a1.channels = c1
a1.sinks = k1
a1.sinks.k1.type = hdfs
a1.sinks.k1.channel = c1
a1.sinks.k1.hdfs.path = /flume/events/%y-%m-%d/%H%M/%S
a1.sinks.k1.hdfs.filePrefix = events-
a1.sinks.k1.hdfs.round = true
a1.sinks.k1.hdfs.roundValue = 10
a1.sinks.k1.hdfs.roundUnit = minute
Hive Sink
create table weblogs ( id int , msg string )
    partitioned by (continent string, country string, time string)
    clustered by (id) into 5 buckets
    stored as orc;
    
a1.channels = c1
a1.channels.c1.type = memory
a1.sinks = k1
a1.sinks.k1.type = hive
a1.sinks.k1.channel = c1
a1.sinks.k1.hive.metastore = thrift://127.0.0.1:9083
a1.sinks.k1.hive.database = logsdb
a1.sinks.k1.hive.table = weblogs
a1.sinks.k1.hive.partition = asia,%{country},%y-%m-%d-%H-%M
a1.sinks.k1.useLocalTimeStamp = false
a1.sinks.k1.round = true
a1.sinks.k1.roundValue = 10
a1.sinks.k1.roundUnit = minute
a1.sinks.k1.serializer = DELIMITED
a1.sinks.k1.serializer.delimiter = "\t"
a1.sinks.k1.serializer.serdeSeparator = '\t'
a1.sinks.k1.serializer.fieldnames =id,,msg    
Logger Sink
  • 记录INFO级别的日志,一般用于调试
  • 注:要求必须在 --conf 参数指定的目录下有 log4j的配置文件,可以通过-Dflume.root.logger=INFO,console在命令启动时手动指定log4j参数
a1.channels = c1
a1.sinks = k1
a1.sinks.k1.type = logger
a1.sinks.k1.channel = c1
Avro Sink
a1.channels = c1
a1.sinks = k1
a1.sinks.k1.type = avro
a1.sinks.k1.channel = c1
a1.sinks.k1.hostname = 10.10.10.10
a1.sinks.k1.port = 4545
File Roll Sink
  • Stores events on the local filesystem
a1.channels = c1
a1.sinks = k1
a1.sinks.k1.type = file_roll
a1.sinks.k1.channel = c1
a1.sinks.k1.sink.directory = /var/log/flume
Null Sink
  • 丢弃它从通道接收的所有事件
a1.channels = c1
a1.sinks = k1
a1.sinks.k1.type = null
a1.sinks.k1.channel = c1
HBaseSinks
a1.channels = c1
a1.sinks = k1
a1.sinks.k1.type = hbase
a1.sinks.k1.table = foo_table
a1.sinks.k1.columnFamily = bar_cf
a1.sinks.k1.serializer = org.apache.flume.sink.hbase.RegexHbaseEventSerializer
a1.sinks.k1.channel = c1
HBase2Sink

​ HBase2Sink is the equivalent of HBaseSink for HBase version 2

a1.channels = c1
a1.sinks = k1
a1.sinks.k1.type = hbase2
a1.sinks.k1.table = foo_table
a1.sinks.k1.columnFamily = bar_cf
a1.sinks.k1.serializer = org.apache.flume.sink.hbase2.RegexHBase2EventSerializer
a1.sinks.k1.channel = c1
AsyncHBaseSink

This sink writes data to HBase using an asynchronous model

a1.channels = c1
a1.sinks = k1
a1.sinks.k1.type = asynchbase
a1.sinks.k1.table = foo_table
a1.sinks.k1.columnFamily = bar_cf
a1.sinks.k1.serializer = org.apache.flume.sink.hbase.SimpleAsyncHbaseEventSerializer
a1.sinks.k1.channel = c1
ElasticSearchSink
a1.channels = c1
a1.sinks = k1
a1.sinks.k1.type = elasticsearch
a1.sinks.k1.hostNames = 127.0.0.1:9200,127.0.0.2:9300
a1.sinks.k1.indexName = foo_index
a1.sinks.k1.indexType = bar_type
a1.sinks.k1.clusterName = foobar_cluster
a1.sinks.k1.batchSize = 500
a1.sinks.k1.ttl = 5d
a1.sinks.k1.serializer = org.apache.flume.sink.elasticsearch.ElasticSearchDynamicSerializer
a1.sinks.k1.channel = c1
Kafka Sink
  • 注:是flume sink 往kafka分区发送的规则是按照 header.hashcode/partitionNum 算的,而不是kafka的分区是这个规则
a1.sinks.k1.channel = c1
a1.sinks.k1.type = org.apache.flume.sink.kafka.KafkaSink
a1.sinks.k1.kafka.topic = mytopic
a1.sinks.k1.kafka.bootstrap.servers = localhost:9092
a1.sinks.k1.kafka.flumeBatchSize = 20
a1.sinks.k1.kafka.producer.acks = 1
a1.sinks.k1.kafka.producer.linger.ms = 1
a1.sinks.k1.kafka.producer.compression.type = snappy
Custom Sink
a1.channels = c1
a1.sinks = k1
a1.sinks.k1.type = org.example.MySink
a1.sinks.k1.channel = c1

Channels 常见类型

Memory Channel
a1.channels = c1
a1.channels.c1.type = memory
a1.channels.c1.capacity = 10000
a1.channels.c1.transactionCapacity = 10000
a1.channels.c1.byteCapacityBufferPercentage = 20
a1.channels.c1.byteCapacity = 800000
JDBC Channel
a1.channels = c1
a1.channels.c1.type = jdbc

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dCi9oUGc-1590163129702)(我想看看Flume.assets/1590162031609.png)]

Kafka Channel
  • 事件存储在Kafka集群中(必须单独安装)
a1.channels.channel1.type = org.apache.flume.channel.kafka.KafkaChannel
a1.channels.channel1.kafka.bootstrap.servers = kafka-1:9092,kafka-2:9092,kafka-3:9092
a1.channels.channel1.kafka.topic = channel1
a1.channels.channel1.kafka.consumer.group.id = flume-consumer
File Channel
a1.channels = c1
a1.channels.c1.type = file
a1.channels.c1.checkpointDir = /mnt/flume/checkpoint
a1.channels.c1.dataDirs = /mnt/flume/data
Spillable Memory Channel

​ The events are stored in an in-memory queue and on disk.

a1.channels = c1
a1.channels.c1.type = SPILLABLEMEMORY
a1.channels.c1.memoryCapacity = 10000
a1.channels.c1.overflowCapacity = 1000000
a1.channels.c1.byteCapacity = 800000
a1.channels.c1.checkpointDir = /mnt/flume/checkpoint
a1.channels.c1.dataDirs = /mnt/flume/data
Custom Channel
a1.channels = c1
a1.channels.c1.type = org.example.MyChannel

Flume Channel Selectors&Multiplexing Channel Selector

If the type is not specified, then defaults to “replicating”.

– Replicating 会将source过来的events发往所有channel,而Multiplexing 可以选择该发往哪些channel

a1.sources = r1
a1.channels = c1 c2 c3
a1.sources.r1.selector.type = replicating
a1.sources.r1.channels = c1 c2 c3
a1.sources.r1.selector.optional = c3
-----------------------
a1.sources = r1
a1.channels = c1 c2 c3 c4
a1.sources.r1.selector.type = multiplexing
a1.sources.r1.selector.header = state
a1.sources.r1.selector.mapping.CZ = c1
a1.sources.r1.selector.mapping.US = c2 c3
a1.sources.r1.selector.default = c4
Custom Channel Selector
a1.sources = r1
a1.channels = c1
a1.sources.r1.selector.type = org.example.MyChannelSelector

其实都是从官网上截取过来的,大家可以多逛逛官网

常见问题

Flume组成,Put事务,Take事务
put事务步骤:

doput :先将批数据写入临时缓冲区putlist里面
docommit:去检查channel里面有没有空位置,如果有就传入数据,如果没有那么dorollback就把数据回滚到putlist里面。

take事务步骤:

dotake:将数据读取到临时缓冲区takelist,并将数据传到hdfs上。
docommit :去判断数据发送是否成功,若成功那么清除临时缓冲区takelist
若不成功(比如hdfs系统服务器崩溃等)那么dorollback将数据回滚到channel里面。

  • Taildir Source:断点续传、多目录。Flume1.6以前需要自己自定义Source记录每次读取文件位置,实现断点续传。
  • File Channel:数据存储在磁盘,宕机数据可以保存。但是传输速率慢。适合对数据传输可靠性要求高的场景,比如,金融行业。
  • Memory Channel:数据存储在内存中,宕机数据丢失。传输速率快。适合对数据传输可靠性要求不高的场景,比如,普通的日志数据。
  • Kafka Channel:减少了Flume的Sink阶段,提高了传输效率。
  • Source到Channel是Put事务
  • Channel到Sink是Take事务
Flume采集数据会丢失吗?(防止数据丢失的机制)
  • 不会,Channel存储可以存储在File中,数据传输自身有事务。
Flume内存
  • 开发中在flume-env.sh中设置JVM heap为4G或更高,部署在单独的服务器上(4核8线程16G内存)
  • -Xmx与-Xms最好设置一致,减少内存抖动带来的性能影响,如果设置不一致容易导致频繁fullgc。Xms表示JVM Heap(堆内存)最小尺寸,初始分配;-Xmx 表示JVM Heap(堆内存)最大允许的尺寸,按需分配。如果不设置一致,容易在初始化时,由于内存不够,频繁触发fullgc。
FileChannel优化
  • 通过配置dataDirs指向多个路径,每个路径对应不同的硬盘,增大Flume吞吐量
  • checkpointDir和backupCheckpointDir也尽量配置在不同硬盘对应的目录中,保证checkpoint坏掉后,可以快速使用backupCheckpointDir恢复数据
Flume Channel容量
  • File channel 容量1000000条
  • Memory channel 容量 100条
HDFS Sink小文件处理
  • 官方默认的这三个参数配置写入HDFS后会产生小文件,hdfs.rollInterval、hdfs.rollSize、hdfs.rollCount
    • hdfs.rollInterval=3600,hdfs.rollSize=134217728,hdfs.rollCount =0,hdfs.roundValue=3600,hdfs.roundUnit= second几个参数综合作用,效果如下
      • tmp文件在达到128M时会滚动生成正式文件
        始化时,由于内存不够,频繁触发fullgc。
FileChannel优化
  • 通过配置dataDirs指向多个路径,每个路径对应不同的硬盘,增大Flume吞吐量
  • checkpointDir和backupCheckpointDir也尽量配置在不同硬盘对应的目录中,保证checkpoint坏掉后,可以快速使用backupCheckpointDir恢复数据
Flume Channel容量
  • File channel 容量1000000条
  • Memory channel 容量 100条
HDFS Sink小文件处理
  • 官方默认的这三个参数配置写入HDFS后会产生小文件,hdfs.rollInterval、hdfs.rollSize、hdfs.rollCount
    • hdfs.rollInterval=3600,hdfs.rollSize=134217728,hdfs.rollCount =0,hdfs.roundValue=3600,hdfs.roundUnit= second几个参数综合作用,效果如下
      • tmp文件在达到128M时会滚动生成正式文件
      • tmp文件创建超3600秒时会滚动生成正式文件
<think>我们正在解决用户的问题:使用 `hdfs dfs -ls /tmp/flume` 命令看不到 Flume 相关文件信息的原因及解决办法。 根据之前的上下文,用户提到了Flume将文件从本地目录(如/var/log/hdfstest/)读取并上传到HDFS,但在HDFS的/tmp/flume目录下没有看到文件。 可能的原因: 1. Flume配置中指定的HDFS路径不是/tmp/flume,而是其他路径。 2. Flume运行失败,没有成功上传文件。 3. 文件上传的路径在HDFS上不在/tmp/flume,而是在用户目录下(如/user/用户名)或其他自定义路径。 4. Flume Agent没有正确启动,或者配置文件有误。 5. HDFS的/tmp/flume目录权限问题,导致Flume无法写入。 解决方法: 1. 检查Flume配置文件(尤其是HDFS Sink的hdfs.path配置项): - 确认hdfs.path的值是否为hdfs://namenode:port/tmp/flume - 注意:namenode和port需要替换为实际的地址和端口。 2. 检查Flume日志,确认是否有上传文件到HDFS的记录,以及是否有错误信息。 3. 检查HDFS上其他可能存放Flume数据的目录,特别是用户目录(如/user/flume或运行Flume的用户的主目录): - 使用命令:`hdfs dfs -ls /user/<username>`(其中<username>是运行Flume的用户,如hadoop、flume等) 4. 检查HDFS的/tmp/flume目录是否存在以及权限: - 使用命令:`hdfs dfs -ls /tmp` 查看/tmp目录下是否有flume子目录。 - 如果没有,可以手动创建并赋予写权限(注意:需要确保Flume运行的用户有写权限): ```bash hdfs dfs -mkdir -p /tmp/flume hdfs dfs -chmod 1777 /tmp/flume # 或者根据实际情况设置权限 ``` - 检查目录权限:`hdfs dfs -ls /tmp` 查看flume目录的权限。 5. 检查Flume Agent是否运行以及配置是否正确: - 确认Flume Agent启动命令中指定的配置文件路径正确。 - 配置文件中,source、channel、sink的配置正确,并且sink的channel与channel配置一致。 6. 检查网络连接:确保Flume能够连接到HDFS的NameNode和DataNode。 7. 模拟数据生成,观察Flume日志: - 按照用户之前的需求,模拟日志产生(如向/opt/module/datas/flume_tmp.log追加内容),然后查看Flume日志是否有上传记录。 8. 如果HDFS是HA模式,需要配置hdfs-site.xml中的nameservice,并在Flume配置中正确指定hdfs.path(使用nameservice的地址)。 根据引用[2]可知,HDFS的默认用户目录是/user/用户名,所以如果Flume配置中hdfs.path使用了相对路径(如`hdfs.path = /flume`),则文件可能被写入到`/user/flume/flume`这样的路径下(具体用户取决于运行Flume的用户)。建议在配置中使用绝对路径。 因此,用户应该检查Flume配置文件中的hdfs.path设置,并确保该路径在HDFS上存在且可写。 操作步骤示例: 步骤1:查看Flume配置文件(比如flume-conf.properties)中的hdfs.path配置项: hdfs.path = hdfs://mycluster/tmp/flume # 示例 步骤2:如果配置正确,检查HDFS上该路径是否存在: hdfs dfs -ls hdfs://mycluster/tmp/flume 步骤3:如果不存在,则创建(注意:mycluster是nameservice,根据实际情况替换): hdfs dfs -mkdir -p hdfs://mycluster/tmp/flume hdfs dfs -chown flume:supergroup hdfs://mycluster/tmp/flume # 根据实际用户和组修改 hdfs dfs -chmod 1777 hdfs://mycluster/tmp/flume 步骤4:重启Flume Agent,并监控日志。 如果用户仍然无法看到文件,请查看Flume日志中是否有权限错误或连接错误。 注意:在HDFS中,/tmp目录默认对所有用户开放,但是新建的flume目录可能需要设置权限。 最后,用户还可以检查Flume的HDFS Sink是否配置了文件前缀或滚动策略,导致文件名不符合预期。 生成相关问题: 1. 如何配置Flume将数据写入HDFS? 2. 如何检查Flume是否正确上传文件到HDFS? 3. 如何解决Flume写入HDFS时的权限问题? 4. Flume的HDFS Sink配置参数有哪些? </think>### 使用 `hdfs dfs -ls /tmp/flume` 看不到 Flume 文件的原因及解决方法 #### 📌 核心问题定位 在 Flume 数据采集流程中,当执行 `hdfs dfs -ls /tmp/flume` 看不到文件时,通常说明数据未成功写入 HDFS 或路径配置错误。以下是根本原因: 1. **HDFS Sink 路径配置错误** Flume 配置文件中的 `hdfs.path` 参数指定了 HDFS 写入路径。若配置为相对路径(如 `hdfs.path = flume`),实际路径会是 **`/user/${username}/flume`**(引用[2])。 **验证方法**: ```bash hdfs dfs -ls /user/$(whoami)/flume # 检查用户目录 ``` 2. **HDFS 目录权限问题** Flume 进程用户可能无 `/tmp/flume` 目录的写权限,触发错误: ```log org.apache.hadoop.security.AccessControlException: Permission denied ``` **权限检查**: ```bash hdfs dfs -ls -d /tmp/flume # 查看目录权限 ``` 3. **Flume 未成功启动** Agent 未运行或配置错误会导致数据未被采集: ```bash ps aux | grep flume-ng # 检查进程状态 ``` 4. **HDFS 集群连接故障** NameNode 不可达或网络问题导致写入失败,需检查: - `hdfs.path` 中的 NameNode 地址(如 `hdfs://namenode:8020/tmp/flume`) - 网络连通性 --- #### 🛠️ **解决方案** ##### 步骤 1:修正 HDFS Sink 配置 在 Flume 配置文件(如 `flume-conf.properties`)中明确指定 **绝对路径**: ```properties agent.sinks.hdfs_sink.hdfs.path = hdfs://namenode:8020/tmp/flume ``` > ✅ **关键点**: > - 使用完整 URI `hdfs://<namenode>:<port>/path` > - 端口默认为 `8020`(HDFS 内部通信端口) ##### 步骤 2:修复 HDFS 目录权限 ```bash # 创建目录并赋权 hdfs dfs -mkdir -p /tmp/flume hdfs dfs -chmod 1777 /tmp/flume # 开放写权限 hdfs dfs -chown flume:supergroup /tmp/flume # 指定Flume用户 ``` ##### 步骤 3:验证 Flume 状态 ```bash # 检查Flume进程 jps | grep Application # 查看Flume日志(关键错误) tail -f /var/log/flume/flume.log ``` 需确认日志包含: ```log hdfs.HDFSEventSink: Writing to HDFS: hdfs://namenode:8020/tmp/flume ``` ##### 步骤 4:测试数据管道 1. 生成测试数据: ```bash echo "test_data" >> /opt/module/datas/flume_tmp.log # 引用[1] ``` 2. 检查 HDFS 文件: ```bash hdfs dfs -ls /tmp/flume/* ``` --- #### 🔍 **排查流程图** ```mermaid graph TD A[看不到/tmp/flume文件] --> B{检查Flume配置} B -->|hdfs.path 路径错误| C[修改为绝对路径] B -->|权限问题| D[chmod/chown修复] A --> E{检查Flume状态} E -->|进程未运行| F[重启Agent] E -->|连接失败| G[验证网络/HDFS健康] A --> H{检查数据源} H -->|文件未更新| I[模拟数据生成] ``` #### 💡 经验提示 > - Flume 默认使用 **系统当前用户** 写入 HDFS(如 `hadoop` 用户)[^2] > - 临时目录 `/tmp` 在 HDFS 重启时可能被清空,建议用持久目录(如 `/flume_data`) ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值