public static void main(String[] args) throws Exception { StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment(); // TODO 从集合读数据 DataStreamSource
source = env.fromCollection(Arrays.asList(1, 22, 3)); source.print(); env.execute(); }
StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
env.fromCollection(Arrays.asList(1, 22, 3));
fromCollection传入一个collection接口、iterator迭代器、list、arrays都可以
DataStreamSource
source = env.fromCollection(Arrays.asList(1, 22, 3));
source.print();
尖括号前面的数字是因为此代码未设置并行度 ,所以默认为12个并行度,他的运算随机分配到这十二个中,若再次运行,前面的数字还会不相同。
或者将
DataStreamSourcesource = env.fromCollection(Arrays.asList(1, 22, 3));
改为
DataStreamSourcesource = env.fromElements(1,2,3);
则可不用添加数组,直接写就可执行
public static void main(String[] args) throws Exception { StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment(); FileSource
fileSource = FileSource.forRecordStreamFormat(new TextLineInputFormat(), new Path("input/word.txt")).build(); env.fromSource(fileSource,WatermarkStrategy.noWatermarks(),"file") .print(); env.execute(); }
env.formatSource(Source的实现类,Watermark,标示名)
org.apache.flink flink-connector-files ${flink.version}
DataStreamstream = env.socketTextStream("bigdata1", 7777);
从kafka读数据
org.apache.flink flink-connector-kafka ${flink.version}
而且要是org.apache.flink.connect.kafka.source所提供
kafkaSource.bulider()//创建一个实例,以便后续添加其他配置
.setBootstrapServer("bigdata1:9092")//指定kafka节点的地址和端口
kafka作为生产者,flink作为消费者 后续对flink进行配置
.setGroupId("test")//指定消费者的组id
.setTopics("topic1")//指定要消费的topic
.setStartingOffsets(OffsetsInitializer.latest())//flink消费kafka的策略 必须从最新开始
.setValueOnlyDeserializer(new SimpleStringSchema())//只对value指定反序列化
kafka消费者的参数:
auto.reset.offsets
earliest:如果有offset,从offset继续消费,没有从最早消费
latiest:如果有offset,从offset继续消费,没有从最新消费
flink的kafkasource.offset消费策略: OffsetInitializer 默认是earliest
earliest():一定从 最早 消费
latiest():一定从 最新 消费
public class kafkaSourceDemo { public static void main(String[] args) throws Exception { StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment(); env.setParallelism(1); KafkaSource
kafkaSource = KafkaSource. builder() .setBootstrapServers("bigdata1:9092") .setTopics("topic1") .setGroupId("test") .setStartingOffsets(OffsetsInitializer.latest()) .setValueOnlyDeserializer(new SimpleStringSchema()) .build(); DataStreamSource stream = env.fromSource(kafkaSource, WatermarkStrategy.noWatermarks(), "kafka-source"); stream.print("Kafka"); env.execute(); } }
org.apache.flink flink-connector-datagen ${flink.version}
数据生成器 Source 四个参数:
第一个:GeneratoFunction 接口, 需要实现 重写 map 方法, 输入类型 固定为Long
第二个:Long类型,自动生成的数字序列 (从0自增)的最大值,达到这个值就停止
第三个:限速策略,比如 每秒生成几条数据
第四个:返回类型
StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment(); env.setParallelism(1); DataGeneratorSource
dataGeneratorSource = new DataGeneratorSource<>( new GeneratorFunction () { @Override public String map(Long value) throws Exception { return "Number:"+value; } }, 10, RateLimiterStrategy.perSecond(1), Types.STRING ); env .fromSource(dataGeneratorSource, WatermarkStrategy.noWatermarks(), "datagenerator") .print(); env.execute(); } }
env.formatSource(Source的实现类,不使用Watermark,标识名)
不使用Watermark 表示处理的数据流是无界的
- 当运算到达10的时候他就会停止运行,但不会执行10,和有界流类似
- 如果想没有最大值,那么把10 改为Long.MAX_VALUE
- RateLimiterStrategy.perSecond(1) 表示每秒钟几条
如果最大值设置为100,并行度为3,那么就是将这100平均分为三份,然后计算
执行结果为