从0到1Flink的成长之路(五)

 

Flink 批处理 API

一、API和编程模型

     1.API

 

Flink提供了多个层次的API供开发者使用,越往上抽象程度越高,使用起来越方便;越往下越
底层,使用起来难度越大

https://ci.apache.org/projects/flink/flink-docs-release-1.10/concepts/programming-model.html#levels-of-abstraction

     2 编程模型

Flink 应用程序结构主要包含三部分:Source/Transformation/Sink,如下图所示:

https://ci.apache.org/projects/flink/flink-docs-release-1.10/dev/api_concepts.html#anatomy-of-a-flink-program

Flink DataSet API编程基本步骤:
1. 获取执行环境(ExecutionEnvironment)

2. 加载/创建初始数据集(DataSet)

3. 对数据集进行各种转换(Transformation)操作,生成新的DataSet

4. 指定计算的结果存储到哪个位置

Streaming Processing:https://ci.apache.org/projects/flink/flink-docs-release-1.11/learn-flink/#stream-processing

https://ci.apache.org/projects/flink/flink-docs-release-1.10/concepts/programming-model.html#programs-and-dataflows

3 词频统计 WordCount

分别使用Java语言和Scala语言,基于Flink 流式分析引擎对批量数据进行离线分析,实现大
数据经典程序:词频统计WordCount。

Java 版本

从本地文件系统加载文本文件数据,按照单词统计次数,最终按照词频降序排序。

package xx.xxxxx.flink.start;
import org.apache.flink.api.common.functions.FilterFunction;
import org.apache.flink.api.common.functions.FlatMapFunction;
import org.apache.flink.api.common.functions.MapFunction;
import org.apache.flink.api.common.operators.Order;
import org.apache.flink.api.java.ExecutionEnvironment;
import org.apache.flink.api.java.operators.AggregateOperator;
import org.apache.flink.api.java.operators.DataSource;
import org.apache.flink.api.java.operators.SortPartitionOperator;
import org.apache.flink.api.java.tuple.Tuple2;
import org.apache.flink.util.Collector;
/**
* 基于Flink引擎实现批处理词频统计WordCount:过滤filter、排序sort等操作
*/
public class BatchWordCount {
public static void main(String[] args) throws Exception {
// 1. 执行环境-env
ExecutionEnvironment env = ExecutionEnvironment.getExecutionEnvironment();
// 2. 数据源-source
DataSource<String> inputDataSet = env.readTextFile("datas/input.data");
// 3. 数据转换-transformation
AggregateOperator<Tuple2<String, Integer>> aggregateDataSet = inputDataSet
// 过滤操作
.filter(new FilterFunction<String>() {
@Override
public boolean filter(String line) throws Exception {
return null != line && line.trim().length() > 0;
}
}
)
// 单词分割
.flatMap(new FlatMapFunction<String, String>() {
@Override
public void flatMap(String line, Collector<String> out) throws Exception {
String[] words = line.trim().split("\\W+");
for (String word : words) {
out.collect(word);
}
}
}
)
// 转换二元组,表示单词出现一次
.map(new MapFunction<String, Tuple2<String, Integer>>() {
@Override
public Tuple2<String, Integer> map(String word) throws Exception {
return Tuple2.of(word, 1);
}
}
)
// 分组聚合
.groupBy(0) // 只能针对元组类型数据进行分组聚合
.sum(1);
/*
(hadoop,7)
(hive,3)
(flink,1)
(hbase,1)
(spark,9)
*/
//aggregateDataSet.print();
// TODO: 对计算结果,进行降序排序, 设置Operator并行度为1,进行全局排序
/*
(spark,9)
(hadoop,7)
(hive,3)
(flink,1)
(hbase,1)
*/
SortPartitionOperator<Tuple2<String, Integer>> sortDataSet = aggregateDataSet
.sortPartition(1, Order.DESCENDING)
.setParallelism(1);
// 4. 数据终端-sink
/*
System.out.println(); -> print()
System.err.println(); -> printToErr() ,控制台打印红色字体
*/
sortDataSet.printToErr();
}
}

Scala 版本

从本地文件系统加载文本文件数据,按照单词统计次数,最终按照词频降序排序。

package xx.xxxxx.flink.start
import org.apache.flink.api.common.operators.Order
import org.apache.flink.api.scala.{DataSet, ExecutionEnvironment}
import org.apache.flink.api.scala._
/**
* 使用Scala语言实现词频统计:WordCount
*/
object FlinkWordCount {
def main(args: Array[String]): Unit = {
// 1. 执行环境-env
val env: ExecutionEnvironment = ExecutionEnvironment.getExecutionEnvironment
// 2. 数据源-source
val textDataSet: DataSet[String] = env.readTextFile("datas/input.data")
// 3. 数据转换-transformation
val countDataSet: DataSet[(String, Int)] = textDataSet
// 第一步、过滤数据
.filter(line => null != line && line.trim.length > 0)
// 第二步、将每行数据分割为单词
.flatMap(line => line.trim.toLowerCase.split("\\W+"))
// 第三步、转换为二元组,表示单词出现一次
.map(word => (word, 1))
// 第四步、按照单词分词,累加统计个数
.groupBy(0).sum(1)
// 第五步、按照词频count降序排序
.sortPartition(1, Order.DESCENDING).setParallelism(1)
// 4. 数据输出-sink
countDataSet.print()
}
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值