1.入门 demo
WordCount.java
public class WordCount {public static void main(String[] args) throws Exception {//步骤一:获取执行环境StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();//步骤二:获取数据源DataStreamSource<String> dataStream = env.socketTextStream("localhost", 8888);//步骤三:数据处理SingleOutputStreamOperator<Tuple2<String, Integer>> wordAndOne = dataStream.flatMap(new FlatMapFunction<String, Tuple2<String, Integer>>() {@Overridepublic void flatMap(String line, Collector<Tuple2<String, Integer>> collector) throws Exception {String[] fields = line.split(",");for (String word : fields) {collector.collect(new Tuple2<>(word, 1));}}});SingleOutputStreamOperator<Tuple2<String, Integer>> wordCount = wordAndOne.keyBy(0).sum(1);wordCount.print();//步骤四:数据输出 wordCount.print(); //步骤五:启动任务env.execute("word count ...");}}
pom.xml
<dependencies><dependency><groupId>org.apache.flink</groupId><artifactId>flink-streaming-java_2.11</artifactId><version>${flink.version}</version></dependency></dependencies>
2.本地调试
nc -lk 8888a,a,b,c
本地可视化界面
1.增加依赖
<dependency><groupId>org.apache.flink</groupId><artifactId>flink-runtime-web_2.11</artifactId><version>${flink.version}</version></dependency>
2.修改 env 的获取方式
StreamExecutionEnvironment env = StreamExecutionEnvironment.createLocalEnvironmentWithWebUI(new Configuration());
3.浏览器启动
http://localhost:8081/

3.集群运行
1.打包
pom.xml
<build><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-shade-plugin</artifactId><version>3.2.1</version><executions><execution><phase>package</phase><goals><goal>shade</goal></goals><configuration><transformers><transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer"><mainClass>sparkstreaming.wordcount.WordCountStreaming</mainClass></transformer></transformers></configuration></execution></executions></plugin></plugins></build>
mvn clean package
得到 learn_bigdata_flink-1.0-SNAPSHOT.jar
2.提交任务
flink run --class wc.wordcount --jar learn_bigdata_flink-1.0-SNAPSHOT.jar
2.算子
DataSet
| 算子 | 含义 |
|---|---|
| Map | 输入一个元素,然后返回一个元素,中间可以做一些清洗转换等操作 |
| FlatMap | 输入一个元素,可以返回零个,一个或者多个元素 |
| MapPartition | 类似map,一次处理一个分区的数据【如果在进行map处理的时候需要获取第三方资源 链接,建议使用MapPartition】 |
| Filter | 过滤函数,对传入的数据进行判断,符合条件的数据会被留下 |
| Reduce | 对数据进行聚合操作,结合当前元素和上一次reduce返回的值进行聚合操作,然后返回一个 新的值 |
| Aggregate | sum、max、min等 |
| Distinct | 返回一个数据集中去重之后的元素,data.distinct() |
| Join | 内连接 |
| OuterJoin | 外链接 |
| Cross | 获取两个数据集的笛卡尔积 |
| Union | 返回两个数据集的总和,数据类型需要一致 |
| First-n | 获取集合中的前N个元素 |
| SortPartition | 在本地对数据集的所有分区进行排序,通过sortPartition()的链接调用来完成对多个字段的排序 |
广播变量
广播变量允许编程人员在每台机器上保持1个只读的缓存变量,而不是传送变量的副本给tasks 广播变量创建后,它可以运行在集群中的任何function上,而不需要多次传递给集群节点。另外需要记 住,不应该修改广播变量,这样才能确保每个节点获取到的值都是一致的 一句话解释,可以理解为是一个公共的共享变量,我们可以把一个dataset 数据集广播出去,然后不同 的task在节点上都能够获取到,这个数据在每个节点上只会存在一份。如果不使用broadcast,则在每 个节点中的每个task中都需要拷贝一份dataset数据集,比较浪费内存(也就是一个节点中可能会存在多份dataset数据)。 用法
- 初始化数据
DataSet toBroadcast = env.fromElements(1, 2, 3) - 广播数据
withBroadcastSet(toBroadcast, “broadcastSetName”); - 获取数据
Collection broadcastSet =
getRuntimeContext().getBroadcastVariable(“broadcastSetName”);
计数器
Accumulator即累加器,与Mapreduce counter的应用场景差不多,都能很好地观察task在运行期间的数 据变化 可以在Flink job任务中的算子函数中操作累加器,但是只能在任务执行结束之后才能获得累加器的最终结果。 Counter是一个具体的累加器(Accumulator)实现 IntCounter, LongCounter 和 DoubleCounter 用法
- 创建累加器
private IntCounter numLines = new IntCounter(); - 注册累加器
getRuntimeContext().addAccumulator(“num-lines”, this.numLines); - 使用累加器
this.numLines.add(1); - 获取累加器的结果
myJobExecutionResult.getAccumulatorResult(“num-lines”)
