随机字符串生成器_聊聊flink 1.11 中的随机数据生成器- DataGen connector

963212e145f207d04298674db09ea9d3.png
  • 使用
  • 示例
  • 源码解析
    • 创建TableSource
    • 数据生成器DataGenerator
    • DataGenTableSource

使用

在flink 1.11中,内置提供了一个DataGen 连接器,主要是用于生成一些随机数,用于在没有数据源的时候,进行流任务的测试以及性能测试等。下面我们简单的聊聊如何来使用以及底层源码是如何实现的。

具体的使用方法可以先看下官网的概述。

https://ci.apache.org/projects/flink/flink-docs-release-1.11/zh/dev/table/connectors/datagen.html

之后我来做下简单的概述,以及一些注意点:

  • 目前随机生成只支持基本数据类型:数字类型(TINYINT、SMALLINT、int、bigint、FLOAT、double)、字符串类型(VARCHAR、char),以及boolean类型。
  • 目前有两种数据生成器,一种是随机生成器(默认),这个是无界的,另一个是序列生成器,是有界的。
  • 字段中只要有一个是按序列生成的,也就是有界的,程序就会在序列结束的时候退出。如果所有字段都是随机生成的,则程序最终不会结束。

示例

我们摘抄下官网的例子,然后做下解释。

CREATE TABLE datagen (
 f_sequence INT,
 f_random INT,
 f_random_str STRING,
 ts AS localtimestamp,
 WATERMARK FOR ts AS ts
) WITH (
 'connector' = 'datagen',

 -- optional options --

 'rows-per-second'='5',

 'fields.f_sequence.kind'='sequence',
 'fields.f_sequence.start'='1',
 'fields.f_sequence.end'='1000',

 'fields.f_random.min'='1',
 'fields.f_random.max'='1000',

 'fields.f_random_str.length'='10'
)
  • DDL的with属性中,除了connector是必填之外,其他都是可选的。
  • rows-per-second 每秒生成的数据条数
  • f_sequence字段的生成策略是按序列生成,并且指定了起始值,所以该程序将会在到达序列的结束值之后退出
  • f_random 字段是按照随机生成,并指定随机生成的范围
  • f_random_str是一个字符串类型,属性中指定了随机生成字符串的长度是10
  • ts列是一个计算列,返回当前的时间.

源码解析

创建TableSource

既然是一个source conncector,那么就有对应的TableSourceFactory和TableSource,这个datagen所对应的就是DataGenTableSourceFactory和DataGenTableSource,接下来我们从这里作为入口来看看底层是怎么实现的。

我们首先进入DataGenTableSourceFactory#createDynamicTableSource。

@Override
	public DynamicTableSource createDynamicTableSource(Context context) {
		Configuration options = new Configuration();
		context.getCatalogTable().getOptions().forEach(options::setString);

		TableSchema tableSchema = TableSchemaUtils.getPhysicalSchema(context.getCatalogTable().getSchema());

		DataGenerator[] fieldGenerators = new DataGenerator[tableSchema.getFieldCount()];
		for (int i = 0; i < fieldGenerators.length; i++) {
			fieldGenerators[i] = createDataGenerator(
					tableSchema.getFieldName(i).get(),
					tableSchema.getFieldDataType(i).get(),
					options);
		}

		return new DataGenTableSource(fieldGenerators, tableSchema, options.get(ROWS_PER_SECOND));
	}

我们看到,在这个方法里,首先获取到包含字段名和类型的TableSchema对象,然后构造了一个长度是字段个数的DataGenerator数组,之后根据每个字段的类型、以及相应的属性参数来依次构造对应的数据生成器。在最后构造了DataGenTableSource对象。

数据生成器DataGenerator

DataGenerator是一个接口,是有状态的可扩展的数据生成器,它有两个抽象的实现类,一个是RandomGenerator,一个是SequenceGenerator,系统根据每个字段的配置选项,也就是"fields.#.kind"来决定采用哪种生成策略为字段生成数据。代码如下:

见DataGenTableSourceFactory#createDataGenerator方法

private DataGenerator createDataGenerator(String name, DataType type, ReadableConfig options) {
		String genType = options.get(
				key(FIELDS + "." + name + "." + KIND).stringType().defaultValue(RANDOM));
		switch (genType) {
			case RANDOM:
				return createRandomGenerator(name, type, options);
			case SEQUENCE:
				return createSequenceGenerator(name, type, options);
			default:
				throw new ValidationException("Unsupported generator type: " + genType);
		}
	}

我们进入createRandomGenerator方法,看到系统会根据字段的类型来调用不同的静态方法并且根据配置的最大和最小值来生成所要的数据。

private DataGenerator createRandomGenerator(String name, DataType type, ReadableConfig options) {
		ConfigOption<Integer> lenKey = key(FIELDS + "." + name + "." + LENGTH)
				.intType().defaultValue(100);
		OptionBuilder minKey = key(FIELDS + "." + name + "." + MIN);
		OptionBuilder maxKey = key(FIELDS + "." + name + "." + MAX);
		switch (type.getLogicalType().getTypeRoot()) {
			case BOOLEAN:
				return RandomGenerator.booleanGenerator();
		    ...............................
	}

createSequenceGenerator方法的实现和这个方法类似。

DataGenTableSource

最后我们来看看DataGenTableSource,在这里,核心主要是createSource方法,用来创建一个flink的具体的source。

DataGeneratorSource<RowData> createSource() {
			return new DataGeneratorSource<>(
					new RowGenerator(fieldGenerators, schema.getFieldNames()),
					rowsPerSecond);
		}

我们看到在构造DataGeneratorSource的时候,使用了RowGenerator对象,在这个RowGenerator对象里,主要是通过hasNext来判断程序是否结束,使用next方法来获取下一条数据。

@Override
		public boolean hasNext() {
			for (DataGenerator generator : fieldGenerators) {
				if (!generator.hasNext()) {
					return false;
				}
			}
			return true;
		}

		@Override
		public RowData next() {
			GenericRowData row = new GenericRowData(fieldNames.length);
			for (int i = 0; i < fieldGenerators.length; i++) {
				row.setField(i, fieldGenerators[i].next());
			}
			return row;
		}

在hasNext方法里,对所有字段的数据生成器进行判断,只要是有一个结束了,那么就返回false,程序结束,在next方法获取数据的时候,对于每个字段,依次使用对应的DataGenerator来生成一条数据,然后把所生成的数据构造成一个RowData对象,也就是我们要输出的结果。

更多干货信息,欢迎关注我的公众号【大数据技术与应用实战】

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: flink-connector-jdbc_2.12 是 Apache Flink 的一个连接器,用于将 Flink 与关系型数据库进行连接和交互。_2.12 表示这个连接器是为 Scala 2.12 版本编译的。以下是关于这个连接器的一些详细说明: 1. 功能:flink-connector-jdbc_2.12 提供了将 Flink 作业与关系型数据库集成的功能。它可以读取和写入关系型数据库的数据,并提供对数据流的持久化和查询执行能力。 2. 数据源:这个连接器可以作为 Flink 作业的数据源,从关系型数据库读取数据。它支持读取整个表、查询结果集或自定义的 SQL 查询。读取的数据可以作为 FlinkDataStream 进行处理和转换。 3. 数据接收器:此连接器也可以作为 Flink 作业的数据接收器,将流数据写入关系数据库,例如将计算结果持久化到数据库。它支持插入、更新和删除操作,可以根据业务逻辑将流数据写入到相应的数据库表。 4. 数据格式:flink-connector-jdbc_2.12 支持多种数据格式的读写,如 Avro、JSON、ORC、Parquet 等。它提供了对这些数据格式的解析和序列化功能,并将其映射到关系型数据库的表结构。 5. 事务支持:此连接器还具备事务支持的能力,可以在作业执行期间确保数据的一致性和可靠性。它能够处理作业失败、重启等情况,并保证数据的完整性。 6. 配置灵活:flink-connector-jdbc_2.12 提供了丰富的配置选项,可以根据不同的数据库类型和连接要求进行灵活的配置。可以设置连接URL、用户名、密码、最大连接数等参数。 总之,flink-connector-jdbc_2.12 是一个用于 Apache Flink 的关系型数据库连接器,它提供了将 Flink 与关系型数据库集成的功能,可以实现数据的读写和持久化。使用该连接器,我们可以方便地处理和分析关系型数据库的数据,并能够根据业务需求进行定制配置和操作。 ### 回答2: flink-connector-jdbc_2.12是Apache Flink的一个连接器(connector),旨在连接Flink与关系型数据库。它是为了通过Flink将数据从关系型数据库读取到流式数据流,或将流式数据写入到关系型数据库而开发的。 该连接器支持与各种关系型数据库的连接,如MySQL、PostgreSQL、Oracle等,并提供了读取和写入数据库的功能。通过使用JDBC(Java Database Connectivity)接口,flink-connector-jdbc_2.12可以与各种数据库进行通信并执行SQL查询和操作。 使用该连接器,用户可以从关系型数据库实时读取数据,并将其转换为Flink数据流进行处理。同时,也可以将流式数据写入到关系型数据库,用于持久化存储或与其他系统交互。这使得Flink可以无缝地与现有的关系型数据库集成,为用户提供更多的数据处理和分析功能。 通过flink-connector-jdbc_2.12,用户可以配置数据源和数据接收器,指定连接数据库的信息、数据表、查询条件等,并对数据进行转换、过滤、聚合等操作。它提供了高度可靠和可扩展的数据处理能力,使得用户可以轻松地实现复杂的数据处理和分析任务。 总而言之,flink-connector-jdbc_2.12是Apache Flink提供的一个连接器,用于连接Flink与关系型数据库,支持数据的读取和写入操作,使得Flink可以与关系型数据库无缝集成,为用户提供更多的数据处理和分析功能。 ### 回答3: flink-connector-jdbc_2.12是Apache Flink的一个官方支持的JDBC连接器,用于将Flink与关系型数据库进行连接和交互。在Flink使用该连接器,可以方便地读取和写入关系型数据库的数据。 flink-connector-jdbc_2.12提供了丰富的功能和特性。首先,它支持从关系型数据库读取数据,并将其作为DataStream或Table进行处理和操作。这使得我们可以利用Flink的流式处理和批量处理功能来处理数据库的数据。其次,它也支持将DataStream或Table的数据写入到关系型数据库,实现数据的持久化和存储。这对于需要将计算结果保存到数据库的场景非常有用。 此外,flink-connector-jdbc_2.12还提供了一些高级功能,例如事务支持和Exactly-Once语义。通过使用JDBC连接器,我们可以在Flink实现端到端的Exactly-Once一致性保证,确保数据在读取和写入过程的一致性和可靠性。 flink-connector-jdbc_2.12支持多种数据库系统,如MySQL、PostgreSQL、Oracle等。并且它还提供了一些配置选项,如连接池配置、批量写入配置等,可以根据具体需求进行调整和优化。 总而言之,flink-connector-jdbc_2.12是一个非常有用和强大的工具,可以帮助我们在Flink与关系型数据库进行无缝连接和数据交互。它不仅提供了读写数据的功能,还支持事务和Exactly-Once语义,使得我们可以在Flink构建高效和可靠的数据处理流程。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值