Hive外部分区表加载flume打到hdfs上文件读不到.tmp文件怎么办

发布时间:2021-12-09 11:10:52 作者:小新
来源:亿速云 阅读:389
# 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进程异常终止 - 文件正在写入过程中 - 滚动策略未触发重命名

2. Hive的外部表读取机制

Hive外部表默认会忽略以下文件: - 以.开头的隐藏文件 - 以_开头的文件(如_SUCCESS) - 以.tmp结尾的临时文件

解决方案

方案一:修改Flume配置(推荐)

1. 配置自动清理临时文件

在flume.conf中添加自动清理参数:

# 设置60秒后自动清理临时文件
hdfs.idleTimeout = 60

2. 调整文件滚动策略

# 按时间滚动(单位秒)
hdfs.rollInterval = 3600
# 按大小滚动(单位字节)
hdfs.rollSize = 1073741824
# 按事件数滚动
hdfs.rollCount = 0

3. 启用写入完成标记

hdfs.inUsePrefix = _
hdfs.inUseSuffix = .tmp
hdfs.emptyInUseSuffix = true

方案二:手动处理临时文件

1. 使用HDFS命令重命名文件

hadoop fs -mv /user/flume/data/file1.tmp /user/flume/data/file1

2. 批量处理脚本示例

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)

方案三:修改Hive表属性

1. 添加忽略文件排除规则

ALTER TABLE ext_table SET TBLPROPERTIES (
    'ignore.tmp.files'='false',
    'ignore.underlying.tmp.files'='false'
);

2. 使用正则表达式指定文件模式

CREATE EXTERNAL TABLE ext_table (
    ...
) PARTITIONED BY (...)
LOCATION '/user/flume/data'
TBLPROPERTIES (
    'input.file.pattern'='^[^._].*[^.tmp]$'
);

预防措施

1. Flume监控配置

# 启用监控端口
flume.monitoring.type = http
flume.monitoring.port = 34545

2. 增加HDFS写入校验

// 在拦截器中添加校验逻辑
public Event intercept(Event event) {
    byte[] body = event.getBody();
    if(body.length == 0) {
        return null; // 丢弃空事件
    }
    return event;
}

3. 使用Hive ACID特性(Hive 3.0+)

CREATE EXTERNAL TABLE ext_table (
    ...
) STORED AS ORC
LOCATION '/user/flume/data'
TBLPROPERTIES (
    'transactional'='true',
    'orc.compress'='SNAPPY'
);

排查工具

1. 诊断命令集

# 检查HDFS文件状态
hadoop fs -ls -R /user/flume/data

# 查看Hive表元数据
DESCRIBE FORMATTED ext_table;

# 检查分区信息
SHOW PARTITIONS ext_table;

2. 日志分析要点

总结

当Hive外部表无法读取Flume生成的.tmp文件时,本质是数据写入流程与读取规范的匹配问题。最佳实践建议:

  1. 生产环境优先采用方案一:通过Flume配置确保文件正常关闭
  2. 紧急处理使用方案二:手动重命名后立即修复数据管道
  3. 长期解决方案结合方案三:完善表属性和监控体系

通过合理的配置和监控,可以确保大数据管道中数据从采集到查询的端到端可靠性。

注意:所有配置参数需根据实际集群环境和业务需求调整,建议先在测试环境验证。 “`

推荐阅读:
  1. spark-local 模式 提示 /tmp/hive hdfs 权限不够的问题
  2. linux中tmp文件如何恢复

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

hive flume hdfs

上一篇:Linux系统运行级别是怎样的

下一篇:如何使用JS操作文件

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》