flink入门案例之WordCount

flink入门案例之WordCount,以下测试代码都是在本地执行的

添加依赖

添加maven依赖

<dependencies>
        <dependency>
            <groupId>org.apache.flinkgroupId>
            <artifactId>flink-scala_2.11artifactId>
            <version>1.7.2version>
        dependency>
        
        <dependency>
            <groupId>org.apache.flinkgroupId>
            <artifactId>flink-streaming-scala_2.11artifactId>
            <version>1.7.2version>
        dependency>
    dependencies>

build信息

<build>
    <plugins>
    
    <plugin>
        <groupId>net.alchim31.mavengroupId>
        <artifactId>scala-maven-pluginartifactId>
        <version>3.4.6version>
        <executions>
            <execution>
                
                <goals>
                    <goal>testCompilegoal>
                goals>
            execution>
        executions>
    plugin>
        <plugin>
            <groupId>org.apache.maven.pluginsgroupId>
            <artifactId>maven-assembly-pluginartifactId>
            <version>3.0.0version>
            <configuration>
                <descriptorRefs>
                    <descriptorRef>jar-with-dependenciesdescriptorRef>
                descriptorRefs>
            configuration>
            <executions>
                <execution>
                    <id>make-assemblyid>
                    <phase>packagephase>
                    <goals>
                        <goal>singlegoal>
                    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的包,很多函数是两个包都有的,导入错了让你怀疑人生

你可能感兴趣的:(flink,flink,WordCount,批处理,流处理)