flink StreamingFileSink 读取kafka中的数据,流式地写入本地文件系统

StreamingFileSink 读取 Kafka 数据写入 HDFS(Parquet格式) Flink:1.8.2 Kafka:0.10.1 HADOOP:CDH-Hadoop 3.0.0 数据样例 910690,3118339,3189162,buy,1511682220 953517,2541156,3607361,fav,1511682220 227081,2145764,982926,pv,1511682220 777480,3566166,3645362,fav,1511682... 阅读详情

1. StreamingFileSink

  Flink有输出到文件的预实现方法:如 writeAsText()、writeAsCsv() 直接将输出结果保存到文本文件或 Csv 文件。但这种方式是不支持同时写入一份文件,Sink 操作并行度只能为 1,拖慢系统效率且无法保证故障恢复后的状态一致性,已被弃用
  对此,Flink 专门提供了一个流式文件系统的连接器:StreamingFileSink,它继承自抽象类RichSinkFunction,而且集成了 Flink 的检查点(checkpoint)机制,用来保证exactly once的一致性语义
在这里插入图片描述

  StreamingFileSink 主要操作是将数据写入桶(buckets),每个桶中的数据都可以分割成一个个大小有限的分区文件,这样一来就实现真正意义上的分布式文件存储

Sink that emits its input elements to files within buckets

  可以通过各种配置来控制“分桶”的操作;默认的分桶方式是基于时间的,每小时写入一个新的桶

In some scenarios, the open buckets are required to change based on time. In these cases, the user can specify a {@code bucketCheckInterval} (by default 1m) and the sink will check periodically and roll the part file if the specified rolling policy says so

  StreamingFileSink 支持行编码(Row-encoded)和批量编码(Bulk-encoded)格式StreamingFileSink 的静态方法:
(1) 行编码:StreamingFileSink.forRowFormat(basePath,rowEncoder)
(2) 批量编码:StreamingFileSink.forBulkFormat(basePath,bulkWriterFactory)


2. 代码示例

POJO对象

public class Event {
    public String user;
    public String url;
    public long timestamp;

    public Event() {
    }

    public Event(String user, String url, Long timestamp) {
        this.user = user;
        this.url = url;
        this.timestamp = timestamp;
    }

    @Override
    public int hashCode() {
        return super.hashCode();
    }

    public String getUser() {
        return user;
    }

    public void setUser(String user) {
        this.user = user;
    }

    public String getUrl() {
        return url;
    }

    public void setUrl(String url) {
        this.url = url;
    }

    public Long getTimestamp() {
        return timestamp;
    }

    public void setTimestamp(Long timestamp) {
        this.timestamp = timestamp;
    }

    @Override
    public String toString() {
        return "Event{" +
                "user='" + user + '\'' +
                ", url='" + url + '\'' +
                ", timestamp=" + new Timestamp(timestamp) +
                '}';
    }
}

读取kafka中的数据,写入本地文件系统:
步骤:
(1) 从kafka集群中,消费message
(2) flatMap扁平映射成自定义的Event对象,
(3) rescale 对数据进行重缩放分区后,设置滚动策略写入文本文件

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

        Properties properties = new Properties();
        properties.setProperty("bootstrap.servers", "192.168.42.102:9092,192.168.42.103:9092,192.168.42.104:9092");
        properties.setProperty("group.id", "consumer-group");
        properties.setProperty("key.deserializer",
                "org.apache.kafka.common.serialization.StringDeserializer");
        properties.setProperty("value.deserializer",
                "org.apache.kafka.common.serialization.StringDeserializer");
        properties.setProperty("auto.offset.reset", "latest");
        DataStreamSource<String> stream = env.addSource(new
                FlinkKafkaConsumer<String>(
                "clicks",
                new SimpleStringSchema(),
                properties
        )).setParallelism(2);

        SingleOutputStreamOperator<Event> flatMap = stream.flatMap(new FlatMapFunction<String, Event>() {
            @Override
            public void flatMap(String s, Collector<Event> collector) throws Exception {
                String[] split = s.split(",");
                collector.collect(new Event(split[0], split[1], Long.parseLong(split[2])));
            }
        });

        StreamingFileSink<Event> fileSink = StreamingFileSink.forRowFormat(new Path("./"), new SimpleStringEncoder<Event>("UTF-8"))                .withRollingPolicy(DefaultRollingPolicy.builder().withRolloverInterval(TimeUnit.MINUTES.toMillis(15)).withMaxPartSize(128 * 1024 * 1024).withInactivityInterval(TimeUnit.MINUTES.toMillis(5)).build())
                .build();
                
        flatMap.rescale().addSink(fileSink).setParallelism(4);

        env.execute();
    }
}

结果:

./kafka-console-producer.sh  --broker-list 192.168.42.102:9092,192.168.42.103:9092,192.168.42.104:9092 --topic clicks

在这里插入图片描述
查看文件
在这里插入图片描述
在这里插入图片描述

Flink 如何读取 kafka 数据后以 gzip 压缩格式写入hdfs? Flink官方提供了 StreamingFileSink 用来写行或者列式数据到 hdfs,官方提供了 Row-encoded 和 Bulk-encoded 的例子,并分别以 String 类型和 parquet 类型提供了示例。 https://ci.apache.org/projects/flink/flink-docs-release-1.9/dev/connectors/streamfil... 阅读详情

相关推荐

大数据Flink(四十八):扩展阅读 Streaming File Sink

当作业重新启动时,所有子任务的下一个PartFile索引将是max PartFile索引+ 1,其中max是指在所有子任务中对所有计算的索引最大值。需要注意的是,使用Bulk Encoding时,Filnk1.9版本的文件滚动就只能使用OnCheckpointRollingPolicy的策略,该策略在每次checkpoint时滚动part-file。这两种写入格式除了文件格式的不同,另外一个很重要的区别就是回滚策略的不同:创建行或批量编码的 Sink 时,我们需要指定存储桶的基本路径和数据的编码。

Lansonli(蓝深李)的博客 4384

Flink读取kafka数据并以parquet格式写入HDFS

大数据业务场景中,经常有一种场景:外部数据发送到kafka中,flink作为中间件消费kafka数据并进行业务处理;处理完成之后的数据可能还需要写入到数据库或者文件系统中,比如写入hdfs中;目前基于spark进行计算比较主流,需要读取hdfs上的数据,可以通过读取parquet:spark.read.parquet(path) 以下代码完成消费kafka数据,并以parquet格式写入hdfs...

咖啡的博客 5033

【Flink】Flink Streaming File Sink

1.概述 类似文章:【Flink】Flink StreamingFileSink 转载:Flink Streaming File Sink 2.背景 Flink 支持将流数据以文件形式存储到外部系统,典型使用场景是将数据写入Hive表所在 HDFS存储路径,通过Hive 做查询分析。随着Flink文件写入被业务广泛使用,暴露出很多问题,因此需要了解 Flink Streaming File sink 的实现逻辑。 3.案例 从Kafka消费JSON数据,转换为 UserInfo 实体类数据流,最终以Par.

九师兄 1870

Flink消费Kafka数据,写入HDFS - 使用 StreamingFileSink

一、应用场景: Flink 消费 Kafka 数据进行实时处理,并将结果写入 HDFS。 二、Streaming File Sink 由于流数据本身是无界的,所以,流数据将数据写入到分桶(bucket)中。默认使用基于系统时间(yyyy-MM-dd--HH)的分桶策略。在分桶中,又根据滚动策略,将输出拆分为 part 文件。 1、Flink 提供了两个分桶策略,分桶策略实现了 o...

magic_kid_2010的专栏 1万+

使用 Flink 将数据写入 CSV BucketingSink 的方法

在本文中,我们将讨论如何使用 Flink 将数据写入 CSV 文件,并将其保存到分桶的目录结构中。根据指定的时间格式和分桶策略,Flink 会自动创建和管理分桶的目录结构,并将文件保存在相应的分桶中。在运行期间,Flink 会自动创建和管理分桶的目录结构,并将文件按照指定的时间格式和命名策略进行分桶存储。编译并运行上述程序,Flink 将开始处理数据流并将结果写入 CSV 文件。通过上述步骤,你可以使用 Flink 将数据写入 CSV 文件,并以分桶的方式进行存储,以便更好地管理和组织数据。

PixelInk的博客 508

flink实战--StreamingFileSink使用大全

简介 Flink目前对于外部Exactly-Once写支持提供了两种的sink,一个是Kafka-Sink,另一个是Hdfs-Sink,这两种sink实现的Exactly-Once都是基于Flink checkpoint提供的hook来实现的两阶段提交模式来保证的,主要应用在实时数仓、topic拆分、基于小时分析处理等场景下。本篇将会介绍Streamin...

阿华田的博客 3427

Flink 读取Kafka写入Hive

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_34080571的博客 8120

flink实战--flinksql使用Streaming Sink将数据流写入文件系统

扫一扫加入大数据公众号和技术交流群,了解更多大数据技术,还有免费资料等你哦 Streaming Sink简介 Streaming Sink支持流的写操作,基于Flink的流文件接收器将数据写入文件。行编码格式是csv和json。批量编码的格式有parquet, orc和avro。极大的方便了我直接编写SQL,将流数据插入到非分区表中。如果是分区表,则可以配置分区相关的操作,本篇文章将详细介绍Streaming Sink相关的概念和使用方式。 滚动策略 ...

阿华田的博客 1712

通过源码分析Flink如何流式数据写入hive

前言 我们来从源码的角度深入分析一下。以便朋友们对flink流式数据写入hive有一个深入的了解,以及在出现问题的时候知道该怎么调试。 其实我们可以想一下这个工作大概是什么流程,首先要写入hive,我们首先要从hive的元数据里拿到相关的hive表的信息,比如存储的路径是哪里,以便往那个目录写数据,还有存储的格式是什么,orc还是parquet,这样我们需要调用对应的实现类来进行写入,其次这个表是否是分区表,写入数据是动态分区还是静态分区,这些都会根据场景的不同而选择不同的写入策略。 写入数据的时候肯定不会

weixin_39098944的博客 3903

linux中的sendmail发送邮件

linux下的sendmail发送邮件

无痕的博客 6432

实战!C#整合YOLO+Halcon做玻璃瓶口缺陷检测:裂纹识别+尺寸测量一步到位(附DLL交互代码)

AI擅长语义识别(裂纹、缺陷),传统机器视觉擅长精密测量(尺寸、位置),C#做整合层,才能满足工业生产的“精度+效率+稳定性”要求。这套方案不只是玻璃瓶检测能用,改改模型和测量逻辑,还能用到瓶盖缺陷检测、饮料瓶液位检测等场景。如果你们厂也有类似的质检痛点,评论区留个言,我帮你看看怎么调整算法参数。

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 871

Flink StreamingFileSink 文件到hdfs 文件一直处于inprogress状态无法生成正式文件

问题描述: 任务逻辑是通过实时读取Kafka数据,一分钟计算一次数据,并利用Flink StreamingFileSink将数据落地到HDFS文件中。为了应对大促剧增的数据量,对当前运行稳定的集群进行了扩容处理,任务重启后发现写入的hdfs文件一直处于inprogress状态无法滚动生成正式文件。 解决过程: 开始是猜想可能是并行度过多,导致产生大量临时文件,文件句柄太多,关闭耗时导致文件一直无法完成合并?将并行度调整到1,发现问题并没有解决。 又猜想是因为调整了checkpoint参数,禁用掉che

cullinans的博客 8406

史上最全!研究生科研必备科研工具(含AI科研工具),附使用说明和示例

这些工具在科研中的应用非常广泛,可以帮助研究生更高效地完成研究任务。为了更好地利用这些工具,建议深入学习它们的官方文档和教程,或者参加相关的工作坊和培训。

智能AI让学术科研更容易 3945

Flink源码分析之深度解读流式数据写入hive

其实我们可以想一下这个工作大概是什么流程,首先要写入hive,我们首先要从hive的元数据里拿到相关的hive表的信息,比如存储的路径是哪里,以便往那个目录写数据,还有存储的格式是什么,orc还是parquet,这样我们需要调用对应的实现类来进行写入,其次这个表是否是分区表,写入数据是动态分区还是静态分区,这些都会根据场景的不同而选择不同的写入策略。 写入数据的时候肯定不会把所有数据写入一个文件,那么文件的滚动策略是什么呢?写完了数据我们如何更新hive的元数据信息,以便我们可以及时读取到相应的数据呢?

公众号[大数据技术与应用实战],分享大数据实战案例 1905

matlab 质心重合法实现点云配准【2026最新版】

质心重合法是将源点云和目标点云的质心重合,以此缩小两点云集之间的平移误差,从而为下一步粗配准提供更好的初始位置姿态。

点云侠的博客 510

92. SAP ABAP 系统里长文本 Long Text 的设计和读取函数 READ_TEXT 的详细讲解

SAP ABAP中的长文本(Long Text)是指在SAP系统中存储和管理较长文本信息的一种机制。长文本通常用于存储描述性信息、注释、说明等,这些文本信息可能超过了标准数据库表字段的长度限制。 长文本的作用主要有以下几点: 1. 更多的信息存储:长文本允许您存储和显示比标准表字段允许的更多信息。例如,产品描述、用户注释、维护计划等可能需要大量的文本来详细描述。 2. 更好的可读性:长文本提供了更好的文本格式化选项,可以改善可读性。用户可以使用段落、列表、字体样式等格式化文本,以便更容易地理解和阅读。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 1999

Flink StreamingFileSink写入hdfs,文件一直处于inprogress

文件一直处于inprogress归根结底就是checkpoint不成功。使用StreamingFileSink 时需要启用 Checkpoint ,每次做 Checkpoint 时写入完成后,桶中临时文件转成正式文件。如果 Checkpoint 被禁用,部分文件(part file)将永远处于 ‘in-progress’ 或 ‘pending’ 状态,下游系统无法安全地读取。...

weixin_44378305的博客 6081

微信小程序 “net::ERR_CONNECTION_REFUSED” 报错大揭秘与破解之道

在微信小程序开发与运行过程中,“net::ERR_CONNECTION_REFUSED” 报错是开发者常遇难题。该错误意味着小程序与服务器连接建立失败,会导致功能无法使用、数据加载异常等问题,严重影响用户体验和业务运转。本文系统剖析此错误,从网络环境不佳、服务器异常、小程序配置有误等常见触发场景入手,提供网络、服务器、配置、代码等多维度排查步骤,给出针对性解决策略,如修复网络、处理服务器故障、修正配置与代码错误,还提出开发与运维阶段的预防措施,助力开发者高效解决该报错问题。

邓邓子的博客 6144

hive sql 怎么实现循环_Flink源码分析之深度解读流式数据写入hive

前言数据流处理hive基本信息获取流、批判断写入格式判断构造分区提交算子详解StreamingFileWriter简述StreamingFileSink分区信息提交提交分区算子分区提交触发器分区提交策略总结前言前段时间我们讲解了flink1.11中如何将流式数据写入文件系统和hive [flink 1.11 使用sql将流式数据写入hive],今天我们来从源码的角度深入分析一下。以便朋友...

weixin_36326053的博客 538

【数字IC设计】芯片设计中的RDC

在芯片设计中,RDC是的缩写,类似于CDC(clock domain crossing),由于现在SOC芯片是有很多ECUs组成,为了使整个系统能够快速从复位中恢复, 用户希望SOC里面每个ECU模块都可以有自己独立的异步复位信号,这样可以在出问题的时候只复位有错误逻辑的模块,而使其它模块保持正常工作。

qq_40268672的博客 2189

hive sql循环_Flink源码分析之深度解读流式数据写入hive

前言数据流处理详解StreamingFileWriter简述StreamingFileSink分区信息提交总结前言前段时间我们讲解了flink1.11中如何将流式数据写入文件系统和hive [flink 1.11 使用sql将流式数据写入hive],今天我们来从源码的角度深入分析一下。以便朋友们对flink流式数据写入hive有一个深入的了解,以及在出现问题的时候知道该怎么调试。其实我们可以想一下...

weixin_42134240的博客 310

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

flink消费kafka数据,生成parquet结构的数据写到hdfs

参考:

赶路人儿 6215

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

flink源码分析_Flink源码分析之深度解读流式数据写入hive

前言数据流处理hive基本信息获取流、批判断写入格式判断构造分区提交算子详解StreamingFileWriter简述StreamingFileSink分区信息提交提交分区算子分区提交触发器分区提交策略总结前言前段时间我们讲解了flink1.11中如何将流式数据写入文件系统和hive [flink 1.11 使用sql将流式数据写入hive],今天我们来从源码的角度深入分析一下。以便朋友...

weixin_39693438的博客 123

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

上一篇: flume 1.Agent (Source Sink Channel)
下一篇: Flink sink算子,kafka数据写入redis
但行益事莫问前程
但行益事莫问前程 新星创作者: 数据库技术领域 新星创作者: 数据库技术领域
博客等级 码龄7年 8490粉丝 225原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

但行益事莫问前程

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值