Flink 快速入门案例(参考官方文档)

Flink

批处理是有界数据流处理的范例。在这种模式下,你可以选择在计算结果输出之前输入整个数据集,这也就意味着你可以对整个数据集的数据进行排序、统计或汇总计算后再输出结果。

流处理正相反,其涉及无界数据流。至少理论上来说,它的数据输入永远不会结束,因此程序必须持续不断地对到达的数据进行处理。

快速入门案例

DarchetypeGroupId=org.apache.flink 
DarchetypeArtifactId=flink-walkthrough-datastream-java 
DarchetypeVersion=1.12.0

Flink 快速入门案例(参考官方文档)_第1张图片

  • FraudDetectionJob

    package com.sanxiau;
    
    import org.apache.flink.streaming.api.datastream.DataStream;
    import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment;
    import org.apache.flink.walkthrough.common.sink.AlertSink;
    import org.apache.flink.walkthrough.common.entity.Alert;
    import org.apache.flink.walkthrough.common.entity.Transaction;
    import org.apache.flink.walkthrough.common.source.TransactionSource;
    
    /**
     * 定义了程序的数据流
     *
     * Skeleton code for the datastream walkthrough
     */
    public class FraudDetectionJob {
           
    	public static void main(String[] args) throws Exception {
           
    		// 设置执行环境。 任务执行环境用于定义任务的属性、创建数据源以及最终启动任务的执行。
    		StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
    		// 创建数据源 官方案例中存在数据
    		DataStream<Transaction> transactions = env
    			.addSource(new TransactionSource())
    			.name("transactions");
    		// 对事件分区 & 欺诈检测
    		DataStream<Alert> alerts = transactions
    			.keyBy(Transaction::getAccountId)  //keyBy对流进行分区,保证同一个task处理同一个的key的所有数据
    			.process(new FraudDetector())  //对流绑定了一个操作,这个操作将会对流上的每一个消息调用所定义好的函数。
    			.name("fraud-detector");
    		// 输出结果
    		alerts  //sink 会将 DataStream 写出到外部系统
    			.addSink(new AlertSink()) // AlertSink 使用 INFO 的日志级别打印每一个 Alert 的数据记录,而不是将其写入持久存储,以便你可以方便地查看结果。
    			.name("send-alerts");
    		// 运行作业 Flink 程序是懒加载的,并且只有在完全搭建好之后,才能够发布到集群上执行。
    		// 调用execute 时给任务传递一个任务名参数,就可以开始运行任务。
    		env.execute("Fraud Detection");
    	}
    }
    
    
  • FraudDetector

    package com.sanxiau;
    
    import org.apache.flink.streaming.api.functions.KeyedProcessFunction;
    import org.apache.flink.util.Collector;
    import org.apache.flink.walkthrough.common.entity.Alert;
    import org.apache.flink.walkthrough.common.entity.Transaction;
    
    /**
     *
     * 定义了欺诈交易检测的业务逻辑。
     * 欺诈检测器
     * Skeleton code for implementing a fraud detector.
     *
     *  是KeyedProcessFunction 接口的一个实现
     *	会在每个交易事件上被调用
     *	 这个程序里边会对每笔交易发出警报	
     */
    
    public class FraudDetector extends KeyedProcessFunction<Long, Transaction, Alert> {
           
    
    	private static final long serialVersionUID = 1L;
    
    	private static final double SMALL_AMOUNT = 1.00;
    	private static final double LARGE_AMOUNT = 500.00;
    	private static final long ONE_MINUTE = 60 * 1000;
    
    	@Override
    	public void processElement(
    			Transaction transaction,
    			Context context,
    			Collector<Alert> collector) throws Exception {
           
    
    		Alert alert = new Alert();
    		alert.setId(transaction.getAccountId());
    
    		collector.collect(alert);
    	}
    }
    
    
  • 报错

    java.lang.NoClassDefFoundError: org/apache/flink/streaming/api/functions/source/SourceFunction
    
  • 修改pom.xml 中依赖的作用域,删除或者

    provided
    
  • 执行结果

Flink 快速入门案例(参考官方文档)_第2张图片

你可能感兴趣的:(flink)