Flink 入门级别代码 单词统计 Java版本和scala 版本(一)

单词批处理:

scala版本:

package liangde.tech

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


/**
  * Scala版本
  */

object BatchWordCountScala {

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

    val env = ExecutionEnvironment.getExecutionEnvironment

    val inputpath = "C:\\Users\\liangde.li\\IdeaProjects\\FlinkExample\\src\\test\\file"
    val outpath = "C:\\Users\\liangde.li\\IdeaProjects\\FlinkExample\\src\\test"

    val text  =env.readTextFile(inputpath)

    val count = text.flatMap(_.toLowerCase.split("\\W+"))
      .filter(_.nonEmpty)
      .map(w=>(w,1))
      .groupBy(0)
      .sum(1)

    count.writeAsCsv(outpath,"\n"," ", org.apache.flink.core.fs.FileSystem.WriteMode.OVERWRITE).setParallelism(1)
    env.execute("batch word count!")


  }
}

Java 版本:

package liangde.tech;

import org.apache.flink.api.common.functions.FlatMapFunction;
import org.apache.flink.api.java.DataSet;
import org.apache.flink.api.java.ExecutionEnvironment;
import org.apache.flink.api.java.operators.DataSource;
import org.apache.flink.api.java.tuple.Tuple2;
import org.apache.flink.util.Collector;


/**
 *
 */
public class BatchWordCountJava {
    public static void main(String[] args) throws Exception {

        //获取运行环境
        ExecutionEnvironment env = ExecutionEnvironment.getExecutionEnvironment();

        String inputpath = "C:\\Users\\liangde.li\\IdeaProjects\\FlinkExample\\src\\test\\file";
        String outpath = "C:\\Users\\liangde.li\\IdeaProjects\\FlinkExample\\src\\test";
        //读取本地文件
        DataSource<String> text =  env.readTextFile(inputpath);

        DataSet<Tuple2<String,Integer>> counts =  text.flatMap(new Tokenizer()).groupBy(0).sum(1);
        counts.writeAsCsv(outpath,"\n"," ",org.apache.flink.core.fs.FileSystem.WriteMode.OVERWRITE).setParallelism(1);
        env.execute("bath word count");

    }

    public static class Tokenizer implements FlatMapFunction<String, Tuple2<String,Integer>>{
        public void flatMap(String value, Collector<Tuple2<String, Integer>> out) throws Exception {
            String[] tokens = value.toLowerCase().split("\\W+");
            for(String token:tokens){
                if(token.length()>0){
                    out.collect(new Tuple2<String, Integer>(token,1));
                }
            }
        }
    }
}

注意创建环境用的是

ExecutionEnvironment 

返回类型用的是:

DataSet

 

流处理:

使用套接字socket来实现

scala 版本:

package liangde.tech



import org.apache.flink.api.java.utils.ParameterTool
import org.apache.flink.streaming.api.scala._
import org.apache.flink.streaming.api.windowing.time.Time


/**
  * 滑动窗口计算
  *
  * 每隔一秒最近2秒内的数据,打印到控制台
  *
  */


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

      //获取socket端口号
      val port:Int = try{
        ParameterTool.fromArgs(args).getInt("port")
      }catch {
        case e: Exception=>{
          System.err.println("No port set. Use default port 9000!")
        }
          9000
      }

       //获取运行环境
      val env: StreamExecutionEnvironment = StreamExecutionEnvironment.getExecutionEnvironment

      //链接socket获取输入数据
      val text =  env.socketTextStream("192.168.1.xx",port,'\n')

      import org.apache.flink.api.scala._
      //解析数据(数据扁平化),分组,窗口计算,并且聚合求sum
      val wordWithCount = text.flatMap(line => line.split("\\s")).map(w =>WordWithCount(w,1))
         .keyBy("word")//分组
         .timeWindow(Time.seconds(2),Time.seconds(1))//指定窗口大小,间隔时间
         //.sum("count");//sum 或者reduce 都行
         .reduce((a,b)=>WordWithCount(a.word,a.count+b.count));


        wordWithCount.print().setParallelism(1); //打印到控制台

       env.execute("Socket Window Count!")
  }

  case class WordWithCount(word:String,count:Long
  )

}

 

Java 版本:

package liangde.tech;

import org.apache.flink.api.common.functions.FlatMapFunction;
import org.apache.flink.api.common.functions.ReduceFunction;
import org.apache.flink.api.java.utils.ParameterTool;
import org.apache.flink.streaming.api.datastream.DataStream;
import org.apache.flink.streaming.api.datastream.DataStreamSink;
import org.apache.flink.streaming.api.datastream.DataStreamSource;
import org.apache.flink.streaming.api.datastream.SingleOutputStreamOperator;
import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment;
import org.apache.flink.streaming.api.windowing.time.Time;
import org.apache.flink.util.Collector;

/**
 * 滑动窗口计算
 * 通过socket模拟产生单词数据
 * flink对数据进行统计计算
 *
 * 需要实现每隔一秒对最近两秒内的数据进行汇总计算
 */

public class SocketWindowWordCountJava {

    public static void main(String[] args) throws Exception {
        // 获取需要的端口号
        int port;
        try {
            ParameterTool parameterTool = ParameterTool.fromArgs(args);
            port = parameterTool.getInt("port");
        }catch (Exception e){
            System.out.print("No port set .Use default port 9000");
            port = 9000;
        }


        //获取Flink的运行环境
        StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();

        String hostname = "192.168.1.35";
        String delimiter = "\n";
        //链接socket获取输入的数据
        DataStreamSource<String> text =  env.socketTextStream(hostname,port,delimiter);

        // a b c
        // a 1
        // b 1
        // c 1
        DataStream<WordWithCount> windowCounts = text.flatMap(new FlatMapFunction<String, WordWithCount>() {
            public void flatMap(String value, Collector<WordWithCount> out) throws Exception {
                String[] splits = value.split("\\s");
                for(String word:splits){
                    out.collect(new WordWithCount(word,1));
                }
            }
        }).keyBy("word")
                .timeWindow(Time.seconds(2),Time.seconds(1)) //指定时间窗口大小为
                .sum("count"); // 在这里使用sum或者reduce都可以
//                .reduce(new ReduceFunction<WordWithCount>() {
//                    public WordWithCount reduce(WordWithCount a, WordWithCount b) throws Exception {
//                        return  new WordWithCount(a.word,a.count+b.count);
//                    }
//                })
        //把数据打印到控制台并且设置并行度
        windowCounts.print().setParallelism(1);

        //这行代码一定要实现,否则程序不执行
        env.execute("Socket window count");
    }

    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(){
             return  "WordWithCount{" +
                     "word='" + word + '\''+
                     ",count =" + count +
                     '}';
        }

    }
}

 

注意这里的API 是:

StreamExecutionEnvironment

返回类型:

DataStream

 

流处理的时候,要在服务器端输入 nc -l 9000

然后此时就可以输入 words了

 

pom.xml 如下:

<?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>liangde.tech</groupId>
    <artifactId>FlinkExample</artifactId>
    <version>1.0-SNAPSHOT</version>

    <!-- https://mvnrepository.com/artifact/org.apache.flink/flink-java -->
    <dependencies>
        <dependency>
            <groupId>org.apache.flink</groupId>
            <artifactId>flink-java</artifactId>
            <version>1.6.1</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/org.apache.flink/flink-streaming-java -->
        <dependency>
            <groupId>org.apache.flink</groupId>
            <artifactId>flink-streaming-java_2.11</artifactId>
            <version>1.6.1</version>
            <!--<scope>provided</scope>-->
        </dependency>

        <!-- https://mvnrepository.com/artifact/org.apache.flink/flink-scala -->
        <dependency>
            <groupId>org.apache.flink</groupId>
            <artifactId>flink-scala_2.11</artifactId>
            <version>1.6.1</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.6.1</version>
        </dependency>

        <dependency>
            <groupId>org.scalatest</groupId>
            <artifactId>scalatest_2.11</artifactId>
            <version>2.2.4</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.scalamock</groupId>
            <artifactId>scalamock-scalatest-support_2.11</artifactId>
            <version>3.2</version>
            <scope>test</scope>
        </dependency>
    </dependencies>


</project>

 

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Apache Flink是一个流式处理框架,支持使用ScalaJava等多种语言进行编程。ScalaFlink主要支持的语言之一,目前Flink分别提供了Scala 2.11和Scala 2.12两个版本Scala 2.12是Scala 2.x系列的最新版本,它与之前的Scala 2.11相比,在语言特性、性能和库的兼容性方面都有所改进。具体来说,Scala 2.12相较于2.11版本有以下一些不同点: 1. 集合库的改进:Scala 2.12提供了一个全新的集合库(Collections Library),其中包含了许多新的集合类型,如ArrayOps、StringOps等。此外,还对现有集合类型进行了优化,提升了性能。 2. 可以使用Java 8中的新特性:Scala 2.12对Java 8的新特性提供了支持,包括Lambda表达式和方法引用等。 3. 二进制文件格式的改变:Scala 2.12使用了新的二进制文件格式,它支持Java 9中的新特性,并且与Java 8和Java 9之间的兼容性更好。 4. 性能提升:Scala 2.12通过一系列的优化,如编译器的改进和库的重构等,提升了运行时的性能。 总的来说,Scala 2.12相较于Scala 2.11更加先进和高效,但是由于二进制文件格式的改变,需要注意与之前版本的兼容性。在使用Flink时,可以根据具体的需求和环境选择合适的Scala版本。 ### 回答2: Flink是一个用于大规模流处理和批处理的开源分布式计算框架。主要用于处理实时数据流以及批量数据。Flink提供了Scala API,支持不同版本Scala语言,包括Scala 2.11和Scala 2.12。这两个版本在语言特性和兼容性方面有一些区别。 首先,Scala 2.12是Scala编程语言的较新版本,相较于Scala 2.11,Scala 2.12引入了一些新特性和改变。其中一个重要的变化是对Java 8中的新特性的更好支持,包括lambda表达式和函数式接口。因此,如果你打算在Flink中使用lambda表达式或函数式编程风格,可能会发现Scala 2.12更加方便。 另一个区别是在库和依赖方面的兼容性。Scala 2.11和Scala 2.12使用不同的二进制兼容模式,这意味着如果你使用某个库或依赖是针对Scala 2.11编译的,它可能与Scala 2.12不兼容。在Flink的生态系统中,有些库可能只提供Scala 2.11的版本,而对Scala 2.12的支持较为有限。因此,在选择Flink版本时,需要考虑到项目中的其他依赖,并确保它们与所选版本兼容。 总之,Scala 2.11和Scala 2.12两个版本在语言特性和兼容性方面存在一些区别。选择哪个版本取决于你的项目需求、代码库的兼容性以及个人偏好。 ### 回答3: Flink是一个开源的分布式实时计算框架,具有高效和灵活的特点。在Flink版本迭代过程中,Scala是其主要的编程语言之一,Scala 2.11版本Scala 2.12版本在使用上存在一些区别。 首先,Scala 2.12是Scala的一个最新版本,相对于Scala 2.11,它引入了一些新的特性和优化。比如,Scala 2.12对Java 8的支持更好,提供了更多有用的函数式编程特性。同时,Scala 2.12在编译速度和运行时性能方面也有一些优化,能够更好地支持Flink的大规模实时计算。 其次,由于Scala 2.12引入了一些语法上的改变,因此Flink的某些组件在Scala 2.11和Scala 2.12之间可能存在不兼容的情况。在使用Scala 2.12时,需要确保所使用的Flink版本兼容Scala 2.12,否则可能会出现编译或运行时的错误。 此外,由于Scala 2.12相对于Scala 2.11是一个较新的版本,目前在一些第三方库和组件的支持上可能不如Scala 2.11完善。因此,在选择使用哪个版本时,需要考虑到项目所依赖的其他库和组件是否支持Scala 2.12。 综上所述,Scala 2.11和Scala 2.12在Flink中主要区别在于语言特性、性能优化和兼容性方面。具体选择哪个版本取决于项目的需求和所依赖的其他库和组件的支持情况。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值