当使用Flink 获取HDFS上的文件作为表进行计算时报错 file not found。

Flink 定时获取HDFS 上某路径的parquet文件,并作为dim进行关联。

在进行Flink 开发的时候,使用的是Flink 1.13.2版本,当前版本对Flink SQL支持已经比较不错了,所以想用纯Flink SQL进行开发。

业务

消费Kafka 中的数据作为主表,获取HDFS路径上的某一个配置dim表进行关联然后输出到Kafka中。

SQL 实现

这里仅仅使用少量的sql做个演示,
创建主表SQL:

CREATE TABLE main_table (
    `length` int, `local_province` int, `local_city` int, `owner_province` int
    ,`event_time` TIMESTAMP(3) METADATA FROM 'timestamp'
    ,WATERMARK FOR event_time AS event_time
) WITH (
    'connector' = 'kafka',
    'property-version' = 'universal',
    'topic' = 'outTopicName',
    'properties.bootstrap.servers' = 'ip:9093,ip:9093',
    'properties.group.id' = 'ourGroupName',
    'format' = 'csv',
    'csv.field-delimiter' = '|',
    'csv.ignore-parse-errors' = 'true'
)
;

创建dim表SQL:

CREATE TABLE `cfg_city`(
    `provincecode` int, `city_id` int, `city_name` string, `province_name` string,
)
WITH (
    'connector'='filesystem',
    'path'='hdfspath://cfg_city',
    'format' = 'csv',
    'csv.field-delimiter' = ',',
    'csv.ignore-parse-errors' = 'true'
)
;

关联Join操作

select * from main_table inner join cfg_city;

如果需要插入到Kafka等操作的话,直接一样创建表就可。

问题

如果你跟我一样使用上述的filesystem作为connector的话,那么可能就会报错。
原因是:使用了SQL FileSystem 后 该任务会变成Bounded(一次性读取,不会更新),并且会有一个BUG,当path中的文件名称 发生改变后(如:新增的文件无法被获取,老的文件删除会直接报错),会扔出 file not found的问题。

报错的时机

如果Flink fail 根据重试次数retry 并且 path中的文件被更改了。

报错详细

在这里插入图片描述

社区回复

在 https://issues.apache.org/jira/browse/FLINK-24641中可以看到,该问题确实存在,且无法被规避。

解决

使用Flink SQL 的 FileSystem时都会遇到这个问题,当前SQL 是不支持这个操作的。
请使用 ParquetRowInputFormat 来进行读取。
也就是说必须写代码了,不过我写了个模板欢迎获取,在主页中 搜索以下内容

Flink 定时获取HDFS上某路径的parquet文件,并作为dim与Kafka中的主表进行关联。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值