Hadoop Formats 在 Flink 里复用 Hadoop InputFormat(flink-hadoop-compatibility)

1、项目依赖配置

核心依赖是 Flink 的兼容模块:

xml 复制代码
<dependency>
  <groupId>org.apache.flink</groupId>
  <artifactId>flink-hadoop-compatibility</artifactId>
  <version>2.2.0</version>
</dependency>

如果你要在本地(IDE / MiniCluster)跑起来,通常还需要带上一个 Hadoop 客户端依赖(本地有 class 才能初始化 Hadoop 相关类):

xml 复制代码
<dependency>
  <groupId>org.apache.hadoop</groupId>
  <artifactId>hadoop-client</artifactId>
  <version>2.10.2</version>
  <scope>provided</scope>
</dependency>

实战建议:

  • 集群环境里 Hadoop 依赖往往由平台(YARN/HDFS)提供,你本地为了能跑通需要加 hadoop-client
  • 如果你是打 fat jar 跑 standalone/K8s,就要更谨慎处理 Hadoop 依赖冲突(常见是 guavajacksonnetty 版本冲突)。

2、两种包法:readHadoopFile vs createHadoopInput

Flink 通过 HadoopInputs 提供两种方式把 Hadoop InputFormat 包装成 Flink InputFormat:

  • readHadoopFile(...):用于 继承自 Hadoop 的 FileInputFormat 的场景(典型:读 HDFS 文件类格式)
  • createHadoopInput(...):用于 通用 InputFormat(不一定是文件类,例如某些外部系统的 InputFormat)

包装后的 Source 输出类型是一个二元组:Tuple2<K, V>

  • f0:key
  • f1:value

这点非常重要:你后续处理 DataStream 的时候,要把 key/value 拆开理解。

3、示例:使用 Hadoop 的 KeyValueTextInputFormat

下面示例演示如何把 Hadoop 的 KeyValueTextInputFormat 作为 Flink Source:

java 复制代码
import org.apache.flink.api.java.tuple.Tuple2;
import org.apache.flink.streaming.api.datastream.DataStream;
import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment;
import org.apache.flink.hadoopcompatibility.HadoopInputs;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapred.KeyValueTextInputFormat;

public class HadoopInputFormatDemo {

  public static void main(String[] args) throws Exception {
    StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();

    String textPath = "hdfs:///path/to/input";

    KeyValueTextInputFormat textInputFormat = new KeyValueTextInputFormat();

    DataStream<Tuple2<Text, Text>> input =
        env.createInput(
            HadoopInputs.readHadoopFile(
                textInputFormat,
                Text.class,
                Text.class,
                textPath));

    // 业务处理:把 Text 转成 String
    DataStream<String> lines = input.map(kv ->
        "key=" + kv.f0.toString() + ", value=" + kv.f1.toString()
    );

    lines.print();

    env.execute("hadoop-inputformat-demo");
  }
}

4、典型使用场景与坑位

常见适配场景:

  • 你要读一个历史遗留的 Hadoop InputFormat(比如某个自研存储、HBase/Hive 的某些格式、云厂商的 InputFormat)
  • 已经有成熟的 MR InputFormat + 配置参数(账号、表名、列族、分区等),直接复用最省时间

容易踩的坑:

  • 依赖冲突:Hadoop 生态依赖链很长,尤其本地 IDE 跑最容易爆 classpath 冲突
  • Key/Value 语义 :输出一定是 Tuple2<K,V>,不要直接当成一行文本
  • 配置注入:很多 InputFormat 依赖 Hadoop Configuration(账号、endpoint、table 等),你需要在创建 InputFormat 或 Job/Configuration 时把参数设全
  • 批/流差异:很多 Hadoop InputFormat 本质是"批式读取",更适合 BATCH runtime;如果你硬塞进 streaming job,它也只是周期性读一遍(不是增量监控)、
相关推荐
金融小师妹7 小时前
AI多模态宏观建模视角:超级央行周触发“政策—数据—预期”耦合重估框架
大数据·人工智能·逻辑回归·能源
FIN66687 小时前
底部蓄力,静待花开——清越科技的韧性与曙光
大数据·人工智能·物联网
半部论语7 小时前
CentOS7 + pyenv 安装 Python 3.11 完整指南)
大数据·elasticsearch·python3.11
Gofarlic_OMS7 小时前
UG/NX许可证管理高频技术问题解答汇编
java·大数据·运维·服务器·汇编·人工智能
AI周红伟7 小时前
周红伟:OpenClaw安全防控:OpenClaw+Skills+私有大模型安全部署、实操和企业应用实操
大数据·人工智能·深度学习·安全·copilot·openclaw
fan_music7 小时前
git使用教程
大数据·elasticsearch·搜索引擎
互联网推荐官7 小时前
上海物联网应用开发技术路径拆解:从协议选型到平台架构的工程实践
大数据·人工智能·软件工程
goyeer8 小时前
【ITIL】ITIL服务管理的四个维度
大数据·运维·信息化·自动运维·itil
珠海西格电力8 小时前
零碳园区管理系统“云-边-端”架构协同的价值及具体案例
大数据·数据库·人工智能·架构·能源
财迅通Ai8 小时前
星星科技:双主业协同增效,经营现金流增82.62%
大数据·科技·星星科技