Flink实战之流处理和批处理

(一)开发环境搭建

  1. 添加Scala依赖,这里使用Scala 2.12.11
  2. 依赖:
    pom.xml 中添加flink依赖
dependency>
<groupId>org.apache.flink</groupId>
<artifactId>flink-java</artifactId>
<version>1.11.1</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.apache.flink</groupId>
<artifactId>flink-streaming-java_2.12</artifactId>
<version>1.11.1</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.apache.flink</groupId>
<artifactId>flink-scala_2.12</artifactId>
<version>1.11.1</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.apache.flink</groupId>
<artifactId>flink-streaming-scala_2.12</artifactId>
<version>1.11.1</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.apache.flink</groupId>
<artifactId>flink-clients_2.12</artifactId>
<version>1.11.1</version>
 </dependency>

(二)Flink Job开发步骤

在开发Flink程序之前,我们先来梳理一下开发一个Flink程序的步骤
1:获得一个执行环境
2:加载/创建 初始化数据
3:指定操作数据的transaction算子
4:指定数据目的地
5:调用execute()触发执行程序

  • 注意:Flink程序是延迟计算的,只有最后调用execute()方法的时候才会真正触发执行程序
    和Spark类似,Spark中是必须要有action算子才会真正执行。

(三)开发Streaming WordCount

(1)stream wordcount

需求:通过socket实时产生一些单词,使用flink实时接收数据,对指定时间窗口内(例如:2秒)的数据进行聚合统计,并且把时间窗口内计算的结果打印出来

package flink_demo

import org.apache.flink.api.java.functions.KeySelector
import org.apache.flink.streaming.api.scala.StreamExecutionEnvironment
import org.apache.flink.streaming.api.windowing.time.Time

object SocketWindowWordCountScala {
  def main(args: Array[String]): Unit = {
    //获取运行环境
    val env = StreamExecutionEnvironment.getExecutionEnvironment
    //连接socket获取输入数据
    val text = env.socketTextStream("192.168.23.103", 9001)
    //处理数据
    //注意:必须要添加这一行隐式转换的代码,否则下面的flatMap方法会报错
    import org.apache.flink.api.scala._
    val wordCount = text.flatMap(_.split(" ")) //将每一行数据根据空格切分单词
      .map((_, 1)) //每一个单词转换为tuple2的形式(单词,1)
      //.keyBy(0)//根据tuple2中的第一列进行分组
      .keyBy(tup => tup._1) //官方推荐使用keyselector选择器选择数据
      .timeWindow(Time.seconds(2)) //时间窗口为2秒,表示每隔2秒钟计算一次接收到的数
      .sum(1)

    //使用一个线程执行打印操作
    wordCount.print().setParallelism(1)
    //执行程序
    env.execute("SocketWindowWordCountScala")

  }

}

注意:在idea等开发工具里面运行代码的时候需要把pom.xml中的scope配置注释掉

在bigdata04中需要开启socket

[root@bigdata04 ~]# nc -l 9001
hello you
hello me
hello you hello me
  • 注意:此时代码执行的时候下面会显示一些红色的log4j的警告信息,提示缺少相关依赖和配置
    将log4j.properties配置文件和log4j的相关maven配置添加到pom.xml文件中
<!-- log4j的依赖 -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.10</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.7.10</version>
</dependency>

(2)Batch WordCount

需求:统计指定文件中单词出现的总次数
下面来开发Flink的批处理代码

bject BatchWordCountScala {
def main(args: Array[String]): Unit = {
//获取执行环境
val env = ExecutionEnvironment.getExecutionEnvironment
val inputPath = "hdfs://bigdata01:9000/hello.txt"
val outPath = "hdfs://bigdata01:9000/out"
//读取文件中的数据
val text = env.readTextFile(inputPath)
//处理数据
import org.apache.flink.api.scala._
val wordCount = text.flatMap(_.split(" "))
.map((_, 1))
.groupBy(0)
.sum(1)
.setParallelism(1)
//将结果数据保存到文件中
wordCount.writeAsCsv(outPath,"\n"," ")
//执行程序
env.execute("BatchWordCountScala")
}
}

注意:这里面执行setParallelism(1)设置并行度为1是为了将所有数据写到一个文件里面,我们查看结果的时候比较方便

  • 还有就是flink在windows中执行代码,使用到hadoop的时候,需要将hadoop-client的依赖添加到项目中,否则会提示不支持hdfs这种文件系统。
  • 在pom.xml文件中增加
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-client</artifactId>
<version>3.2.0</version>
</dependency>

(四)Flink Streaming和Batch的区别

流处理Streaming
执行环境:StreamExecutionEnvironment
数据类型:DataStream
批处理Batch
执行环境:ExecutionEnvironment
数据类型:DataSet

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值