- 博客(67)
- 资源 (6)
- 收藏
- 关注
原创 Flink实战之自定义UDF
一般flink sql平台化都会提供自定义udf的支持,用户通过平台上传udf jar,然后在sql中通过create function语法创建函数,并在DML中使用该udf。主要包括以下几个核心功能:平台支持用户上传udf jar,后台可以选择使用hdfs或oss来存储jar包通过http将jar包路径作为参数传递到gateway服务解析参数下载jar,并通过classloader加载jarsql中通过create function语法创建函数dml中使用函数以上步骤中最重要的就是如何通过
2021-06-01 00:10:16 1785 2
原创 Iceberg实战之小文件合并
Flink版本:代码Spark版本:代码Spark的api功能相对更加丰富一些,现在用spark版本的更合适一些。详细flink的api也会尽快跟进的。
2021-04-02 15:40:38 1685
原创 Flink实战之MysqlCDC To Iceberg
网上找了一圈没找到一个mysql to Iceberg的实践案例,总结下这几天的踩坑心血历程,希望能提供一些帮助。现状目前Iceberg 0.11版本只支持CDC streaming写入,sql 写入以及CDC 读取都是不支持的。mysql binlog的读取有现成的Connector可用,参考 flink-cdc-connectors。不错demo里面只提供了String的序列化方式,Iceberg需要接受RowData的数据格式。踩坑记录java.lang.ClassCastExcept
2021-03-15 16:00:22 1857 3
原创 MAC docker打包镜像并推送到仓库
在学《Kubernetes in Action》,有关如何使用docker运行镜像和打包自己的镜像并推送到docker hub仓库,这里做个笔记,万一以后用到。以下命令都出自书中。我是在MAC上实操的,步骤如下:创建一个目录作为根目录mkdir image在目录下创建app.js文件,内容如下const http = require('http');const os = require('os');console.log("Kubia server starting...");
2021-02-19 16:40:26 1487
原创 Flink源码阅读之JDBC Connector
JDBC connector的入口JdbcDynamicTableFactory,提供了source和sink的支持,详细内容参考官网。Source在Factory类中通过createDynamicTableSource来创建JdbcDynamicTableSource,并将需要的所有参数传递过去。jdbc作为source有两种用途:1.数据源使用Scan 2.维表关联使用Lookup。Scan通过JdbcRowDataInputFormat来实现数据读取,同时支持了列裁剪,limit下推。注意
2021-02-18 16:56:53 1862 1
原创 Flink源码阅读之SPI在Flink中的应用
SPISPI是Service Provider Interface的缩写,是“基于接口的编程+策略模式+配置文件”组合实现的动态加载机制。有关SPI的详细内容请自行百度,这里不赘述。使用SPI需要遵循的规范:当服务提供者提供了接口的一种具体实现后,在jar包的META-INF/services目录下创建一个以“接口全限定名”为命名的文件,内容为实现类的全限定名;接口实现类所在的jar包放在主程序的classpath中;主程序通过java.util.ServiceLoder动态装载实现模块,它通过
2021-02-10 15:30:18 855 2
原创 Flink源码阅读系列之Kafka Connector
本文基于Flink 1.12版本,目前这个版本已经不需要再指定具体的kafka版本了。本文从Sql角度分析一下,创建一个kafka的table之后,flink是如何从kafka中读写数据的。入口依然是通过SPI机制找到kafka的factory(KafkaDynamicTableFactory),Flink中大量使用了SPI机制,有时间再整理一篇SPI在Flink中的应用。话不多说,进入正题。Source通过createDynamicTableSource方法创建 kafka source,这里主
2021-02-08 17:57:27 791
原创 Flink实战之Parquet写复杂类型
上一篇Flink实战之Parquet支持读复杂类型说了如何扩展读复杂类型,本篇作为其姊妹篇介绍下如何扩展写复杂类型。现状StreamingFileSink在写parquet文件时,通过ParquetWriteSupport中的ParquetRowDataWriter来写的,在writersupport中会将Flink内部的 rowType类型转换为Parquet识别的MessageTypeprivate MessageType schema = convertToParquetMessageType
2021-02-03 11:31:36 1237
原创 java.io.IOException: Got error, status message , ack with firstBadLink
写HDFS任务时不时发送Checkpoint超时,查看了日志发下如下异常:location:org.apache.hadoop.hdfs.DFSOutputStream$DataStreamer.createBlockOutputStream(DFSOutputStream.java:1495)throwable:java.io.IOException: Got error, status message , ack with firstBadLink as ip:portat org.apache.
2021-01-10 00:10:37 1385 1
原创 org.apache.kafka.clients.consumer.CommitFailedException
最近遇到一个kafka分区提异常如下:throwable:org.apache.flink.kafka.shaded.org.apache.kafka.clients.consumer.CommitFailedException: Commit cannot be completed since the group has already rebalanced and assigned the partitions to another member. This means that the time b
2020-12-26 00:54:12 1544
原创 Flink实战之Parquet支持读复杂类型
背景前面写过几篇关于flink入库的文章,但是还有个通点一直未解决,那就是小文件问题。好在1.12版本已经支持了小文件合并,但是在使用时发现问题了,parquet居然不支持读复杂类型,这就有点蛋疼了。那么我们就来尝试解决他。1.11现状使用parquet读filesystem依赖于ParquetFileSystemFormatFactory#createReader来创建InputFormat,目前的实现是其内部类ParquetInputFormat,更进一步是使用ParquetColumnarRow
2020-12-25 15:39:02 1021
原创 Flink实战之入库任务调优
背景在调试flink写hdfs和hive时,任务总是报各种各样的异常,其中255问题最多,异常信息如下:java.lang.Exception: Exception from container-launch.Container id: container_1597847003686_5818_01_000002Exit code: 255Stack trace: ExitCodeException exitCode=255: at org.apache.hadoop.util.Shell.r
2020-12-03 17:19:31 1233
原创 Flink实战之写Hive性能问题
上一篇中写了Kafka to Hive的样例,在实际测试过程中,发现性能比较差。问题1我使用的是Flink1.11.1版本,这个版本有个性能上的问题,见FLINK-19121。该问题已经在1.11.3版本中修复,在HiveTableSink中沿用了FileSystemTableSink的TableRollingPolicy,再该policy中每条数据都会调用@Override public boolean shouldRollOnEvent( PartFileInfo<String
2020-11-27 01:14:05 1495
原创 Flink实战之Kafka To Hive
背景传统的入库任务一般借助于MapReduce或者Spark来写hive表,一般都是天级别最多小时级别的任务。随着实时性要求越来越高,传统的入库不太能满足需求。Flink完全基于流式处理,同时也支持了写Hive表。本文介绍一下如果通过FlinkSQL实现kafka数据入库hive,并能够实时可查。Hive Catalog由于写hive表必须基于hive catalog,所以需要注册hive catalog。同时可以在一个job内切换catalog,如果我们不想把kafka的source table注册
2020-11-24 20:23:02 1943
原创 Flink实战之合并小文件
背景Flink的filesystem connector支持写入hdfs,同时支持基于Checkpoint的滚动策略,每次做Checkpoint时将inprogress的文件变为正式文件,可供下游读取。由于并行度设置、数据量大小、Checkpoint配置的不同、分区的选择,都有可能导致产生大量的小文件,这对hdfs产生很大影响。但是可以通过一些手段来减少小文件,本文主要探讨一些filesystem connector支持的partition commit policy,通过自定义policy来合并小文件
2020-11-20 01:42:33 5231 5
原创 Flink源码阅读之FileSystem Connector
代码在flink-table-runtime-blink模块,用户指南参考官网.目前是旧的实现方式,将会按FLIP-95重新实现FLINK-19336入口类FileSystemTableFactory,如何做Factory discover的可以参考之前的博文,这里就不赘述了。Sink构造FileSystemTableSink对象,传入相关属性参数public TableSink<RowData> createTableSink(TableSinkFactory.Context con
2020-10-21 00:51:33 1172 1
原创 Flink实战之扩展JDBC Dialect
前言Flink jdbc connect已经为依赖于jdbc进行操作的数据库系统提供了非常完善的功能。对于扩展只需要扩展其Dialect即可。具体步骤定义CustomizedDialect类,具体可参考MySQLDialect修改点:TIMESTAMP_PRECISIONDECIMAL_PRECISIONdialectName()canHandle() → “jdbc:xxx:” 如:“jdbc:clickhouse:”getRowConverter() → 定义CustomizedR
2020-09-30 16:35:46 1167 2
原创 Flink源码编译命令
mvn clean package -T 4 -Dfast -Dmaven.compile.fork=true -DskipTests -Dscala-2.11
2020-09-15 16:46:51 278
原创 Flink实战之Flink SQL connector支持并行度配置
背景目前flink sql是不支持source/sink并行度配置的,flink sql中各算子并行度默认是根据source的partition数或文件数来决定的,比如常用的kafka source topic的partition是100,那么fink sql任务的并发就是100。但有时任务相对简单,比如datax任务,没有逻辑根本不需要很大的并发,100并发显然会造成资源的严重浪费。那么就有必要扩展connector使其支持并发度配置。如何做一、首先,需要在ddl的with参数中支持并发的配置,比如
2020-09-13 01:24:32 6643
原创 Flink源码阅读之Sql-Client的执行原理
前言sql-cli相信大家都用过,通过sql-client.sh embedded启动就会进入交互界面,每条sql都可以单独执行。在功能调试时非常方便,还有进入界面的那个大松鼠相当可爱。脚本先上脚本代码#!/usr/bin/env bash################################################################################# Licensed to the Apache Software Foundation (ASF
2020-09-12 01:48:48 993
原创 Flink实战之Flink SQL中的Map、Array、Row
Flink sql支持Map、Array、Row类型,这几种类型在DDL中如何定义、如何获取、如何构造,本文做个总结。以如下数据作为样例:{ "id":1238123899121, "name":"asdlkjasjkdla998y1122", "date":"1990-10-14", "obj":{ "time1":"12:12:43Z", "str":"sfasfafs", "lg":2324342345 },
2020-08-19 16:31:35 21982 12
原创 通过java执行Ansible命令遇到的问题
由于初次使用ansible,遇到一些问题在此记录一下,在网上资料也不多,有时候遇到一些奇葩问题真的毫无头绪。一通过Runtime.getRuntime().exec(cmd); 可以执行ansible ad-hoc命令比如:ansible all -m ping但是复杂一些的命令就会执行不了,不能说执行不力,就是执行之后没反应,也不报错,达不到预期的效果比如:ansible all -m copy -a ‘src=/xxx/xxx/a.log dest=/xxx/xxx/xxx/a.log’但是
2020-08-10 16:09:41 1328 2
原创 Flink源码阅读之flink run 背后做了什么
我们经常使用flink run命令提交一个jar任务,比如提交到yarn集群,那么执行这个命令的背后flink都做了什么,能将我们的job提交到集群呢。对此我有兴趣一探究竟。flink脚本#!/usr/bin/env bash################################################################################# Licensed to the Apache Software Foundation (ASF) under
2020-08-10 01:46:32 417
转载 Flink中的Network Buffer
前言看到一篇对flink Network Buffer 讲的比较好的文章,尤其当你碰到insufficient number of network buffers错误而程序起不来的时候,是不是一头雾水,这篇文章讲解了Network Buffer的内存是如何分配的已经你的程序实际需要的Network Buffer内存怎么计算。对理解Network Buffer相关知识有很大帮助,故搬运过来。原文链接:http://www.liaojiayi.com/flink-network-buffer/#more问
2020-08-04 10:45:53 2289
原创 No operators defined in streaming topology. Cannot generate StreamGraph
Flink 1.11版本对Table&SQL模块进行了重构,废弃了TableEnvironment.sqlUpdate方法,引入了TableEnvironment.executeSql、StatementSet.execute方法。在进行测试时报如下异常Exception in thread "main" java.lang.IllegalStateException: No operators defined in streaming topology. Cannot generate Str
2020-08-03 17:59:30 9666 1
原创 Flink实战之自定义TableFormat
自定义TableFormat主要包含如下步骤:实现TableFormatFactory接口实现SerializationSchemaFactory、DeserializationSchemaFactory 序列化和反序列化接口两个工厂接口用于创建Schema的序(反)列化对象类。实现SerializationSchema、DeserializationSchema在source或sink Function的invoke方法中对数据使用SerializationSchema的seri
2020-07-29 16:49:26 1307
原创 Execution default of goal org.springframework.boot:spring-boot-maven-plugin:2.2.2.RELEASE:repackage
问题背景:spring boot项目在idea 里面执行mvn install命令时报错如题解决方法:将父工程中下面的plugin注掉<plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <v
2020-07-27 16:23:18 1379
原创 Flink实战之自定义flink sql connector
背景最近工作中需要自定义开发一些flink sql的connector,因为官方提供的connector毕竟有限,在我们工作中可能会用到各种各样的中间件。所以官方没有提供的就需要我们自定义开发。就是如:CREATE TABLE XXX(A STRING,B BIGINT)WITH(‘connect.type’ = ‘kafka’,…)所以开发一个自己的connector需要做哪些,本文就来总结一下开发的主要步骤,以及我遇到的问题怎么解决的。开发自定义Factory,根据需要实现S
2020-07-11 00:47:11 4808 8
原创 Flink源码阅读之Flinksql执行流程
基本结构Planner接口负责sql解析、转换成TransformationExecutor接口负责将planner转换的Transformation生成streamGraph并执行public interface Planner { /** * Retrieves a {@link Parser} that provides methods for parsing a SQL string. * * @return initialized {@link Parser} */
2020-07-03 17:35:36 1987
原创 Flink源码阅读之Checkpoint执行过程
前言对应Flink来说checkpoint的作用及重要性就不细说了,前面文章写过checkpoint的详细过程和checkpoint周期性触发过程。不熟悉checkpoint大概过程的同学可以查阅。本篇我们在一起根据源码看下checkpoint的详细执行过程。checkpoint过程源头我们都知道checkpoint的周期性触发是由jobmanager中的一个叫做CheckpointCoordinator角色发起的,具体执行在CheckpointCoordinator.triggerCheckpo
2020-06-18 17:13:40 691
转载 Flink 1.11 Unaligned Checkpoint 解析
作为 Flink 最基础也是最关键的容错机制,Checkpoint 快照机制很好地保证了 Flink 应用从异常状态恢复后的数据准确性。同时 Checkpoint 相关的 metrics 也是诊断 Flink 应用健康状态最为重要的指标,成功且耗时较短的 Checkpoint 表明作业运行状况良好,没有异常或反压。然而,由于 Checkpoint 与反压的耦合,反压反过来也会作用于 Checkpoint,导致 Checkpoint 的种种问题。针对于此,Flink 在 1.11 引入 Unaligned C
2020-06-13 17:22:15 2186 5
原创 Flink源码阅读之Timer定时器
概述在window执行过程篇也提到了定时器的注册,在flink中有很多定时器的使用,比如窗口trigger的触发、watermark的周期生成,其实定时器底层是依赖jdk的ScheduledThreadPoolExecutor来调度的。入口通过TimerService 接口注册和删除定时器。public interface TimerService { long currentProcessingTime(); long currentWatermark(); void registerPr
2020-06-10 19:53:59 671
原创 Flink源码阅读之Checkpoint周期触发过程
Flink的checkpoint原理就不说了,官网以及博客都有说明,有兴趣的同学可以自行查阅。本文主要从源码层面分析一下checkpoint是如何周期性触发的。分析首先通过如下配置启用CheckPointenv.enableCheckpointing(1000);不设置,则默认CheckPoint间隔为-1,即不启用CheckPoint/** Periodic checkpoint triggering interval. */private long checkpointInterval
2020-06-05 16:01:02 731
原创 Flink序列化和Java序列化对比
Java序列化Java的序列化机制一般是对象实现Serializable接口,并指定serialVersionUID。通过字节流的方式来实现序列化和反序列化。serialVersionUID的作用是用来作为版本控制,如果serialVersionUID发生改变则会反序列化失败。主要用途:用于网络传输对象深拷贝用于将对象存储起来缺点:无法跨语言序列化后码流太大序列化性能太低Flink的序列化Flink实现了自己的序列化框架,并结合自身的内存模型,实现了对象的密集存储也高效操作。
2020-06-04 19:55:06 796
原创 Flink为什么比Storm快
Flink的优势以及具有更多丰富的功能、特性,本文就不提了,网上资料很多。本文从底层原理分析一下为什么Flink要比Storm快。“快”说白了就是延迟低。Flink为什么延迟更低主要有以下几个原因:一、数据传输数据传输有分为进程之间和进程内部。进程之间进程之间的传输一般包含shuffle的过程,主要是序列化、网络传输、反序列化这三个步骤。Flink中一般是两个TM之间的传输,通过netty实现。Storm一般是两个woker间的传输,早期版本通过ZeroMQ实现,后来也改成了netty。同
2020-05-27 16:16:13 1409
原创 java.lang.ClassNotFoundException: org.apache.hadoop.crypto.key.KeyProvider
在hadoop2.2.0版本上搭建hive2.2.0环境,在用下面命令初始化时报错schematool -dbType derby -initSchemaException in thread "main" java.lang.RuntimeException: java.lang.NoClassDefFoundError: org/apache/hadoop/crypto/key/KeyProvider at org.apache.hadoop.hive.shims.ShimLoader.getHa
2020-05-24 15:22:16 2529
原创 Flink中串行的陷阱
问题背景在使用FlinkSql做topic复制程序时,遇到一个问题:一份kafka topic数据往多个topic中发,实现一份数据复制多份的功能,但是在做性能压测的时候发现tps上不来。问题分析由于flinksql目前不支持针对具体的算子设置并行度,所以整个job只设置了一个整体并行度。由于flink内部的operation chain机制,会将source和3个map、3个sink都chain到一起,形成一个串行的结构验证代码如下:import org.apache.flink.api.c
2020-05-23 17:57:53 1693
原创 Flink源码阅读之Watermark对齐
watermark的产生我们知道watermark的生成有两种方式:1.在sourceFunction中通过emitWatermark方法生成2.通过assignTimestampsAndWatermarks抽取timestamp并生成watermarkwatermark的流转watermark会像普通的element和stream status一样随着stream流不断的向下游流转watermark的处理前面文章写过job的执行过程,描述了数据怎么被处理的,所有流数据被封装成StreamEl
2020-05-23 16:20:44 859
StreamTask with Mailbox.pdf
2020-06-28
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人