Flink学习 - 2. Flink之WordCount

Flink学习 - 2. Flink之WordCount

  • Flink项目要求
  • Flink项目模板
    • 基于java实现的项目模板
      • Maven archetype
      • Quick Start
    • 基于Scala实现的项目模板
      • Maven archetype
      • Quick Start
  • 构建Flink项目
    • Maven依赖
      • java项目
      • scala项目
    • 项目代码
      • java
    • scala
    • 执行过程中问题

Flink项目要求

Maven 3.0.4 (或者更高)
Java 8.x

Flink项目模板

Flink为了对用户使用Flink进行应用开发进行简化,官方提供了相应的项目模板进行过开发项目,用户不需要自己引入相应的依赖库,同时提供了基于java开发的项目模板和基于scala开发的项目模板。

基于java实现的项目模板

创建项目主要有两种方式:

  1. Maven archetype命令进行创建。
  2. 通过官方提供的 Quickstart Shell 脚本进行创建。

Maven archetype

注意:
我使用的maven版本是3.6.0, 从3.0以上的版本中,DarchetyoeCatalog配置已经从命令中移除,需要用户在Maven Settings 中进行配置,或者直接将该选项移除,否则可能造成不能生成project的错误。

有些文章中指出:
 $ mvn archetype:generate                               \
      -DarchetypeGroupId=org.apache.flink              \
      -DarchetypeArtifactId=flink-quickstart-java      \
      -DarchetypeCattalog=https://repository.apache.org/content/repositories/snapshots/                         \
      -DarchetypeVersion=1.6.0
    

在maven版本3。0以后, -DarchetypeCattalog 这个参数已经不用。

因此需要采用以下命令:

 $ mvn archetype:generate                               \
      -DarchetypeGroupId=org.apache.flink              \
      -DarchetypeArtifactId=flink-quickstart-java      \
      -DarchetypeVersion=1.9.0
    

打包过程中会出现需要你命名groupId和artifactId 对应的填入相应的项目信息。

Quick Start

curl https://flink.apache.org/q/quickstart-SNAPSHOT.sh | bash -s 1.9.1 

基于Scala实现的项目模板

Maven archetype

mvn archetype:generate 
    -DarchetypeGroupId=org.apache.flink          \
    -DarchetypeArtifactId=flink-quickstart-scala  \
    -DarchetypeVersion=1.9.1

打包过程中会出现需要你命名groupId和artifactId 对应的填入相应的项目信息。

Quick Start

  1. maven项目
curl https://flink.apache.org/q/quickstart-scala-SNAPSHOT.sh | bash -s 1.9.1 
  1. sbt项目
curl https://flink.apache.org/q/sbt-quickstart.sh | bash

构建Flink项目

Maven依赖

java项目


    
        org.apache.flink
        flink-java
        ${flink.version}
    
    
        org.apache.flink
        flink-streaming-java_2.11
        ${flink.version}
    
    
        org.apache.flink
        flink-clients_2.11
        ${flink.version}
    

scala项目

		
		
		
			org.apache.flink
			flink-scala_2.11
			${flink.version}
		
		
			org.apache.flink
			flink-streaming-scala_2.11
			${flink.version}
		

项目代码

java

package org.myorg.quickstart;

import org.apache.flink.api.common.functions.FlatMapFunction;
import org.apache.flink.streaming.api.datastream.DataStream;
import org.apache.flink.streaming.api.datastream.DataStreamSource;
import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment;
import org.apache.flink.streaming.api.windowing.time.Time;
import org.apache.flink.util.Collector;

/**
 * This is Description
 *
 * @author Jerome丶子木
 * @date 2019/12/09
 */
public class WordCount {
    public static void main(String[] args) throws Exception{

        if (args.length != 2){
            System.err.println("Usage:\nSocketTextStreamWordCount  ");
            return;
        }

        String hostname = args[0];
        Integer port = Integer.parseInt(args[1]);

        //设定执行环境设定
        StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();

        DataStreamSource stringDataStreamSource = env.socketTextStream(hostname, port);

        //对数据集执行转换操作逻辑
        DataStream windowCount = stringDataStreamSource.flatMap(new FlatMapFunction() {
            @Override
            public void flatMap(String value, Collector collector) throws Exception {
                String regex = "\\s";
                String[] splits = value.toLowerCase().split(regex);
                for (String word : splits) {
                    System.out.println(word);
                    collector.collect(new WordWithCount(word, 1L));
                }
            }
        })//打平操作,把每行单词转化为类型的数据
                .keyBy("word") //针对相同的word数据进行分组
                .timeWindow(Time.seconds(2),Time.seconds(1))//指定计算数据的窗口大小和滑动窗口大小
                .sum("count");

        //把数据打印到控制台
        windowCount.print()
                .setParallelism(1); //设置并行度1

        //flink是懒加载,所以必须使用execute方法,上面才会执行
        env.execute("WordCount");
    }

    public static class WordWithCount{
        public String word;
        public long count;
        public WordWithCount(){}

        public WordWithCount(String word, long count){
            this.word = word;
            this.count = count;
        }

        @Override
        public String toString(){
            StringBuilder res = new StringBuilder();
            res.append("WordWithCount{ word = '");
            res.append(word);
            res.append("' , count= ");
            res.append(count);
            res.append("} ;");
            return res.toString();
        }
    }

}


scala

import org.apache.flink.api.java.utils.ParameterTool
import org.apache.flink.streaming.api.scala.{DataStream, StreamExecutionEnvironment,_}


/**
  * This is Description
  *
  * @author Jerome丶子木
  * @date 2019/12/10
  */
object WordCount2 {

  def main(args: Array[String]): Unit = {

    val params = ParameterTool.fromArgs(args)
    //第一步: 设定执行环境设定
    val env = StreamExecutionEnvironment.getExecutionEnvironment

    //第二步: 指定数据源地址,读取输入数据
    val text = env.readTextFile("/Users/jerome/develop/test/text/text1.txt")

    //第三部: 对数据集指定转换操作逻辑
    val counts: DataStream[(String, Int)] = text
      .flatMap(_.toLowerCase.split(","))
      .filter(_.nonEmpty)
      .map((_, 1))//转换成tuple
      .keyBy(0)//按照第一个字段分区
      .sum(1)//对第二个字段求和

    if (params.has("output")){
      counts.writeAsText(params.get("output"))
    }else{
      println("Printing result to stdout . Use --output to specify output path. ")
      counts.print()
    }
    env.execute("Streaming WordCount")
  }
}

执行过程中问题

  1. 程序正常执行,但是没有输出

原因可能是端口占用,通过命令查看端口是否被占用

sudo lsof -i:9000
  1. 读取文件的中没有窗口函数,否则结果无输出
    注释掉时间窗口
//.timeWindow(Time.seconds(2),Time.seconds(1))//指定计算数据的窗口大小和滑动窗口大小
  1. scala直接写完之后,程序会报“could not find implicit value for evidence parameter of type TypeInformation” 的错误。

将TypeInfomation类隐式参数引入到当前程序中:

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

你可能感兴趣的:(Flink,flink)