Flink源算子示例

1.从集合读取数据

    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个并行度,他的运算随机分配到这十二个中,若再次运行,前面的数字还会不相同。

或者将

DataStreamSource source = env.fromCollection(Arrays.asList(1, 22, 3));

改为

DataStreamSource source = env.fromElements(1,2,3);

则可不用添加数组,直接写就可执行

2.从文件读

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,标示名)

在使用前要在pom文件中添加依赖

 
            org.apache.flink
            flink-connector-files
            ${flink.version}

执行结果为

3.从Socket读

DataStream stream = env.socketTextStream("bigdata1", 7777);

从kafka读数据

首先导入依赖


    org.apache.flink
    flink-connector-kafka
    ${flink.version}

首先要构造kafkaSource

而且要是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():一定从 最新 消费

Flink源算子示例_第1张图片

代码

    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();
        }
    }

4.从数据生成器读

        
            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 表示处理的数据流是无界的

运算结果 

Flink源算子示例_第2张图片

  • 当运算到达10的时候他就会停止运行,但不会执行10,和有界流类似
  • 如果想没有最大值,那么把10 改为Long.MAX_VALUE
  • RateLimiterStrategy.perSecond(1) 表示每秒钟几条

如果最大值设置为100,并行度为3,那么就是将这100平均分为三份,然后计算

执行结果为

Flink源算子示例_第3张图片

你可能感兴趣的:(flink,java,算法)