flink
入门案例之WordCount
,以下测试代码都是在本地执行的
添加依赖
添加maven依赖
<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>
</dependencies>
build信息
<build>
<plugins>
<!-- 该插件用于将Scala代码编译成class文件 -->
<plugin>
<groupId>net.alchim31.maven</groupId>
<artifactId>scala-maven-plugin</artifactId>
<version>3.4.6</version>
<executions>
<execution>
<!-- 声明绑定到maven的compile阶段 -->
<goals>
<goal>testCompile</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-assembly-plugin</artifactId>
<version>3.0.0</version>
<configuration>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
</configuration>
<executions>
<execution>
<id>make-assembly</id>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
批处理
import org.apache.flink.api.scala.{AggregateDataSet, DataSet, ExecutionEnvironment, createTypeInformation}
object WordCount {
def main(args: Array[String]): Unit = {
//获取执行环境
//创建一个执行环境,该环境代表当前在其中执行程序的上下文。
// 如果程序是独立调用的,则此方法返回本地执行环境。
// 如果从命令行客户端内部调用该程序以将其提交给集群,则此方法将返回该集群的执行环境。
val env: ExecutionEnvironment = ExecutionEnvironment.getExecutionEnvironment
//创建通过逐行读取给定文件而产生的字符串数据集。
val inputDS: DataSet[String] = env.readTextFile("D:/test/a.txt")
val wordCounts: AggregateDataSet[(String, Int)] = inputDS.flatMap(_.split(" ")).map((_, 1)).groupBy(0).sum(1)
//将DataSet中的元素打印到调用print()方法的JVM的标准输出流System.out中。
// 对于在群集中执行的程序,此方法需要将DataSet的内容收集回客户端,以在客户端打印。
//为每个元素编写的字符串由AnyRef.toString方法定义。
//与()和()方法类似,此方法立即触发程序执行。
wordCounts.print()
}
}
流处理
import org.apache.flink.streaming.api.scala.{DataStream, StreamExecutionEnvironment}
object StreamWordCount {
def main(args: Array[String]): Unit = {
//替换为你自己的IP
val host = "192.168.xx.1x1"
val port = 9000
// 创建流处理环境
val env = StreamExecutionEnvironment.getExecutionEnvironment
// 接收socket文本流
val textDstream: DataStream[String] = env.socketTextStream(host, port)
// flatMap和Map需要引用的隐式转换
import org.apache.flink.api.scala._
val value: DataStream[(String, Int)] = textDstream.flatMap(_.split("\\s")).filter((_.nonEmpty)).map((_, 1)).keyBy(0).sum(1)
value.print().setParallelism(1)
env.execute("Socket WordCountTest")
}
}
之后在linux
上用如下命令进行测试
[root@mypc01 ~]# nc -lk 9000
总结
- 导入包的时候一定要留意导入的是
java
的包还是scala
的包,很多函数是两个包都有的,导入错了让你怀疑人生