Flink是一个专注于流处理的框架,它相比较与spark的流式处理,flink的延迟更短,时间颗粒度更细,且flink也是使用scala语言编写
但注意flink只是专注于流式计算,并不是说不可以做离线计算,它的离线计算和spark的差不多,但是它的在线计算,摒弃了spark的很多缺点,如spark通常情况下要依赖于开窗时间和滑动时间来进行一批一批的处理数据,无法做到真正的流式处理,且不同批次的结果想要累加或者一起计算则需要两个状态更细的开窗方法,而flink则没有这种限制,它是真正意义上的流式处理可以从负无穷到正无穷的计算,不分批次,每一条数据都将会被处理
它的开发流程和spark差不多,只是方法有时有些不同而已,编程方式见代码,这里要重点说的是任务的提交方式以及集群的启动方式!!!!
Flink的任务提交方式很特别,它不像hadoop的hadoop jar,也不是spark的spark-submit,它的提交和任务的查看可以在管理页面进行,但是对于管理页面来说有一个坑爹的事情,就是集群配置文件master中写的是那个,就必须在那台机器上运行启动命令,不然虽然可以正常启动,但是可用task没有办法进行心跳机制,会发现flink管理页面上的task都是0,管理页面的默认端口是8081,当然也可以通过命令行提交任务
管理页面的样子如下,这个管理页面你需要重Flink的Master结点的端口打开,这里只是给大家看一下样子,详细使用大家看我其他的资料

命令行提交时使用如下命令

也可以用命令停止

同时Flink流处理的时候还有很多数据源获取方式,甚至flink的流处理可以直接获取批处理那样的数据源,如文件,只是处理的时候是和流处理一样都是一条一条数据出来的,而不是普通批处理那样一整批的处理
下面是我自己整理了一个pom,供给大家演示Flink用
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.wy</groupId>
<artifactId>flink</artifactId>
<version>1.0-SNAPSHOT</version>
<dependencies>
<dependency>
<groupId>org.apache.flink</groupId>
<artifactId>flink-scala_2.11</artifactId>
<version>1.7.2</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.flink/flink-streaming-scala -->
<dependency>
<groupId>org.apache.flink</groupId>
<artifactId>flink-streaming-scala_2.11</artifactId>
<version>1.7.2</version>
</dependency>
<dependency>
<groupId>org.apache.flink</groupId>
<artifactId>flink-connector-kafka-0.11_2.11</artifactId>
<version>1.7.2</version>
</dependency>
<!--flink -hdfs-->
<dependency>
<groupId>org.apache.flink</groupId>
<artifactId>flink-clients_2.11</artifactId>
<version>1.7.2</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-client</artifactId>
<version>2.7.2</version>
</dependency>
<!-- flink sql模块 -->
<dependency>
<groupId>org.apache.flink</groupId>
<artifactId>flink-table_2.11</artifactId>
<version>1.7.2</version>
</dependency>
<dependency>
<groupId>org.apache.flink</groupId>
<artifactId>flink-table-common</artifactId>
<version>1.7.2</version>
</dependency>
<!-- 保存mysql -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.6</version>
</dependency>
<dependency>
<groupId>org.apache.flink</groupId>
<artifactId>flink-jdbc_2.11</artifactId>
<version>1.7.0</version>
</dependency>
</dependencies>
<build>
<pluginManagement>
<plugins>
<!-- 编译scala的插件 -->
<plugin>
<groupId>net.alchim31.maven</groupId>
<artifactId>scala-maven-plugin</artifactId>
<version>3.2.2</version>
</plugin>
<!-- 编译java的插件 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.5.1</version>
</plugin>
</plugins>
</pluginManagement>
<plugins>
<plugin>
<groupId>net.alchim31.maven</groupId>
<artifactId>scala-maven-plugin</artifactId>
<executions>
<execution>
<id>scala-compile-first</id>
<phase>process-resources</phase>
<goals>
<goal>add-source</goal>
<goal>compile</goal>
</goals>
</execution>
<execution>
<id>scala-test-compile</id>
<phase>process-test-resources</phase>
<goals>
<goal>testCompile</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<executions>
<execution>
<phase>compile</phase>
<goals>
<goal>compile</goal>
</goals>
</execution>
</executions>
</plugin>
<!-- 打jar插件 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>2.4.3</version>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
<configuration>
<filters>
<filter>
<artifact>*:*</artifact>
<excludes>
<exclude>META-INF/*.SF</exclude>
<exclude>META-INF/*.DSA</exclude>
<exclude>META-INF/*.RSA</exclude>
</excludes>
</filter>
</filters>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
下面给大家看一下flink的批处理怎么写
package wy
/**
* 导入时一定要将org.apache.flink.api.scala包下所有的东西
* 全部导入不然会发生无法隐式转换等错误
*/
import org.apache.flink.api.scala._
object WorldCount {
def main(args: Array[String]): Unit = {
/**
* 开头等价于spark的Spark容器获取
* 同时我们一般直接使用getExecutionEnvironment就可以
* 原因是Flink最开始获取运行容器有二个方法,分别是获取集群运行资源和获取本地运行资源
* 但是开发时改来改去的麻烦,所以Flink后期提供了getExecutionEnvironment方法
* 该方法可以底层调用了之前的两种运行资源的获取自己判断获取那种资源
*/
val exe = ExecutionEnvironment.getExecutionEnvironment
/**
* 此更改整个程序的并行数,这个和spark的有些不同
* Spark并行数设置通过运行时的cores设置就行
* 但是flink的有些不一样,且我们一般都会适量设置,一般不使用默认的个数
* 因为Flink自己会获取运行资源,默认个数为所有可用的task数
* 我们设置时flink的并行数最好是控制在可用task数之内
* 可用task数在管理页面中可以查看到
* task设置少了任务效率受影响
* 设置多了,就会发生大于可用task的数量的进程会和其他进程争抢task资源
* 挣不到就会死锁等问题发生特别麻烦
* 且flink改变并行数有不同的优先级的:
* 在集群中运行任务时设置的并行数优先级最低
* 在ExecutionEnvironment对象设置的并行数倒数优先级倒数第二
* 在方法上设置的并行数优先级最高,如:sum(1).setParallelism()
*/
exe.setParallelism(1)
/**
* 加载一个文件进行单词统计算法,使用链式调用
* 这里就可以发现flink中将spark的reduceByKey分解成
* groupBy和sum了
*/
val data = exe.readTextFile("D:\\IdeaObj\\flink\\src\\main\\resources\\world")
data.flatMap(_.split(" ")).map((_,1)).groupBy(0).sum(1).print()
}
}
下面再给大家演示一下流处理
package wy
import org.apache.flink.streaming.api.functions.source.SourceFunction
import org.apache.flink.streaming.api.scala._
object SWorldCount {
def main(args: Array[String]): Unit = {
val exe = StreamExecutionEnvironment.getExecutionEnvironment
//val Sdata = exe.socketTextStream(args(0),args(1).toInt)
val Sdata = exe.socketTextStream("hdp1",44444)
Sdata.flatMap(_.split(" ")).map((_,1)).keyBy(0).sum(1).print()
/**
*和Spark一样需要一个方法使得流计算程序执行,并命名程序
*/
exe.execute("WorldCount")
}
}
1587

被折叠的 条评论
为什么被折叠?



