Flink_WordCount

1.批处理方式(攒一批再处理,看到的是处理后的最终结果)

import org.apache.flink.api.scala._

object BatchWordCount {
  def main(args: Array[String]): Unit = {
    //创建执行环境
    val env = ExecutionEnvironment.getExecutionEnvironment
    //从文件中获取数据
    val inpath="D:\\programs\\sparkPrograms\\FlinkProgarm\\src\\main\\resources\\hello.txt"
    val inputDS: DataSet[String] = env.readTextFile(inpath)
    val res = inputDS.flatMap(_.split(" "))
      .map((_,1))
      .groupBy(0)
      .sum(1)
    res.print()
  }
}

 

2.流处理方式(来一个处理一个,每输入一条数据,实时的看到变化)

使用socket流的方式输入

import org.apache.flink.streaming.api.scala.StreamExecutionEnvironment
import  org.apache.flink.api.scala._

object StreamWordCount {
  def main(args: Array[String]): Unit = {
    val env=StreamExecutionEnvironment.getExecutionEnvironment
    val dataStream = env.socketTextStream("192.168.252.129",7777)
    val wc = dataStream.flatMap(_.split(" "))
      .filter(_.nonEmpty)
      .map((_,1))
      .keyBy(0)
      .sum(1)
    wc.print()
    env.execute("wordcount")
  }
}
运行:
1.先在linux系统上安装netcat,它可以通过使用TCP或UDP协议的网络连接读写数据
yum install -y nc

2.运行nc命令
nc -lk 7777

说明:
-l参数
用于指定nc将处于侦听模式。指定该参数,则意味着nc被当作server,侦听并接受连接,而非向其它地址发起连接。

-k<通信端口>
强制 nc 待命链接.当客户端从服务端断开连接后,过一段时间服务端也会停止监听。 但通过选项 -k 我们可以强制服务器保持连接并继续监听端口。

指定端口7777

3.开启flink程序后,在nc服务下输入数据

在本地运行时,运行结果前面的数字1-4代表所在线程,flink程序中没有设置线程数,所以线程数是当前系统的cpu核数

提交到flink集群上时,该数字代表的是slot的编号

我们也可以在flink程序中设置线程数,如图,

线程数设为为2,那么结果线程只有1,2

错误记录

SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".
SLF4J: Defaulting to no-operation (NOP) logger implementation
SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details.

解决方案:加入以下依赖

<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>slf4j-simple</artifactId>
    <version>1.7.25</version>
    <scope>compile</scope>
</dependency>

原因:

编译时slf4j-api中public final class LoggerFactor类中private final static void bind()方法会寻找具体的日志实现类绑定,主要通过StaticLoggerBinder.getSingleton()的语句调用。所以出现这个问题就是没有加具体的日志实现,只加了接口。

 

附: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>

    <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-simple</artifactId>
        <version>1.7.25</version>
        <scope>compile</scope>
    </dependency>

</dependencies>

<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>
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章