您好,登录后才能下订单哦!
密码登录
登录注册
点击 登录注册 即表示同意《亿速云用户服务条款》
# Hive外部分区表加载Flume打到HDFS上文件读不到.tmp文件怎么办
## 问题背景
在使用Flume采集数据到HDFS,并通过Hive外部分区表进行查询的场景中,许多开发者会遇到一个典型问题:**Flume生成的.tmp临时文件无法被Hive识别**,导致查询结果为空或数据缺失。这种情况通常表现为:
1. HDFS上存在Flume生成的`.tmp`临时文件
2. Hive外部表分区已正确创建
3. 执行`SELECT`查询时返回空结果
4. 直接查看HDFS文件时发现数据实际存在
## 原因分析
### 1. Flume的HDFS Sink工作机制
Flume的HDFS Sink在写入数据时会经历三个阶段:
```text
1. 先写入临时文件(后缀.tmp)
2. 写入完成后重命名(去除.tmp后缀)
3. 达到条件后滚动生成新文件
当出现以下情况时,临时文件会残留: - Flume进程异常终止 - 文件正在写入过程中 - 滚动策略未触发重命名
Hive外部表默认会忽略以下文件:
- 以.
开头的隐藏文件
- 以_
开头的文件(如_SUCCESS)
- 以.tmp结尾的临时文件
在flume.conf中添加自动清理参数:
# 设置60秒后自动清理临时文件
hdfs.idleTimeout = 60
# 按时间滚动(单位秒)
hdfs.rollInterval = 3600
# 按大小滚动(单位字节)
hdfs.rollSize = 1073741824
# 按事件数滚动
hdfs.rollCount = 0
hdfs.inUsePrefix = _
hdfs.inUseSuffix = .tmp
hdfs.emptyInUseSuffix = true
hadoop fs -mv /user/flume/data/file1.tmp /user/flume/data/file1
import subprocess
def rename_tmp_files(hdfs_path):
cmd = f"hadoop fs -ls {hdfs_path} | grep .tmp"
files = subprocess.getoutput(cmd).split('\n')
for f in files:
src = f.split()[-1]
dst = src.replace('.tmp','')
subprocess.call(f"hadoop fs -mv {src} {dst}", shell=True)
ALTER TABLE ext_table SET TBLPROPERTIES (
'ignore.tmp.files'='false',
'ignore.underlying.tmp.files'='false'
);
CREATE EXTERNAL TABLE ext_table (
...
) PARTITIONED BY (...)
LOCATION '/user/flume/data'
TBLPROPERTIES (
'input.file.pattern'='^[^._].*[^.tmp]$'
);
# 启用监控端口
flume.monitoring.type = http
flume.monitoring.port = 34545
// 在拦截器中添加校验逻辑
public Event intercept(Event event) {
byte[] body = event.getBody();
if(body.length == 0) {
return null; // 丢弃空事件
}
return event;
}
CREATE EXTERNAL TABLE ext_table (
...
) STORED AS ORC
LOCATION '/user/flume/data'
TBLPROPERTIES (
'transactional'='true',
'orc.compress'='SNAPPY'
);
# 检查HDFS文件状态
hadoop fs -ls -R /user/flume/data
# 查看Hive表元数据
DESCRIBE FORMATTED ext_table;
# 检查分区信息
SHOW PARTITIONS ext_table;
Rolling file
当Hive外部表无法读取Flume生成的.tmp文件时,本质是数据写入流程与读取规范的匹配问题。最佳实践建议:
通过合理的配置和监控,可以确保大数据管道中数据从采集到查询的端到端可靠性。
注意:所有配置参数需根据实际集群环境和业务需求调整,建议先在测试环境验证。 “`
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。